package org.act.tstream.task;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.act.tstream.schedule.default_assign.ResourceWorkerSlot;
/**
* Assignment of one Toplogy, stored in /ZK-DIR/assignments/{topologyid}
* nodeHost {supervisorid: hostname} -- assigned supervisor Map
* taskStartTimeSecs: {taskid, taskStartSeconds} masterCodeDir: topology source
* code's dir in Nimbus taskToResource: {taskid, ResourceAssignment}
*
* @author Lixin/Longda
*/
public class Assignment implements Serializable {
private static final long serialVersionUID = 6087667851333314069L;
private final String masterCodeDir;
/**
* @@@ nodeHost store <supervisorId, hostname>, this will waste some zk
* storage
*/
private final Map<String, String> nodeHost;
private final Map<Integer, Integer> taskStartTimeSecs;
private final Set<ResourceWorkerSlot> workers;
public Assignment(String masterCodeDir, Set<ResourceWorkerSlot> workers,
Map<String, String> nodeHost,
Map<Integer, Integer> taskStartTimeSecs) {
this.workers = workers;
this.nodeHost = nodeHost;
this.taskStartTimeSecs = taskStartTimeSecs;
this.masterCodeDir = masterCodeDir;
}
public Map<String, String> getNodeHost() {
return nodeHost;
}
public Map<Integer, Integer> getTaskStartTimeSecs() {
return taskStartTimeSecs;
}
public String getMasterCodeDir() {
return masterCodeDir;
}
public Set<ResourceWorkerSlot> getWorkers() {
return workers;
}
/**
* find workers for every supervisorId (node)
*
* @param supervisorId
* @return Map<Integer, WorkerSlot>
*/
public Map<Integer, ResourceWorkerSlot> getTaskToNodePortbyNode(
String supervisorId) {
Map<Integer, ResourceWorkerSlot> result = new HashMap<Integer, ResourceWorkerSlot>();
for (ResourceWorkerSlot worker : workers) {
if (worker.getNodeId().equals(supervisorId)) {
result.put(worker.getPort(), worker);
}
}
return result;
}
public Set<Integer> getCurrentSuperviosrTasks(String supervisorId) {
Set<Integer> Tasks = new HashSet<Integer>();
for (ResourceWorkerSlot worker : workers) {
if (worker.getNodeId().equals(supervisorId))
Tasks.addAll(worker.getTasks());
}
return Tasks;
}
public Set<Integer> getCurrentSuperviosrWorkers(String supervisorId) {
Set<Integer> workerSet = new HashSet<Integer>();
for (ResourceWorkerSlot worker : workers) {
if (worker.getNodeId().equals(supervisorId))
workerSet.add(worker.getPort());
}
return workerSet;
}
public Set<Integer> getCurrentWorkerTasks(String supervisorId, int port) {
for (ResourceWorkerSlot worker : workers) {
if (worker.getNodeId().equals(supervisorId)
&& worker.getPort() == port)
return worker.getTasks();
}
return new HashSet<Integer>();
}
public ResourceWorkerSlot getWorkerByTaskId(Integer taskId) {
for (ResourceWorkerSlot worker : workers) {
if (worker.getTasks().contains(taskId))
return worker;
}
return null;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((masterCodeDir == null) ? 0 : masterCodeDir.hashCode());
result = prime * result
+ ((nodeHost == null) ? 0 : nodeHost.hashCode());
result = prime
* result
+ ((taskStartTimeSecs == null) ? 0 : taskStartTimeSecs
.hashCode());
result = prime * result + ((workers == null) ? 0 : workers.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Assignment other = (Assignment) obj;
if (masterCodeDir == null) {
if (other.masterCodeDir != null)
return false;
} else if (!masterCodeDir.equals(other.masterCodeDir))
return false;
if (nodeHost == null) {
if (other.nodeHost != null)
return false;
} else if (!nodeHost.equals(other.nodeHost))
return false;
if (taskStartTimeSecs == null) {
if (other.taskStartTimeSecs != null)
return false;
} else if (!taskStartTimeSecs.equals(other.taskStartTimeSecs))
return false;
if (workers == null) {
if (other.workers != null)
return false;
} else if (!workers.equals(other.workers))
return false;
return true;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.SHORT_PREFIX_STYLE);
}
}