package org.apache.mesos.hbase.state;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
import com.google.inject.Singleton;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mesos.Protos;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.apache.mesos.hbase.util.HBaseConstants;
/**
* Manages the "Live" state of running tasks.
*/
@Singleton
public class LiveState {
private final Log log = LogFactory.getLog(LiveState.class);
private Set<Protos.TaskID> stagingTasks = new HashSet<>();
private AcquisitionPhase currentAcquisitionPhase = AcquisitionPhase.RECONCILING_TASKS;
// TODO (nicgrayson) Might need to split this out to jns, nns, and dns if dns too big
//TODO (elingg) we need to also track ZKFC's state
private Map<String, Protos.TaskStatus> runningTasks = new LinkedHashMap<>();
public void addStagingTask(Protos.TaskID taskId) {
stagingTasks.add(taskId);
}
public int getStagingTasksSize() {
return stagingTasks.size();
}
public void removeStagingTask(final Protos.TaskID taskID) {
stagingTasks.remove(taskID);
}
public Map<String, Protos.TaskStatus> getRunningTasks() {
return runningTasks;
}
public void removeRunningTask(Protos.TaskID taskId) {
runningTasks.remove(taskId.getValue());
}
@SuppressWarnings("PMD")
public void updateTaskForStatus(Protos.TaskStatus status) {
runningTasks.put(status.getTaskId().getValue(), status);
}
public AcquisitionPhase getCurrentAcquisitionPhase() {
return currentAcquisitionPhase;
}
public void transitionTo(AcquisitionPhase phase) {
this.currentAcquisitionPhase = phase;
}
public int getMasterNodeSize() {
return countOfRunningTasksWith(HBaseConstants.MASTER_NODE_TASKID);
}
private int countOfRunningTasksWith(final String nodeId) {
return Sets.filter(runningTasks.keySet(), new Predicate<String>() {
@Override
public boolean apply(String taskId) {
return taskId.contains(nodeId);
}
}).size();
}
}