Search in sources :

Example 61 with Message

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)
}
Also used : AnycastAddress(org.jgroups.AnycastAddress) Address(org.jgroups.Address) Message(org.jgroups.Message)

Example 62 with Message

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);
        }
    }
}
Also used : Message(org.jgroups.Message) NavigableMap(java.util.NavigableMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) ConcurrentSkipListMap(java.util.concurrent.ConcurrentSkipListMap) Map(java.util.Map)

Example 63 with Message

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);
    }
}
Also used : Address(org.jgroups.Address) Message(org.jgroups.Message)

Example 64 with Message

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);
}
Also used : Message(org.jgroups.Message)

Example 65 with Message

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);
}
Also used : Message(org.jgroups.Message)

Aggregations

Message (org.jgroups.Message)246 Address (org.jgroups.Address)50 MessageBatch (org.jgroups.util.MessageBatch)37 BytesMessage (org.jgroups.BytesMessage)31 NioMessage (org.jgroups.NioMessage)14 ObjectMessage (org.jgroups.ObjectMessage)14 EmptyMessage (org.jgroups.EmptyMessage)12 Test (org.testng.annotations.Test)12 Event (org.jgroups.Event)11 ToaHeader (org.jgroups.protocols.tom.ToaHeader)11 Test (org.junit.Test)11 IOException (java.io.IOException)8 JChannel (org.jgroups.JChannel)8 MessageID (org.jgroups.protocols.tom.MessageID)8 DistributionMessage (org.apache.geode.distributed.internal.DistributionMessage)7 JoinRequestMessage (org.apache.geode.distributed.internal.membership.gms.messages.JoinRequestMessage)7 JoinResponseMessage (org.apache.geode.distributed.internal.membership.gms.messages.JoinResponseMessage)7 TimeoutException (java.util.concurrent.TimeoutException)6 Collectors (java.util.stream.Collectors)6 MembershipTest (org.apache.geode.test.junit.categories.MembershipTest)6