package uk.ac.imperial.lsds.seepworker.comm;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.esotericsoftware.kryo.Kryo;
import uk.ac.imperial.lsds.seep.api.DataReference;
import uk.ac.imperial.lsds.seep.api.RuntimeEvent;
import uk.ac.imperial.lsds.seep.comm.Comm;
import uk.ac.imperial.lsds.seep.comm.Connection;
import uk.ac.imperial.lsds.seep.comm.protocol.ProtocolCommandFactory;
import uk.ac.imperial.lsds.seep.comm.protocol.SeepCommand;
import uk.ac.imperial.lsds.seep.comm.protocol.StageStatusCommand.Status;
import uk.ac.imperial.lsds.seep.comm.serialization.KryoFactory;
import uk.ac.imperial.lsds.seep.core.DatasetMetadata;
import uk.ac.imperial.lsds.seep.core.DatasetMetadataPackage;
import uk.ac.imperial.lsds.seepworker.WorkerConfig;
public class ControlAPIImplementation {
final private Logger LOG = LoggerFactory.getLogger(ControlAPIImplementation.class.getName());
private Comm comm;
private Kryo k;
private int retriesToMaster;
private int retryBackOffMs;
public ControlAPIImplementation(Comm comm, WorkerConfig wc){
this.comm = comm;
this.k = KryoFactory.buildKryoForProtocolCommands(this.getClass().getClassLoader());
this.retriesToMaster = wc.getInt(WorkerConfig.MASTER_CONNECTION_RETRIES);
this.retryBackOffMs = wc.getInt(WorkerConfig.MASTER_RETRY_BACKOFF_MS);
}
public void bootstrap(Connection masterConn, String myIp, int controlPort, int dataPort){
SeepCommand command = ProtocolCommandFactory.buildBootstrapCommand(myIp, controlPort, dataPort);
LOG.info("Bootstrapping...");
comm.send_object_async(command, masterConn, k, retriesToMaster, retryBackOffMs);
LOG.info("Bootstrapping OK conn to master: {}", masterConn.toString());
}
public void signalDeadWorker(Connection masterConn, int workerId, String reason){
SeepCommand command = ProtocolCommandFactory.buildDeadWorkerCommand(workerId, reason);
LOG.info("Sending bye message to master...");
// Retry to reconnect to master (master is highly available, will be alive eventually)
comm.send_object_async(command, masterConn, k, retriesToMaster, retryBackOffMs);
LOG.info("Sending bye message to master...OK");
}
public void scheduleTaskStatus(Connection masterConn, int stageId, int euId, Status status, Map<Integer, Set<DataReference>> producedOutput, List<RuntimeEvent> runtimeEvents, DatasetMetadataPackage managedDatasets) {
SeepCommand command = ProtocolCommandFactory.buildStageStatusCommand(stageId, euId, status, producedOutput, runtimeEvents, managedDatasets);
LOG.debug("Send stage {} status {} to master...", stageId, status.toString());
comm.send_object_async(command, masterConn, k, retriesToMaster, retryBackOffMs);
}
}