public void start(ControllerMetrics controllerMetrics) { _controllerMetrics = controllerMetrics; LOGGER.info("Starting realtime segments manager, adding a listener on the property store table configs path."); String zkUrl = _pinotHelixResourceManager.getHelixZkURL(); _zkClient = new ZkClient(zkUrl, ZkClient.DEFAULT_SESSION_TIMEOUT, ZkClient.DEFAULT_CONNECTION_TIMEOUT); _zkClient.setZkSerializer(new ZNRecordSerializer()); _zkClient.waitUntilConnected(CommonConstants.Helix.ZkClient.DEFAULT_CONNECT_TIMEOUT_SEC, TimeUnit.SECONDS); // Subscribe to any data/child changes to property _zkClient.subscribeChildChanges(_tableConfigPath, this); _zkClient.subscribeDataChanges(_tableConfigPath, this); // Subscribe to leadership changes ControllerLeadershipManager.getInstance().subscribe(PinotLLCRealtimeSegmentManager.class.getName(), this); // Setup change listeners for already existing tables, if any. processPropertyStoreChange(_tableConfigPath); }
_zkClient.subscribeDataChanges(realtimeSegmentsPathForTable, this); _zkClient.subscribeChildChanges(realtimeSegmentsPathForTable, this); LOGGER.info("Setting data change watch for real-time segment currently being consumed: {}", segmentPath); _zkClient.subscribeDataChanges(segmentPath, this); } else { _zkClient.unsubscribeDataChanges(segmentPath, this);
/** * Subscribe to zookeeper data changes */ @Override public void subscribeDataChanges(String path, IZkDataListener listener) { _zkClient.subscribeDataChanges(path, listener); }
@Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { for (String child : currentChilds) { String childPath = parentPath.equals("/") ? parentPath + child : parentPath + "/" + child; _zkClient.subscribeDataChanges(childPath, this); } boolean result = _verifier.verify(); if (result == true) { _countDown.countDown(); } } }
@Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { for (String child : currentChilds) { String childPath = String.format("%s/%s", parentPath, child); _zkclient.subscribeDataChanges(childPath, this); } boolean success = verify(); if (success) { _countdown.countDown(); } }
@Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { for (String child : currentChilds) { String childPath = String.format("%s/%s", parentPath, child); _zkClient.subscribeDataChanges(childPath, this); } if (!_verifyTaskThreadPool.isShutdown()) { _verifyTaskThreadPool.submit(new VerifyStateCallbackTask()); } }
private void subscribeDataChange(String path, NotificationContext.Type callbackType) { if (callbackType == NotificationContext.Type.INIT || callbackType == NotificationContext.Type.CALLBACK) { if (logger.isDebugEnabled()) { logger.debug( _manager.getInstanceName() + " subscribe data-change. path: " + path + ", listener: " + _listener); } _zkClient.subscribeDataChanges(path, this); } else if (callbackType == NotificationContext.Type.FINALIZE) { logger.info( _manager.getInstanceName() + " unsubscribe data-change. path: " + path + ", listener: " + _listener); _zkClient.unsubscribeDataChanges(path, this); } }
private void subscribeTrigger(ClusterVerifyTrigger trigger) { String path = trigger.getTriggerKey().getPath(); if (trigger.isTriggerOnDataChange()) { _zkClient.subscribeDataChanges(path, this); } if (trigger.isTriggerOnChildChange()) { _zkClient.subscribeChildChanges(path, this); } if (trigger.isTriggerOnChildDataChange()) { List<String> childs = _zkClient.getChildren(path); for (String child : childs) { String childPath = String.format("%s/%s", path, child); _zkClient.subscribeDataChanges(childPath, this); } } }
public boolean verifyByCallback(long timeout, List<ClusterVerifyTrigger> triggers) { _countdown = new CountDownLatch(1); for (ClusterVerifyTrigger trigger : triggers) { String path = trigger._triggerKey.getPath(); _zkclient.subscribeChildChanges(path, this); if (trigger._triggerOnChildDataChange) { List<String> childs = _zkclient.getChildren(path); for (String child : childs) { String childPath = String.format("%s/%s", path, child); _zkclient.subscribeDataChanges(childPath, this); } } } boolean success = false; try { success = verify(); if (!success) { success = _countdown.await(timeout, TimeUnit.MILLISECONDS); if (!success) { // make a final try if timeout success = verify(); } } } catch (Exception e) { LOG.error("Exception in verifier", e); } // clean up _zkclient.unsubscribeAll(); return success; }
for (String child : zkClient.getChildren(extViewPath)) { String childPath = extViewPath.equals("/") ? extViewPath + child : extViewPath + "/" + child; zkClient.subscribeDataChanges(childPath, listener);
@Test public void testCloseZkClientInZkClientEventThread() throws Exception { String className = TestHelper.getTestClassName(); String methodName = TestHelper.getTestMethodName(); String clusterName = className + "_" + methodName; System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); final CountDownLatch waitCallback = new CountDownLatch(1); final ZkClient client = new ZkClient(ZK_ADDR, HelixZkClient.DEFAULT_SESSION_TIMEOUT, HelixZkClient.DEFAULT_CONNECTION_TIMEOUT, new ZNRecordSerializer()); String path = String.format("/%s", clusterName); client.createEphemeral(path); client.subscribeDataChanges(path, new IZkDataListener() { @Override public void handleDataDeleted(String dataPath) throws Exception { } @Override public void handleDataChange(String dataPath, Object data) throws Exception { client.close(); waitCallback.countDown(); } }); client.writeData(path, new ZNRecord("test")); waitCallback.await(); Assert.assertFalse(_gZkClient.exists(path), "Ephemeral node: " + path + " should be removed after ZkClient#close() in its own event-thread"); System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }
zkClient.subscribeDataChanges(TEST_PATH, new IZkDataListener() { @Override public void handleDataChange(String dataPath, Object data) throws Exception {
client.subscribeDataChanges(path, listener); client.subscribeChildChanges(path, listener);
client.subscribeDataChanges(path, listener); client.subscribeChildChanges(path, listener);