use of edu.iu.dsc.tws.api.comms.messaging.MessageHeader in project twister2 by DSC-SPIDAL.
the class TreeBroadcast method receiveProgressMessage.
private boolean receiveProgressMessage() {
Pair<MessageHeader, Object> pair = currentReceiveMessage.peek();
if (pair == null) {
return false;
}
MessageHeader header = pair.getLeft();
Object object = pair.getRight();
boolean allSent = true;
boolean done = true;
for (int i = receiveIndex; i < receiveTasks.size(); i++) {
if (!finalReceiver.onMessage(header.getSourceId(), CommunicationContext.DEFAULT_DESTINATION, receiveTasks.get(i), header.getFlags(), object)) {
done = false;
allSent = false;
break;
}
receiveIndex++;
}
if (allSent) {
currentReceiveMessage.poll();
receiveIndex = 0;
}
return done;
}
use of edu.iu.dsc.tws.api.comms.messaging.MessageHeader in project twister2 by DSC-SPIDAL.
the class BaseSerializer method buildHeader.
/**
* Build the header to set for channel messages laters
*
* @param sendMessage messages
* @param channelMessage channel message
* @param numMessages number of messages
*/
private void buildHeader(OutMessage sendMessage, ChannelMessage channelMessage, int numMessages) {
MessageHeader.Builder builder = MessageHeader.newBuilder(sendMessage.getSource(), sendMessage.getEdge(), numMessages);
builder.destination(sendMessage.getPath());
builder.flags(sendMessage.getFlags());
MessageHeader header = builder.build();
channelMessage.setHeader(header);
sendMessage.setHeader(header);
}
use of edu.iu.dsc.tws.api.comms.messaging.MessageHeader in project twister2 by DSC-SPIDAL.
the class FixedSchemaDataDeserializer method build.
/**
* Builds the message from the data buffers in the partialObject. Since this method
* supports multi-messages it iterates through the buffers and builds all the messages separately
*
* @param partialObject message object that needs to be built
* @param edge the edge value associated with this message
*/
@Override
public void build(Object partialObject, int edge) {
InMessage currentMessage = (InMessage) partialObject;
DataPacker dataPacker = currentMessage.getDataType().getDataPacker();
Queue<DataBuffer> buffers = currentMessage.getBuffers();
MessageHeader header = currentMessage.getHeader();
if (header == null) {
throw new RuntimeException("Header must be built before the message");
}
List<DataBuffer> builtBuffers = new ArrayList<>();
// get the number of objects deserialized
DataBuffer buffer = buffers.peek();
while (buffer != null) {
int currentLocation = 0;
int remaining = buffer.getSize();
if (header.getNumberTuples() == 0) {
builtBuffers.add(buffer);
break;
}
// if we are at the beginning
int currentObjectLength = currentMessage.getUnPkCurrentObjectLength();
if (currentMessage.getUnPkBuffers() == 0) {
currentLocation = DFWIOUtils.HEADER_SIZE;
remaining = remaining - DFWIOUtils.HEADER_SIZE;
} else {
// source(int) + last_buffer_indicator(byte)
currentLocation = DFWIOUtils.SHORT_HEADER_SIZE;
remaining = remaining - DFWIOUtils.SHORT_HEADER_SIZE;
}
if (currentObjectLength == -1 || currentMessage.getUnPkBuffers() == 0) {
currentObjectLength = this.messageSchema.getMessageSize();
// starting to build a new object
currentMessage.getDataBuilder().init(dataPacker, currentObjectLength);
}
while (remaining > 0) {
// read the values from the buffer
ObjectBuilderImpl dataBuilder = currentMessage.getDataBuilder();
int bytesRead = dataPacker.readDataFromBuffer(dataBuilder, currentLocation, buffer);
dataBuilder.incrementCompletedSizeBy(bytesRead);
currentLocation += bytesRead;
remaining = remaining - bytesRead;
// okay we are done with this object
if (dataBuilder.isBuilt()) {
currentMessage.addCurrentObject();
currentMessage.setUnPkCurrentObjectLength(-1);
} else {
// lets break the inner while loop
break;
}
}
// lets remove this buffer
buffers.poll();
builtBuffers.add(buffer);
// increment the unpacked buffers
currentMessage.incrementUnPkBuffers();
// lets check weather we have read everythong
int readObjectNumber = currentMessage.getUnPkNumberObjects();
// we need to get number of tuples and get abs because we are using -1 for single messages
if (readObjectNumber == Math.abs(currentMessage.getHeader().getNumberTuples())) {
break;
}
// lets move to next
buffer = buffers.peek();
}
if (builtBuffers.size() > 0) {
ChannelMessage channelMessage = new ChannelMessage(currentMessage.getOriginatingId(), currentMessage.getDataType(), MessageDirection.IN, currentMessage.getReleaseListener());
channelMessage.addBuffers(builtBuffers);
channelMessage.setHeader(currentMessage.getHeader());
channelMessage.incrementRefCount();
currentMessage.addBuiltMessage(channelMessage);
}
}
use of edu.iu.dsc.tws.api.comms.messaging.MessageHeader in project twister2 by DSC-SPIDAL.
the class BaseSerializeTest method keyedListValueCase.
public InMessage keyedListValueCase(int numBuffers, int size, List<Object> data, MessageType type, MessageType keyType) {
BlockingQueue<DataBuffer> bufferQueue = createDataQueue(numBuffers, size);
OutMessage outMessage = new OutMessage(0, 1, -1, 10, 0, null, null, type, keyType, null, data);
KeyedDataSerializer serializer = new KeyedDataSerializer();
serializer.init(Config.newBuilder().build(), bufferQueue);
List<ChannelMessage> messages = new ArrayList<>();
while (outMessage.getSendState() != OutMessage.SendState.SERIALIZED) {
ChannelMessage ch = serializer.build(data, outMessage);
messages.add(ch);
}
KeyedDataDeSerializer deserializer = new KeyedDataDeSerializer();
deserializer.init(Config.newBuilder().build());
MessageHeader header = deserializer.buildHeader(messages.get(0).getBuffers().get(0), 1);
InMessage inMessage = new InMessage(0, type, null, header);
inMessage.setKeyType(keyType);
for (ChannelMessage channelMessage : messages) {
for (DataBuffer dataBuffer : channelMessage.getBuffers()) {
inMessage.addBufferAndCalculate(dataBuffer);
}
}
deserializer.build(inMessage, 1);
return inMessage;
}
use of edu.iu.dsc.tws.api.comms.messaging.MessageHeader in project twister2 by DSC-SPIDAL.
the class KeyedSerializerLargeTest method keyedListValueCase.
public InMessage keyedListValueCase(int numBuffers, int size, List<Object> data, MessageType type, MessageType keyType) {
OutMessage outMessage = new OutMessage(0, 1, -1, 10, 0, null, null, type, keyType, null, data);
List<ChannelMessage> messages = new ArrayList<>();
int count = 0;
while (outMessage.getSendState() != OutMessage.SendState.SERIALIZED) {
ChannelMessage ch = serializer.build(data, outMessage);
messages.add(ch);
System.out.println("Adding count " + count++);
}
MessageHeader header = deserializer.buildHeader(messages.get(0).getBuffers().get(0), 1);
InMessage inMessage = new InMessage(0, type, null, header);
inMessage.setKeyType(keyType);
for (ChannelMessage channelMessage : messages) {
for (DataBuffer dataBuffer : channelMessage.getBuffers()) {
inMessage.addBufferAndCalculate(dataBuffer);
}
}
deserializer.build(inMessage, 1);
for (ChannelMessage d : inMessage.getBuiltMessages()) {
for (DataBuffer buffer : d.getNormalBuffers()) {
buffer.getByteBuffer().clear();
bufferQueue.offer(buffer);
}
}
return inMessage;
}
Aggregations