package org.apache.mesos.hbase.state;
import com.google.inject.Inject;
import org.apache.commons.lang.time.DateUtils;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.mesos.hbase.config.HBaseFrameworkConfig;
import static org.apache.mesos.hbase.util.NodeTypes.*;
/**
* Manages the timeout timestamps for each node type.
*/
public class DeadNodeTracker
{
private Map<String, Timestamp> timestampMap;
private String[] nodes = {
MASTERNODES_KEY, SLAVENODES_KEY};
private HBaseFrameworkConfig hbaseFrameworkConfig;
@Inject
public DeadNodeTracker(HBaseFrameworkConfig hbaseFrameworkConfig)
{
this.hbaseFrameworkConfig = hbaseFrameworkConfig;
initializeTimestampMap();
}
private void initializeTimestampMap()
{
timestampMap = new HashMap<>();
for (String node : nodes) {
resetNodeTimeStamp(node);
}
}
private void resetNodeTimeStamp(String nodeType)
{
Date date = DateUtils.addSeconds(new Date(), hbaseFrameworkConfig.getDeadNodeTimeout());
timestampMap.put(nodeType, new Timestamp(date.getTime()));
}
public void resetDeadNodeTimeStamps(int deadMasterNodes, int deadDataNodes, int deadStargateNodes)
{
if (deadMasterNodes > 0) {
resetMasterNodeTimeStamp();
}
if (deadDataNodes > 0) {
resetDataNodeTimeStamp();
}
if (deadStargateNodes > 0) {
resetStargateNodeTimeStamp();
}
}
public void resetMasterNodeTimeStamp()
{
resetNodeTimeStamp(MASTERNODES_KEY);
}
public void resetDataNodeTimeStamp()
{
resetNodeTimeStamp(SLAVENODES_KEY);
}
public boolean masterNodeTimerExpired()
{
return nodeTimerExpired(MASTERNODES_KEY);
}
public boolean slaveNodeTimerExpired()
{
return nodeTimerExpired(SLAVENODES_KEY);
}
private boolean nodeTimerExpired(String nodeType)
{
Timestamp timestamp = timestampMap.get(nodeType);
return timestamp != null && timestamp.before(new Date());
}
boolean stargateNodeTimerExpired()
{
return nodeTimerExpired(STARGATENODES_KEY);
}
void resetStargateNodeTimeStamp()
{
resetNodeTimeStamp(STARGATENODES_KEY);
}
}