use of org.jgroups.Message in project JGroups by belaban.
the class TOA method handleViewChange.
private void handleViewChange(View view) {
if (log.isTraceEnabled()) {
log.trace("Handle view %s", view);
}
final Collection<Address> leavers = deliverManager.handleView(view);
// basis behavior: drop leavers message (as senders)
// basis behavior: avoid waiting for the acks
Collection<MessageID> pendingSentMessages = senderManager.getPendingMessageIDs();
for (MessageID messageID : pendingSentMessages) {
long finalSequenceNumber = senderManager.removeLeavers(messageID, leavers);
if (finalSequenceNumber != SenderManager.NOT_READY) {
ToaHeader finalHeader = ToaHeader.newFinalMessageHeader(messageID, finalSequenceNumber);
Message finalMessage = new Message().src(localAddress).putHeader(this.id, finalHeader).setFlag(Message.Flag.OOB, Message.Flag.INTERNAL, Message.Flag.DONT_BUNDLE);
if (log.isTraceEnabled()) {
log.trace("Message %s is ready to be delivered. Final sequencer number is %d", messageID, finalSequenceNumber);
}
send(senderManager.getDestination(messageID), finalMessage, false);
// returns true if we are in destination set
if (senderManager.markSent(messageID)) {
deliverManager.markReadyToDeliver(messageID, finalSequenceNumber);
}
}
}
// TODO: Future work: How to add fault tolerance? (simple and efficient)
}
use of org.jgroups.Message in project JGroups by belaban.
the class ForwardQueue method flushMessagesInForwardTable.
/**
* Sends all messages currently in forward_table to the new target (changing the dest field).
* This needs to be done, so the underlying reliable unicast protocol (e.g. UNICAST) adds these messages
* to its retransmission mechanism<br/>
* Note that we need to resend the messages in order of their seqnos ! We also need to prevent other message
* from being inserted until we're done, that's why there's synchronization.<br/>
* Access to the forward_table doesn't need to be synchronized as there won't be any insertions during flushing
* (all down-threads are blocked)
*/
protected void flushMessagesInForwardTable(Address target) {
// for forwarded messages, we need to receive the forwarded message from the coordinator, to prevent this case:
// - V1={A,B,C}
// - A crashes
// - C installs V2={B,C}
// - C forwards messages 3 and 4 to B (the new coord)
// - B drops 3 because its view is still V1
// - B installs V2
// - B receives message 4 and broadcasts it
// ==> C's message 4 is delivered *before* message 3 !
// ==> By resending 3 until it is received, then resending 4 until it is received, we make sure this won't happen
// (see https://issues.jboss.org/browse/JGRP-1449)
// Forward the first entry and wait for the ack
Map.Entry<Long, Message> first = forward_table.firstEntry();
if (first == null)
return;
Long key = first.getKey();
Message val = first.getValue();
Message forward_msg;
while (flushing && running && !forward_table.isEmpty()) {
forward_msg = val.copy();
forward_msg.setDest(target);
forward_msg.setFlag(Message.Flag.DONT_BUNDLE);
if (log.isTraceEnabled())
log.trace(local_addr + ": flushing (forwarding) " + "::" + key + " to target " + target);
ack_promise.reset();
down_prot.down(forward_msg);
Long ack = ack_promise.getResult(500);
if ((Objects.equals(ack, key)) || !forward_table.containsKey(key))
break;
}
for (Map.Entry<Long, Message> entry : forward_table.entrySet()) {
key = entry.getKey();
val = entry.getValue();
if (flushing && running) {
forward_msg = val.copy();
forward_msg.setDest(target);
forward_msg.setFlag(Message.Flag.DONT_BUNDLE);
if (log.isTraceEnabled())
log.trace(local_addr + ": flushing (forwarding) " + "::" + key + " to target " + target);
down_prot.down(forward_msg);
}
}
}
use of org.jgroups.Message in project JGroups by belaban.
the class FRAG method fragment.
/**
* Send all fragments as separate messages (with same ID !).
* Example:
* <pre>
* Given the generated ID is 2344, number of fragments=3, message {dst,src,buf}
* would be fragmented into:
* <p/>
* [2344,3,0]{dst,src,buf1},
* [2344,3,1]{dst,src,buf2} and
* [2344,3,2]{dst,src,buf3}
* </pre>
*/
private void fragment(Message msg, long size) {
Address dest = msg.getDest(), src = msg.getSrc();
// used as seqnos
long frag_id = curr_id.getAndIncrement();
int num_frags;
try {
// write message into a byte buffer and fragment it
ByteArrayDataOutputStream dos = new ByteArrayDataOutputStream((int) (size + 50));
msg.writeTo(dos);
byte[] buffer = dos.buffer();
byte[][] fragments = Util.fragmentBuffer(buffer, frag_size, dos.position());
num_frags = fragments.length;
num_sent_frags += num_frags;
if (log.isTraceEnabled()) {
StringBuilder sb = new StringBuilder();
sb.append("fragmenting packet to ").append(dest != null ? dest.toString() : "<all members>").append(" (size=").append(buffer.length).append(") into ").append(num_frags).append(" fragment(s) [frag_size=").append(frag_size).append(']');
log.trace(sb.toString());
}
for (int i = 0; i < num_frags; i++) {
Message frag_msg = new Message(dest, fragments[i]).src(src);
FragHeader hdr = new FragHeader(frag_id, i, num_frags);
frag_msg.putHeader(this.id, hdr);
down_prot.down(frag_msg);
}
} catch (Exception e) {
log.error(Util.getMessage("ExceptionOccurredTryingToFragmentMessage"), e);
}
}
use of org.jgroups.Message in project JGroups by belaban.
the class FRAG2 method up.
public Object up(Message msg) {
FragHeader hdr = msg.getHeader(this.id);
if (hdr != null) {
// needs to be defragmented
Message assembled_msg = unfragment(msg, hdr);
if (assembled_msg != null) {
// needed ? YES, because fragments have a null src !!
assembled_msg.setSrc(msg.getSrc());
up_prot.up(assembled_msg);
avg_size_up.add(assembled_msg.length());
}
return null;
}
return up_prot.up(msg);
}
use of org.jgroups.Message in project JGroups by belaban.
the class FRAG3 method up.
public Object up(Message msg) {
Frag3Header hdr = msg.getHeader(this.id);
if (hdr != null) {
// needs to be defragmented
Message assembled_msg = unfragment(msg, hdr);
if (assembled_msg != null) {
// needed ? YES, because fragments have a null src !!
assembled_msg.setSrc(msg.getSrc());
up_prot.up(assembled_msg);
avg_size_up.add(assembled_msg.length());
}
return null;
}
return up_prot.up(msg);
}
Aggregations