void resetHandlers(boolean isShutdown) { synchronized (this) { if (_handlers != null) { // get a copy of the list and iterate over the copy list // in case handler.reset() modify the original handler list List<CallbackHandler> tmpHandlers = new ArrayList<>(); tmpHandlers.addAll(_handlers); for (CallbackHandler handler : tmpHandlers) { handler.reset(isShutdown); LOG.info("reset handler: " + handler.getPath() + ", " + handler.getListener()); } } } }
void addListener(Object listener, PropertyKey propertyKey, ChangeType changeType, EventType[] eventType) { checkConnected(_waitForConnectedTimeout); PropertyType type = propertyKey.getType(); synchronized (this) { for (CallbackHandler handler : _handlers) { // compare property-key path and listener reference if (handler.getPath().equals(propertyKey.getPath()) && handler.getListener().equals(listener)) { LOG.info("Listener: " + listener + " on path: " + propertyKey.getPath() + " already exists. skip add"); return; } } CallbackHandler newHandler = new CallbackHandler(this, _zkclient, propertyKey, listener, eventType, changeType, _callbackMonitors.get(changeType)); _handlers.add(newHandler); LOG.info("Added listener: " + listener + " for type: " + type + " to path: " + newHandler.getPath()); } }
void initHandlers(List<CallbackHandler> handlers) { synchronized (this) { if (handlers != null) { for (CallbackHandler handler : handlers) { handler.init(); LOG.info("init handler: " + handler.getPath() + ", " + handler.getListener()); } } } }
void handleNewSessionAsController() { if (_leaderElectionHandler != null) { _leaderElectionHandler.init(); } else { _leaderElectionHandler = new CallbackHandler(this, _zkclient, _keyBuilder.controller(), new DistributedLeaderElection(this, _controller, _controllerTimerTasks), new EventType[] { EventType.NodeChildrenChanged, EventType.NodeDeleted, EventType.NodeCreated }, ChangeType.CONTROLLER, _callbackMonitors.get(ChangeType.CONTROLLER)); } }
public static String printHandlers(ZkTestManager manager) { StringBuilder sb = new StringBuilder(); List<CallbackHandler> handlers = manager.getHandlers(); sb.append(manager.getInstanceName() + " has " + handlers.size() + " cb-handlers. ["); for (int i = 0; i < handlers.size(); i++) { CallbackHandler handler = handlers.get(i); String path = handler.getPath(); sb.append(path.substring(manager.getClusterName().length() + 1) + ": " + handler.getListener()); if (i < (handlers.size() - 1)) { sb.append(", "); } } sb.append("]"); return sb.toString(); }
/** * Invoke the listener so that it sets up the initial values from the zookeeper if any * exists */ public void init() { logger.info("initializing CallbackHandler: " + this.toString() + " content: " + getContent()); if (_batchModeEnabled) { synchronized (this) { if (_batchCallbackProcessor != null) { _batchCallbackProcessor.resetEventQueue(); } else { _batchCallbackProcessor = new CallbackProcessor(this); _batchCallbackProcessor.start(); } } } updateNotificationTime(System.nanoTime()); try { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.INIT); changeContext.setChangeType(_changeType); _ready = true; invoke(changeContext); } catch (Exception e) { String msg = "Exception while invoking init callback for listener:" + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
@Override public void handleChildChange(String parentPath, List<String> currentChilds) { if (logger.isDebugEnabled()) { logger.debug("Data change callback: child changed, path: {} , current child count: {}", parentPath, currentChilds == null ? 0 : currentChilds.size()); } try { updateNotificationTime(System.nanoTime()); if (parentPath != null && parentPath.startsWith(_path)) { if (currentChilds == null && parentPath.equals(_path)) { // _path has been removed, remove this listener // removeListener will call handler.reset(), which in turn call invoke() on FINALIZE type _manager.removeListener(_propertyKey, _listener); } else { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.CALLBACK); changeContext.setPathChanged(parentPath); changeContext.setChangeType(_changeType); subscribeForChanges(changeContext.getType(), _path, _watchChild); enqueueTask(changeContext); } } } catch (Exception e) { String msg = "exception in handling child-change. instance: " + _manager.getInstanceName() + ", parentPath: " + parentPath + ", listener: " + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
subscribeForChanges(changeContext.getType(), _path, _watchChild); } else { subscribeForChangesAsyn(changeContext.getType(), _path, _watchChild); List<IdealState> idealStates = preFetch(_propertyKey); idealStateChangeListener.onIdealStateChange(idealStates, changeContext); } else if (_changeType == INSTANCE_CONFIG) { if (_listener instanceof ConfigChangeListener) { ConfigChangeListener configChangeListener = (ConfigChangeListener) _listener; List<InstanceConfig> configs = preFetch(_propertyKey); configChangeListener.onConfigChange(configs, changeContext); } else if (_listener instanceof InstanceConfigChangeListener) { InstanceConfigChangeListener listener = (InstanceConfigChangeListener) _listener; List<InstanceConfig> configs = preFetch(_propertyKey); listener.onInstanceConfigChange(configs, changeContext); List<ResourceConfig> configs = preFetch(_propertyKey); listener.onResourceConfigChange(configs, changeContext); List<HelixProperty> configs = preFetch(_propertyKey); listener.onConfigChange(configs, changeContext); List<LiveInstance> liveInstances = preFetch(_propertyKey); liveInstanceChangeListener.onLiveInstanceChange(liveInstances, changeContext); CurrentStateChangeListener currentStateChangeListener = (CurrentStateChangeListener) _listener; String instanceName = PropertyPathConfig.getInstanceNameFromPath(_path); List<CurrentState> currentStates = preFetch(_propertyKey);
public void enqueueTask(NotificationContext changeContext) throws Exception { //async mode only applicable to CALLBACK from ZK, During INIT and FINALIZE invoke the callback's immediately. if (_batchModeEnabled && changeContext.getType() == NotificationContext.Type.CALLBACK) { logger.debug("Enqueuing callback"); if (!isReady()) { logger.info( "CallbackHandler is not ready, ignore change callback from path: " + _path + ", for listener: " + _listener); } else { _batchCallbackProcessor.queueEvent(changeContext.getType(), changeContext); } } else { invoke(changeContext); } if (_monitor != null) { _monitor.increaseCallbackUnbatchedCounters(); } }
@Override public void handleDataChange(String dataPath, Object data) { if (logger.isDebugEnabled()) { logger.debug("Data change callback: paths changed: " + dataPath); } try { updateNotificationTime(System.nanoTime()); if (dataPath != null && dataPath.startsWith(_path)) { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.CALLBACK); changeContext.setPathChanged(dataPath); changeContext.setChangeType(_changeType); enqueueTask(changeContext); } } catch (Exception e) { String msg = "exception in handling data-change. path: " + dataPath + ", listener: " + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
public static void printZkListeners(HelixZkClient client) throws Exception { Map<String, Set<IZkDataListener>> datalisteners = ZkTestHelper.getZkDataListener(client); Map<String, Set<IZkChildListener>> childListeners = ZkTestHelper.getZkChildListener(client); System.out.println("dataListeners {"); for (String path : datalisteners.keySet()) { System.out.println("\t" + path + ": "); Set<IZkDataListener> set = datalisteners.get(path); for (IZkDataListener listener : set) { CallbackHandler handler = (CallbackHandler) listener; System.out.println("\t\t" + handler.getListener()); } } System.out.println("}"); System.out.println("childListeners {"); for (String path : childListeners.keySet()) { System.out.println("\t" + path + ": "); Set<IZkChildListener> set = childListeners.get(path); for (IZkChildListener listener : set) { CallbackHandler handler = (CallbackHandler) listener; System.out.println("\t\t" + handler.getListener()); } } System.out.println("}"); } }
public CallbackHandler(HelixManager manager, ZkClient client, PropertyKey propertyKey, Object listener, EventType[] eventTypes, ChangeType changeType, HelixCallbackMonitor monitor) { if (listener == null) { throw new HelixException("listener could not be null"); } if (monitor != null && !monitor.getChangeType().equals(changeType)) { throw new HelixException( "The specified callback monitor is for different change type: " + monitor.getChangeType() .name()); } _manager = manager; _accessor = manager.getHelixDataAccessor(); _zkClient = client; _propertyKey = propertyKey; _path = propertyKey.getPath(); _listener = listener; _eventTypes = new HashSet<>(Arrays.asList(eventTypes)); _changeType = changeType; _lastNotificationTimeStamp = new AtomicLong(System.nanoTime()); _monitor = monitor; if (_changeType == MESSAGE || _changeType == MESSAGES_CONTROLLER || _changeType == CONTROLLER) { _watchChild = false; } else { _watchChild = true; } parseListenerProperties(); init(); }
boolean checkHandlers(List<CallbackHandler> handlers, String path) { // System.out.println(handlers.size() + " handlers: "); for (CallbackHandler handler : handlers) { // System.out.println(handler.getPath()); if (handler.getPath().equals(path)) { return true; } } return false; }
@Override protected void handleEvent(NotificationContext event) { try { _handler.invoke(event); } catch (Exception e) { logger.warn("Exception in callback processing thread. Skipping callback", e); } } }
@Override protected void handleEvent(SubscribeChangeEvent event) { logger.info("Resubscribe change listener to path: " + event.path + ", for listener: " + event.listener + ", watchChild: " + event.watchChild); try { if (event.handler.isReady()) { event.handler.subscribeForChanges(event.callbackType, event.path, event.watchChild); } else { logger.info( "CallbackHandler is not ready, stop subscribing changes listener to path: " + event.path + ", for listener: " + event.listener + ", watchChild: " + event.watchChild); } } catch (Exception e) { logger.error("Failed to resubscribe change to path: " + event.path + " for listener " + event.listener, e); } } };
static String printHandlers(ZkTestManager manager) { StringBuilder sb = new StringBuilder(); List<CallbackHandler> handlers = manager.getHandlers(); sb.append(manager.getInstanceName() + " has " + handlers.size() + " cb-handlers. ["); for (int i = 0; i < handlers.size(); i++) { CallbackHandler handler = handlers.get(i); String path = handler.getPath(); sb.append(path.substring(manager.getClusterName().length() + 1) + ": " + handler.getListener()); if (i < (handlers.size() - 1)) { sb.append(", "); } } sb.append("]"); return sb.toString(); }
/** * Invoke the listener so that it sets up the initial values from the zookeeper if any * exists */ public void init() { logger.info("initializing CallbackHandler: " + this.toString() + " content: " + getContent()); if (_batchModeEnabled) { if (_batchCallbackProcessor != null) { _batchCallbackProcessor.shutdown(); } _batchCallbackProcessor = new CallbackProcessor(this); _batchCallbackProcessor.start(); } updateNotificationTime(System.nanoTime()); try { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.INIT); changeContext.setChangeType(_changeType); _ready = true; invoke(changeContext); } catch (Exception e) { String msg = "Exception while invoking init callback for listener:" + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
@Override public void handleChildChange(String parentPath, List<String> currentChilds) { if (logger.isDebugEnabled()) { logger.debug("Data change callback: child changed, path: {} , current child count: {}", parentPath, currentChilds == null ? 0 : currentChilds.size()); } try { updateNotificationTime(System.nanoTime()); if (parentPath != null && parentPath.startsWith(_path)) { if (currentChilds == null && parentPath.equals(_path)) { // _path has been removed, remove this listener // removeListener will call handler.reset(), which in turn call invoke() on FINALIZE type _manager.removeListener(_propertyKey, _listener); } else { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.CALLBACK); changeContext.setPathChanged(parentPath); changeContext.setChangeType(_changeType); subscribeForChanges(changeContext.getType(), _path, _watchChild); enqueueTask(changeContext); } } } catch (Exception e) { String msg = "exception in handling child-change. instance: " + _manager.getInstanceName() + ", parentPath: " + parentPath + ", listener: " + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
subscribeForChanges(changeContext.getType(), _path, _watchChild); } else { subscribeForChangesAsyn(changeContext.getType(), _path, _watchChild); List<IdealState> idealStates = preFetch(_propertyKey); idealStateChangeListener.onIdealStateChange(idealStates, changeContext); } else if (_changeType == INSTANCE_CONFIG) { if (_listener instanceof ConfigChangeListener) { ConfigChangeListener configChangeListener = (ConfigChangeListener) _listener; List<InstanceConfig> configs = preFetch(_propertyKey); configChangeListener.onConfigChange(configs, changeContext); } else if (_listener instanceof InstanceConfigChangeListener) { InstanceConfigChangeListener listener = (InstanceConfigChangeListener) _listener; List<InstanceConfig> configs = preFetch(_propertyKey); listener.onInstanceConfigChange(configs, changeContext); List<ResourceConfig> configs = preFetch(_propertyKey); listener.onResourceConfigChange(configs, changeContext); List<HelixProperty> configs = preFetch(_propertyKey); listener.onConfigChange(configs, changeContext); List<LiveInstance> liveInstances = preFetch(_propertyKey); liveInstanceChangeListener.onLiveInstanceChange(liveInstances, changeContext); CurrentStateChangeListener currentStateChangeListener = (CurrentStateChangeListener) _listener; String instanceName = PropertyPathConfig.getInstanceNameFromPath(_path); List<CurrentState> currentStates = preFetch(_propertyKey);
void handleNewSessionAsController() { if (_leaderElectionHandler != null) { _leaderElectionHandler.init(); } else { _leaderElectionHandler = new CallbackHandler(this, _zkclient, _keyBuilder.controller(), new DistributedLeaderElection(this, _controller, _controllerTimerTasks), new EventType[] { EventType.NodeChildrenChanged, EventType.NodeDeleted, EventType.NodeCreated }, ChangeType.CONTROLLER, _callbackMonitors.get(ChangeType.CONTROLLER)); } }