package org.act.tstream.daemon.nimbus; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.commons.lang.StringUtils; import backtype.storm.generated.ThriftResourceType; import backtype.storm.scheduler.INimbus; import backtype.storm.utils.TimeCacheMap; import org.act.tstream.client.ConfigExtension; import org.act.tstream.cluster.Cluster; import org.act.tstream.cluster.StormClusterState; import org.act.tstream.cluster.StormConfig; import org.act.tstream.task.TkHbCacheTime; import org.act.tstream.utils.TimeUtils; /** * All nimbus data * */ public class NimbusData { private Map<Object, Object> conf; private StormClusterState stormClusterState; // Map<topologyId, Map<taskid, TkHbCacheTime>> private ConcurrentHashMap<String, Map<Integer, TkHbCacheTime>> taskHeartbeatsCache; // TODO two kind of value:Channel/BufferFileInputStream private TimeCacheMap<Object, Object> downloaders; private TimeCacheMap<Object, Object> uploaders; private int startTime; private final ScheduledExecutorService scheduExec; private AtomicInteger submittedCount; private Object submitLock = new Object(); private StatusTransition statusTransition; private static final int SCHEDULE_THREAD_NUM = 8; private final INimbus inimubs; private Map<String, Map<String, Map<ThriftResourceType, Integer>>> groupToTopology; private Map<String, Map<ThriftResourceType, Integer>> groupToResource; private Map<String, Map<ThriftResourceType, Integer>> groupToUsedResource; private final boolean localMode; private volatile boolean isLeader; @SuppressWarnings({ "unchecked", "rawtypes" }) public NimbusData(Map conf, TimeCacheMap<Object, Object> downloaders, TimeCacheMap<Object, Object> uploaders, INimbus inimbus) throws Exception { this.conf = conf; this.downloaders = downloaders; this.uploaders = uploaders; this.submittedCount = new AtomicInteger(0); this.stormClusterState = Cluster.mk_storm_cluster_state(conf); this.taskHeartbeatsCache = new ConcurrentHashMap<String, Map<Integer, TkHbCacheTime>>(); this.scheduExec = Executors.newScheduledThreadPool(SCHEDULE_THREAD_NUM); this.statusTransition = new StatusTransition(this); this.startTime = TimeUtils.current_time_secs(); this.inimubs = inimbus; this.groupToTopology = new HashMap<String, Map<String, Map<ThriftResourceType, Integer>>>(); this.groupToResource = new ConcurrentHashMap<String, Map<ThriftResourceType, Integer>>(); this.groupToUsedResource = new ConcurrentHashMap<String, Map<ThriftResourceType, Integer>>(); new ReentrantLock(); localMode = StormConfig.local_mode(conf); } /** * Just for test */ public NimbusData() { scheduExec = Executors.newScheduledThreadPool(6); inimubs = null; conf = new HashMap<Object, Object>(); localMode = false; } public int uptime() { return (TimeUtils.current_time_secs() - startTime); } public Map<Object, Object> getConf() { return conf; } public void setConf(Map<Object, Object> conf) { this.conf = conf; } public StormClusterState getStormClusterState() { return stormClusterState; } public void setStormClusterState(StormClusterState stormClusterState) { this.stormClusterState = stormClusterState; } public ConcurrentHashMap<String, Map<Integer, TkHbCacheTime>> getTaskHeartbeatsCache() { return taskHeartbeatsCache; } public void setTaskHeartbeatsCache( ConcurrentHashMap<String, Map<Integer, TkHbCacheTime>> taskHeartbeatsCache) { this.taskHeartbeatsCache = taskHeartbeatsCache; } public TimeCacheMap<Object, Object> getDownloaders() { return downloaders; } public void setDownloaders(TimeCacheMap<Object, Object> downloaders) { this.downloaders = downloaders; } public TimeCacheMap<Object, Object> getUploaders() { return uploaders; } public void setUploaders(TimeCacheMap<Object, Object> uploaders) { this.uploaders = uploaders; } public int getStartTime() { return startTime; } public void setStartTime(int startTime) { this.startTime = startTime; } public AtomicInteger getSubmittedCount() { return submittedCount; } public void setSubmittedCount(AtomicInteger submittedCount) { this.submittedCount = submittedCount; } public Object getSubmitLock() { return submitLock; } public ScheduledExecutorService getScheduExec() { return scheduExec; } public StatusTransition getStatusTransition() { return statusTransition; } public void cleanup() { try { stormClusterState.disconnect(); } catch (Exception e) { // TODO Auto-generated catch block } scheduExec.shutdown(); } public INimbus getInimubs() { return inimubs; } public Map<String, Map<ThriftResourceType, Integer>> getGroupToResource() { return groupToResource; } public Map<String, Map<String, Map<ThriftResourceType, Integer>>> getGroupToTopology() { return groupToTopology; } public Map<String, Map<ThriftResourceType, Integer>> getGroupToUsedResource() { return groupToUsedResource; } public boolean isLocalMode() { return localMode; } public boolean isLeader() { return isLeader; } public void setLeader(boolean isLeader) { this.isLeader = isLeader; } }