package uk.ac.imperial.lsds.seepworker.core.input; import java.nio.channels.ReadableByteChannel; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import uk.ac.imperial.lsds.seep.api.DataReference; import uk.ac.imperial.lsds.seep.api.DataStoreType; import uk.ac.imperial.lsds.seep.api.data.ITuple; import uk.ac.imperial.lsds.seep.api.data.Schema; import uk.ac.imperial.lsds.seep.core.IBuffer; import uk.ac.imperial.lsds.seep.core.InputAdapter; import uk.ac.imperial.lsds.seep.core.InputAdapterReturnType; import uk.ac.imperial.lsds.seepworker.WorkerConfig; public class NetworkBarrier implements InputAdapter { final private short RETURN_TYPE = InputAdapterReturnType.MANY.ofType(); final private DataStoreType TYPE = DataStoreType.NETWORK; private int streamId; private ITuple iTuple; private BlockingQueue<List<byte[]>> queue; private int queueSize; private Set<Integer> barrierMembers; private Set<Integer> membersArrivedInBarrier; private Map<Integer, InputBuffer> inputBuffers; private List<byte[]> data; public NetworkBarrier(WorkerConfig wc, int streamId, Schema expectedSchema, Set<DataReference> drefs) { this.streamId = streamId; this.iTuple = new ITuple(expectedSchema); this.queueSize = wc.getInt(WorkerConfig.SIMPLE_INPUT_QUEUE_LENGTH); this.queue = new ArrayBlockingQueue<>(queueSize); this.membersArrivedInBarrier = new HashSet<>(); this.barrierMembers = new HashSet<>(); int headroom = wc.getInt(WorkerConfig.BATCH_SIZE) * 2; this.inputBuffers = new HashMap<>(); for(DataReference dref : drefs) { int id = dref.getId(); barrierMembers.add(id); inputBuffers.put(id, new InputBuffer(headroom)); } this.data = new ArrayList<>(); } public NetworkBarrier(WorkerConfig wc, int streamId, List<IBuffer> buffers, Schema expectedSchema) { } @Override public int getStreamId() { // TODO Auto-generated method stub return 0; } @Override public short returnType() { // TODO Auto-generated method stub return 0; } @Override public DataStoreType getDataStoreType() { // TODO Auto-generated method stub return null; } @Override public ITuple pullDataItem(int timeout) { // TODO Auto-generated method stub return null; } @Override public List<ITuple> pullDataItems(int timeout) { // TODO Auto-generated method stub return null; } // @Override // public int getStreamId() { // return streamId; // } // // @Override // public short returnType() { // return RETURN_TYPE; // } // // @Override // public DataStoreType getDataStoreType() { // return TYPE; // } // // @Override // public void readFrom(ReadableByteChannel channel, int id) { // if(! membersArrivedInBarrier.contains(id)){ // // read data from channel and push it to the barrierBatch // InputBuffer buffer = inputBuffers.get(id); // buffer.readToInternalBuffer(channel, this); // // if data was fully read, then add member to arrived set // if(buffer.hasCompletedReads()) { // membersArrivedInBarrier.add(id); // this.data.add(buffer.read()); // // // Check whether all members already arrived // if(membersArrivedInBarrier.containsAll(barrierMembers)) { // // clean appropiately the structures and make data available for consumption // // TODO: can avoid this copy? // List<byte[]> copy = new ArrayList<>(data); // this.pushData(copy); // data.clear(); // membersArrivedInBarrier.clear(); // } // } // } // } // // @Override // public void pushData(List<byte[]> data) { // try { // queue.put(data); // } // catch (InterruptedException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } // // @Override // public ITuple pullDataItems(int timeout) { // List<byte[]> data = null; // try { // if(timeout > 0){ // // Need to poll rather than take due to the implementation of some ProcessingEngines // data = queue.poll(timeout, TimeUnit.MILLISECONDS); // } else{ // data = queue.take(); // } // } // catch (InterruptedException e) { // e.printStackTrace(); // } // // In case poll was used, and it timeouts // if(data == null){ // return null; // } // iTuple.setData(data); // iTuple.setStreamId(streamId); // return iTuple; // } // // @Override // public ITuple pullDataItem(int timeout) { // // TODO non-defined // return null; // } }