package com.alibaba.jstorm.task.master.timer; import java.util.Set; import backtype.storm.task.TopologyContext; import com.alibaba.jstorm.cluster.StormClusterState; import com.alibaba.jstorm.task.error.ErrorConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.jstorm.schedule.Assignment; import com.alibaba.jstorm.schedule.default_assign.ResourceWorkerSlot; import com.alibaba.jstorm.task.master.TMHandler; import com.alibaba.jstorm.task.master.TopologyMasterContext; public class WorkerSetUpdater implements TMHandler{ private static final Logger LOG = LoggerFactory.getLogger(WorkerSetUpdater.class); TopologyMasterContext tmContext; private StormClusterState zkCluster; private TopologyContext context; @Override public void init(TopologyMasterContext tmContext) { // TODO Auto-generated method stub this.tmContext = tmContext; this.zkCluster = tmContext.getZkCluster(); this.context = tmContext.getContext(); } @Override public void process(Object event) throws Exception { // TODO Auto-generated method stub try { Assignment assignment = tmContext.getZkCluster().assignment_info(tmContext.getTopologyId(), null); if (assignment != null) { Set<ResourceWorkerSlot> oldWorkerSet = tmContext.getWorkerSet().get(); Set<ResourceWorkerSlot> newWorkerSet = assignment.getWorkers(); if (oldWorkerSet.equals(newWorkerSet) == false) { LOG.info("Find worker slots has been changed, old:{}, \n\n new:{}", oldWorkerSet, newWorkerSet); tmContext.getWorkerSet().set(newWorkerSet); tmContext.getTopologyMetricContext().setWorkerSet(newWorkerSet); } } } catch (Exception e) { String errorInfo = "Failed to get assignment for " + tmContext.getTopologyId(); LOG.error(errorInfo + e); zkCluster.report_task_error(context.getTopologyId(), context.getThisTaskId(), errorInfo, ErrorConstants.WARN, ErrorConstants.CODE_USER); } } @Override public void cleanup() { // TODO Auto-generated method stub } }