@Override public void run() { HelixManager helixManager = _notificationContext.getManager(); HelixDataAccessor helixDataAccessor = helixManager.getHelixDataAccessor(); HelixProperty helixProperty = helixDataAccessor .getProperty(_message.getKey(helixDataAccessor.keyBuilder(), helixManager.getInstanceName())); // The absence of the shutdown message indicates it has been removed if (helixProperty == null) { eventBus.post(new ClusterManagerShutdownRequest()); } } }, 0, 1, TimeUnit.SECONDS);
@Override public void onLiveInstanceChange(List<LiveInstance> liveInstances, NotificationContext changeContext) { if (changeContext.getType() != NotificationContext.Type.FINALIZE) { refreshCache(); } } };
/** * Clone a new Notification context from existing one. Map contents are * not recursively deep copied. * * @return new copy of NotificationContext */ public NotificationContext clone() { NotificationContext copy = new NotificationContext(_manager); copy.setType(_type); copy.setChangeType(_changeType); copy.setPathChanged(_pathChanged); copy.setEventName(_eventName); copy.setCreationTime(_creationTime); copy._map.putAll(_map); return copy; }
@Override public void onCallback(NotificationContext context) { HelixManager manager = context.getManager(); Type type = context.getType(); _isCallbackInvoked = true; // System.out.println(type + ": TestCallback invoked on " + manager.getInstanceName()); }
@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); } }
private void forceRebalance(HelixManager manager, ClusterEventType eventType) { NotificationContext changeContext = new NotificationContext(manager); changeContext.setType(NotificationContext.Type.CALLBACK); String uid = UUID.randomUUID().toString().substring(0, 8); ClusterEvent event = new ClusterEvent(_clusterName, eventType, uid); event.addAttribute(AttributeName.helixmanager.name(), changeContext.getManager()); event.addAttribute(AttributeName.changeContext.name(), changeContext); event.addAttribute(AttributeName.eventData.name(), new ArrayList<>()); event.addAttribute(AttributeName.AsyncFIFOWorkerPool.name(), _asyncFIFOWorkerPool); _taskEventQueue.put(event); _eventQueue.put(event.clone(uid)); logger.info(String .format("Controller rebalance event triggered with event type: %s for cluster %s", eventType, _clusterName)); }
public void onMessage(String instanceName, List<Message> messages, NotificationContext changeContext) { HelixManager manager = changeContext.getManager(); if (changeContext.getType() == Type.FINALIZE) { reset(); return; if (changeContext.getType() == Type.INIT) { init(); messages = readNewMessagesFromZK(manager, instanceName, changeContext.getChangeType()); NotificationContext msgWorkingContext = changeContext.clone(); try { MessageHandler createHandler = createMessageHandler(message, msgWorkingContext);
public void queueEvent(NotificationContext context, ClusterEventType eventType, HelixConstants.ChangeType changeType) { ClusterEvent event = new ClusterEvent(_clusterName, eventType); if (context == null || context.getType() != NotificationContext.Type.CALLBACK || context.getType() == NotificationContext.Type.PERIODIC_REFRESH) { _dataCache.requireFullRefresh(); } else { _dataCache.notifyDataChange(changeType, context.getPathChanged()); } // Null check for manager in the following line is done in handleEvent() event.addAttribute(AttributeName.helixmanager.name(), context.getManager()); event.addAttribute(AttributeName.changeContext.name(), context); queueEvent(event); _monitor.increaseCallbackCounters(_eventQueue.size()); } }
@Override public void run() { try { if (_clusterEventType.equals(ClusterEventType.PeriodicalRebalance)) { _cache.requireFullRefresh(); _taskCache.requireFullRefresh(); _cache.refresh(_manager.getHelixDataAccessor()); if (_cache.getLiveInstances() != null) { NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.CALLBACK); synchronized (_manager) { checkLiveInstancesObservation(new ArrayList<>(_cache.getLiveInstances().values()), changeContext); } } } forceRebalance(_manager, _clusterEventType); } catch (Throwable ex) { logger.error("Time task failed. Rebalance task type: " + _clusterEventType + ", cluster: " + _clusterName, ex); } } }
NotificationContext changeContext = new NotificationContext(manager); changeContext.setChangeType(HelixConstants.ChangeType.MESSAGE);
/** * Invoke the listener for the last time so that the listener could clean up resources */ public void reset() { logger.info("Resetting CallbackHandler: " + this.toString()); try { _ready = false; if (_batchCallbackProcessor != null) { _batchCallbackProcessor.shutdown(); } NotificationContext changeContext = new NotificationContext(_manager); changeContext.setType(NotificationContext.Type.FINALIZE); changeContext.setChangeType(_changeType); invoke(changeContext); } catch (Exception e) { String msg = "Exception while resetting the listener:" + _listener; ZKExceptionHandler.getInstance().handle(msg, e); } }
changeContext = new NotificationContext(manager);
private void notifyCaches(NotificationContext context, ChangeType changeType) { if (context == null || context.getType() != Type.CALLBACK) { _cache.requireFullRefresh(); _taskCache.requireFullRefresh(); } else { _cache.notifyDataChange(changeType, context.getPathChanged()); _taskCache.notifyDataChange(changeType, context.getPathChanged()); } }
if (context.getType() == Type.FINALIZE) { stopRebalancingTimers(); logger.info("Get FINALIZE notification, skip the pipeline. Event :" + event.getEventType()); StringBuilder sb = new StringBuilder(); if (notificationContext != null) { zkCallbackTime = notificationContext.getCreationTime(); if (_isMonitoring) { _clusterStatusMonitor
@Override public synchronized void onControllerChange(NotificationContext changeContext) { ControllerManagerHelper controllerHelper = new ControllerManagerHelper(_manager, _controllerTimerTasks); try { switch (changeContext.getType()) { case INIT: case CALLBACK: acquireLeadership(_manager, controllerHelper); break; case FINALIZE: relinquishLeadership(_manager, controllerHelper); break; default: LOG.info("Ignore controller change event {}. Type {}.", changeContext.getEventName(), changeContext.getType().name()); } } catch (Exception e) { LOG.error("Exception when trying to become leader", e); } }
@Override @PreFetch(enabled = false) public void onIdealStateChange(List<IdealState> idealStates, NotificationContext changeContext) { logger.info( "START: Generic GenericClusterController.onIdealStateChange() for cluster " + _clusterName); notifyCaches(changeContext, ChangeType.IDEAL_STATE); pushToEventQueues(ClusterEventType.IdealStateChange, changeContext, Collections.<String, Object>emptyMap()); if (changeContext.getType() != Type.FINALIZE) { checkRebalancingTimer(changeContext.getManager(), idealStates, _cache.getClusterConfig()); } logger.info("END: GenericClusterController.onIdealStateChange() for cluster " + _clusterName); }
@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); } }
private void forceRebalance(HelixManager manager, ClusterEventType eventType) { NotificationContext changeContext = new NotificationContext(manager); changeContext.setType(NotificationContext.Type.CALLBACK); ClusterEvent event = new ClusterEvent(_clusterName, eventType); event.addAttribute(AttributeName.helixmanager.name(), changeContext.getManager()); event.addAttribute(AttributeName.changeContext.name(), changeContext); event.addAttribute(AttributeName.eventData.name(), new ArrayList<>()); event.addAttribute(AttributeName.AsyncFIFOWorkerPool.name(), _asyncFIFOWorkerPool); _taskEventQueue.put(event); _eventQueue.put(event); logger.info("Controller rebalance event triggered with event type: " + eventType); }
public void onMessage(String instanceName, List<Message> messages, NotificationContext changeContext) { HelixManager manager = changeContext.getManager(); if (changeContext.getType() == Type.FINALIZE) { reset(); return; if (changeContext.getType() == Type.INIT) { init(); messages = readNewMessagesFromZK(manager, instanceName, changeContext.getChangeType()); NotificationContext msgWorkingContext = changeContext.clone(); try { MessageHandler createHandler = createMessageHandler(message, msgWorkingContext);
public void queueEvent(NotificationContext context, ClusterEventType eventType, HelixConstants.ChangeType changeType) { ClusterEvent event = new ClusterEvent(_clusterName, eventType); if (context == null || context.getType() != NotificationContext.Type.CALLBACK || context.getType() == NotificationContext.Type.PERIODIC_REFRESH) { _dataCache.requireFullRefresh(); } else { _dataCache.notifyDataChange(changeType, context.getPathChanged()); } // Null check for manager in the following line is done in handleEvent() event.addAttribute(AttributeName.helixmanager.name(), context.getManager()); event.addAttribute(AttributeName.changeContext.name(), context); queueEvent(event); _monitor.increaseCallbackCounters(_eventQueue.size()); } }