/*******************************************************************************
* Copyright (c) 2013 Imperial College London.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Raul Castro Fernandez - initial design and implementation
******************************************************************************/
package uk.ac.imperial.lsds.seep.reliable;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.ArrayBlockingQueue;
import uk.ac.imperial.lsds.seep.comm.serialization.ControlTuple;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.Ack;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.BackupNodeState;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.BackupOperatorState;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.BackupRI;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.InitNodeState;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.InitOperatorState;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.InitRI;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.InvalidateState;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.RawData;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.ReconfigureConnection;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.Resume;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.ScaleOutInfo;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.StateAck;
import uk.ac.imperial.lsds.seep.comm.serialization.controlhelpers.StateChunk;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.MapSerializer;
public class StreamerWorker implements Runnable{
private ArrayBlockingQueue<Object> jobQueue;
// private List<File> toStream;
// private int filesToStreamSize = 0;
private Kryo k;
// private Output newO;
private int oldOpId;
// private int newOpId;
private int keeperOpId;
private int totalNumberChunks;
private int currentNumberBatch;
private Output largeOutput;
public void initializeSerialization(){
k = new Kryo();
k.register(ControlTuple.class);
k.register(MemoryChunk.class);
k.register(StateChunk.class);
k.register(HashMap.class, new MapSerializer());
k.register(BackupOperatorState.class);
k.register(byte[].class);
k.register(RawData.class);
k.register(Ack.class);
k.register(BackupNodeState.class);
k.register(Resume.class);
k.register(ScaleOutInfo.class);
k.register(StateAck.class);
k.register(ArrayList.class);
k.register(BackupRI.class);
k.register(InitNodeState.class);
k.register(InitOperatorState.class);
k.register(InitRI.class);
k.register(InvalidateState.class);
k.register(ReconfigureConnection.class);
}
public StreamerWorker(Socket s, ArrayBlockingQueue<Object> jobQueue, int opId, int keeperOpId, int currentNumberBatch, int totalNumberChunks){
try {
largeOutput = new Output(10000);
largeOutput.setOutputStream(s.getOutputStream());
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.jobQueue = jobQueue;
this.initializeSerialization();
this.oldOpId = opId;
this.keeperOpId = keeperOpId;
System.out.println("CREATED KEEPER: "+keeperOpId);
this.currentNumberBatch = currentNumberBatch;
this.totalNumberChunks = totalNumberChunks;
}
@Override
public void run() {
int streamedFiles = 0;
boolean goOn = true;
while(goOn){
ArrayList<Object> p = null;
try {
p = (ArrayList<Object>)jobQueue.take();
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(p.size() == 0){
System.out.println("END");
goOn = false;
continue;
}
MemoryChunk oldMC = new MemoryChunk(p);
ControlTuple oldCT = new ControlTuple().makeStateChunk(oldOpId, keeperOpId, currentNumberBatch, totalNumberChunks, oldMC, 0);
System.out.println(Thread.currentThread().getName()+" STREAM CHUNK (keeper="+keeperOpId+") to "+largeOutput.toString());
k.writeObject(largeOutput, oldCT);
largeOutput.flush();
streamedFiles++;
}
System.out.println("##################");
System.out.println("##################");
System.out.println("I streamed this files: "+streamedFiles);
System.out.println("##################");
System.out.println("##################");
}
}