protected void handleXmitRequest(Address sender, SeqnoList missing) { if(is_trace) log.trace("%s <-- XMIT(%s: #%s)", local_addr, sender, missing); SenderEntry entry=send_table.get(sender); xmit_reqs_received.add(missing.size()); Table<Message> win=entry != null? entry.msgs : null; if(win != null) { for(long seqno: missing) { Message msg=win.get(seqno); if(msg == null) { if(log.isWarnEnabled() && log_not_found_msgs && !local_addr.equals(sender) && seqno > win.getLow()) log.warn(Util.getMessage("MessageNotFound"), local_addr, sender, seqno); continue; } down_prot.down(msg); xmit_rsps_sent.increment(); } } }
Message highest_sent_msg=win.get(highest_sent); if(highest_sent_msg != null) retransmit(highest_sent_msg);
for(LongTuple<Message> tuple: msgs) { long seq=tuple.getVal1(); Message msg=buf.get(seq); // we *have* to get the message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) oob_batch.add(msg);
Message highest_sent_msg=win.get(highest_sent); if(highest_sent_msg != null) retransmit(highest_sent_msg);
/** * Retransmits messsages first_seqno to last_seqno from original_sender from xmit_table to xmit_requester, * called when XMIT_REQ is received. * @param xmit_requester The sender of the XMIT_REQ, we have to send the requested copy of the message to this address * @param missing_msgs A list of seqnos that have to be retransmitted * @param original_sender The member who originally sent the messsage. Guaranteed to be non-null */ protected void handleXmitReq(Address xmit_requester, SeqnoList missing_msgs, Address original_sender) { log.trace("%s: received xmit request from %s for %s%s", local_addr, xmit_requester, original_sender, missing_msgs); if(stats) xmit_reqs_received.add(missing_msgs.size()); Table<Message> buf=xmit_table.get(original_sender); if(buf == null) { log.error(Util.getMessage("SenderNotFound"), local_addr, original_sender); return; } for(long i: missing_msgs) { Message msg=buf.get(i); if(msg == null) { if(log.isWarnEnabled() && log_not_found_msgs && !local_addr.equals(xmit_requester) && i > buf.getLow()) log.warn(Util.getMessage("MessageNotFound"), local_addr, original_sender, i); continue; } if(is_trace) log.trace(local_addr + ": resending " + original_sender + "::" + i); sendXmitRsp(xmit_requester, msg); } }
msg=buf.get(hdr.seqno); // we *have* to get a message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) deliver(msg, sender, hdr.seqno, "OOB message");
/** * We need to resend the first message with our conn_id * @param sender */ protected void handleResendingOfFirstMessage(Address sender, int timestamp) { log.trace("%s <-- SEND_FIRST_SEQNO(%s)", local_addr, sender); SenderEntry entry=send_table.get(sender); Table<Message> win=entry != null? entry.msgs : null; if(win == null) { log.warn(Util.getMessage("SenderNotFound"), local_addr, sender); return; } if(!entry.updateLastTimestamp(timestamp)) return; Message rsp=win.get(win.getLow() +1); if(rsp != null) { // We need to copy the UnicastHeader and put it back into the message because Message.copy() doesn't copy // the headers and therefore we'd modify the original message in the sender retransmission window // (https://jira.jboss.org/jira/browse/JGRP-965) Message copy=rsp.copy(); UnicastHeader3 hdr=copy.getHeader(this.id); UnicastHeader3 newhdr=hdr.copy(); newhdr.first=true; copy.putHeader(this.id, newhdr); down_prot.down(copy); } }
for(LongTuple<Message> tuple: list) { long seq=tuple.getVal1(); Message msg=win.get(seq); // we *have* to get the message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) oob_batch.add(msg);
protected void handleXmitRequest(Address sender, SeqnoList missing) { if(is_trace) log.trace("%s <-- XMIT(%s: #%s)", local_addr, sender, missing); SenderEntry entry=send_table.get(sender); xmit_reqs_received.add(missing.size()); Table<Message> win=entry != null? entry.msgs : null; if(win != null) { for(long seqno: missing) { Message msg=win.get(seqno); if(msg == null) { if(log.isWarnEnabled() && log_not_found_msgs && !local_addr.equals(sender) && seqno > win.getLow()) log.warn(Util.getMessage("MessageNotFound"), local_addr, sender, seqno); continue; } down_prot.down(msg); xmit_rsps_sent.increment(); } } }
/** Called when the sender of a message is the local member. In this case, we don't need to add the message * to the table as the sender already did that */ protected void handleDataReceivedFromSelf(final Address sender, long seqno, Message msg) { Entry entry=send_table.get(sender); if(entry == null || entry.state() == State.CLOSED) { log.warn("%s: entry not found for %s; dropping message", local_addr, sender); return; } update(entry, 1); final Table<Message> win=entry.msgs; // An OOB message is passed up immediately. Later, when remove() is called, we discard it. This affects ordering ! // http://jira.jboss.com/jira/browse/JGRP-377 if(msg.isFlagSet(Message.Flag.OOB)) { msg=win.get(seqno); // we *have* to get a message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) deliverMessage(msg, sender, seqno); // we don't steal work if the message is internal (https://issues.jboss.org/browse/JGRP-1733) if(msg != null && msg.isFlagSet(Message.Flag.INTERNAL)) { processInternalMessage(win, sender); return; } } removeAndDeliver(win, sender); }
/** * We need to resend the first message with our conn_id * @param sender */ protected void handleResendingOfFirstMessage(Address sender, int timestamp) { log.trace("%s <-- SEND_FIRST_SEQNO(%s)", local_addr, sender); SenderEntry entry=send_table.get(sender); Table<Message> win=entry != null? entry.msgs : null; if(win == null) { log.warn(Util.getMessage("SenderNotFound"), local_addr, sender); return; } if(!entry.updateLastTimestamp(timestamp)) return; Message rsp=win.get(win.getLow() +1); if(rsp != null) { // We need to copy the UnicastHeader and put it back into the message because Message.copy() doesn't copy // the headers and therefore we'd modify the original message in the sender retransmission window // (https://jira.jboss.org/jira/browse/JGRP-965) Message copy=rsp.copy(); UnicastHeader3 hdr=copy.getHeader(this.id); UnicastHeader3 newhdr=hdr.copy(); newhdr.first=true; copy.putHeader(this.id, newhdr); down_prot.down(copy); } }
for(LongTuple<Message> tuple: msgs) { long seq=tuple.getVal1(); Message msg=buf.get(seq); // we *have* to get the message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) oob_batch.add(msg);
/** * Retransmits messsages first_seqno to last_seqno from original_sender from xmit_table to xmit_requester, * called when XMIT_REQ is received. * @param xmit_requester The sender of the XMIT_REQ, we have to send the requested copy of the message to this address * @param missing_msgs A list of seqnos that have to be retransmitted * @param original_sender The member who originally sent the messsage. Guaranteed to be non-null */ protected void handleXmitReq(Address xmit_requester, SeqnoList missing_msgs, Address original_sender) { log.trace("%s: received xmit request from %s for %s%s", local_addr, xmit_requester, original_sender, missing_msgs); if(stats) xmit_reqs_received.add(missing_msgs.size()); Table<Message> buf=xmit_table.get(original_sender); if(buf == null) { log.error(Util.getMessage("SenderNotFound"), local_addr, original_sender); return; } for(long i: missing_msgs) { Message msg=buf.get(i); if(msg == null) { if(log.isWarnEnabled() && log_not_found_msgs && !local_addr.equals(xmit_requester) && i > buf.getLow()) log.warn(Util.getMessage("MessageNotFound"), local_addr, original_sender, i); continue; } if(is_trace) log.trace(local_addr + ": resending " + original_sender + "::" + i); sendXmitRsp(xmit_requester, msg); } }
msg=buf.get(hdr.seqno); // we *have* to get a message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) deliver(msg, sender, hdr.seqno, "OOB message");
for(LongTuple<Message> tuple: list) { long seq=tuple.getVal1(); Message msg=win.get(seq); // we *have* to get the message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) oob_batch.add(msg);
/** Called when the sender of a message is the local member. In this case, we don't need to add the message * to the table as the sender already did that */ protected void handleDataReceivedFromSelf(final Address sender, long seqno, Message msg) { Entry entry=send_table.get(sender); if(entry == null || entry.state() == State.CLOSED) { log.warn("%s: entry not found for %s; dropping message", local_addr, sender); return; } update(entry, 1); final Table<Message> win=entry.msgs; // An OOB message is passed up immediately. Later, when remove() is called, we discard it. This affects ordering ! // http://jira.jboss.com/jira/browse/JGRP-377 if(msg.isFlagSet(Message.Flag.OOB)) { msg=win.get(seqno); // we *have* to get a message, because loopback means we didn't add it to win ! if(msg != null && msg.isFlagSet(Message.Flag.OOB) && msg.setTransientFlagIfAbsent(Message.TransientFlag.OOB_DELIVERED)) deliverMessage(msg, sender, seqno); // we don't steal work if the message is internal (https://issues.jboss.org/browse/JGRP-1733) if(msg != null && msg.isFlagSet(Message.Flag.INTERNAL)) { processInternalMessage(win, sender); return; } } removeAndDeliver(win, sender); }