package org.act.tstream.daemon.supervisor;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import org.act.tstream.callback.RunnableCallback;
import org.apache.log4j.Logger;
import backtype.storm.Config;
import org.act.tstream.client.ConfigExtension;
import org.act.tstream.cluster.StormClusterState;
import org.act.tstream.cluster.StormConfig;
import org.act.tstream.utils.JStormUtils;
import org.act.tstream.utils.NetWorkUtils;
import org.act.tstream.utils.TimeUtils;
import org.act.tstream.utils.JStormServerUtils;
/**
* supervisor Heartbeat, just write SupervisorInfo to ZK
*/
class Heartbeat extends RunnableCallback {
private static Logger LOG = Logger.getLogger(Heartbeat.class);
private static final int CPU_THREADHOLD = 4;
private static final long MEM_THREADHOLD = 8 * JStormUtils.SIZE_1_G;
private Map<Object, Object> conf;
private StormClusterState stormClusterState;
private String supervisorId;
private String myHostName;
private final int startTime;
private final int frequence;
private SupervisorInfo supervisorInfo;
/**
* @param conf
* @param stormClusterState
* @param supervisorId
* @param myHostName
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public Heartbeat(Map conf, StormClusterState stormClusterState,
String supervisorId, AtomicBoolean active) {
String myHostName = JStormServerUtils.getHostName(conf);
this.stormClusterState = stormClusterState;
this.supervisorId = supervisorId;
this.conf = conf;
this.myHostName = myHostName;
this.startTime = TimeUtils.current_time_secs();
this.active = active;
this.frequence = JStormUtils.parseInt(conf
.get(Config.SUPERVISOR_HEARTBEAT_FREQUENCY_SECS));
initSupervisorInfo(conf);
}
private void initSupervisorInfo(Map conf) {
List<Integer> portList = (List<Integer>) conf
.get(Config.SUPERVISOR_SLOTS_PORTS);
if (!StormConfig.local_mode(conf)) {
Set<Integer> ports = JStormUtils.listToSet(portList);
supervisorInfo = new SupervisorInfo(myHostName, supervisorId, ports);
} else {
Set<Integer> ports = JStormUtils.listToSet(portList.subList(0, 1));
supervisorInfo = new SupervisorInfo(myHostName, supervisorId, ports);
}
}
@SuppressWarnings("unchecked")
public void update() {
supervisorInfo.setTimeSecs(TimeUtils.current_time_secs());
supervisorInfo
.setUptimeSecs((int) (TimeUtils.current_time_secs() - startTime));
try {
stormClusterState
.supervisor_heartbeat(supervisorId, supervisorInfo);
} catch (Exception e) {
LOG.error("Failed to update SupervisorInfo to ZK", e);
}
}
private AtomicBoolean active = null;
private Integer result;
@Override
public Object getResult() {
return result;
}
@Override
public void run() {
update();
if (active.get()) {
result = frequence;
} else {
result = -1;
}
}
public int getStartTime() {
return startTime;
}
public SupervisorInfo getSupervisorInfo() {
return supervisorInfo;
}
}