package uk.ac.imperial.lsds.seepworker.core.input;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
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.DataStoreType;
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.core.IBuffer;
import uk.ac.imperial.lsds.seep.core.InputAdapter;
import uk.ac.imperial.lsds.seepworker.WorkerConfig;
public class CoreInput {
final private static Logger LOG = LoggerFactory.getLogger(CoreInput.class);
private WorkerConfig wc;
private Map<Integer, Set<DataReference>> input;
private Map<Integer, IBuffer> iBuffers;
private List<InputAdapter> inputAdapters;
public CoreInput(WorkerConfig wc, Map<Integer, Set<DataReference>> input, Map<Integer, IBuffer> iBuffers, List<InputAdapter> inputAdapters) {
this.wc = wc;
this.input = input;
this.iBuffers = iBuffers;
this.inputAdapters = inputAdapters;
LOG.info("Configured CoreInput with {} inputAdapters", inputAdapters.size());
}
public Map<Integer, Set<DataReference>> getDataReferences() {
return input;
}
public Set<Integer> getAllDataReferences() {
Set<Integer> drefs = new HashSet<>();
for(Set<DataReference> drset : input.values()) {
for(DataReference dr : drset) {
drefs.add(dr.getId());
}
}
return drefs;
}
public List<InputAdapter> getInputAdapters(){
return inputAdapters;
}
public boolean requiresConfigureSelectorOfType(DataStoreType type){
for(InputAdapter ia : inputAdapters){
if(ia.getDataStoreType().equals(type)){
return true;
}
}
return false;
}
public Map<Integer, IBuffer> getIBufferProvider(){
return iBuffers;
}
public void requestInputConnections(Comm comm, Kryo k, InetAddress myIp) {
Map<Integer, IBuffer> externalIBuffers = getIBufferThatRequireNetwork();
LOG.info("Requesting {} input connections...", externalIBuffers.size());
for(IBuffer ib : externalIBuffers.values()) {
DataReference dr = ib.getDataReference();
if(dr.isManaged()) {
// Create dataRef request and send to the worker
SeepCommand requestStreamDataReference = ProtocolCommandFactory.buildRequestDataReference(dr.getId(), myIp, wc.getInt(WorkerConfig.DATA_PORT));
Connection targetConn = new Connection(dr.getControlEndPoint());
LOG.trace("Sending RequestStreamDataReference with id: {} to: {} at: {}", dr.getId(), targetConn, System.currentTimeMillis());
comm.send_object_sync(requestStreamDataReference, targetConn, k);
}
else {
LOG.error("Requesting DataReference that is not managed by SEEPng");
}
}
}
public Map<Integer, IBuffer> getIBufferThatRequireNetwork() {
Map<Integer, IBuffer> toReturn = new HashMap<>();
for(Entry<Integer, IBuffer> entry : iBuffers.entrySet()) {
int streamId = entry.getKey();
IBuffer ib = entry.getValue();
if(ib instanceof InputBuffer) {
toReturn.put(streamId, ib);
}
}
return toReturn;
}
}