private NakReceiverWindow createNakReceiverWindow(Address sender, long initial_seqno) { NakReceiverWindow win=new NakReceiverWindow(sender, this, initial_seqno, timer, use_range_based_retransmitter, xmit_table_num_rows, xmit_table_msgs_per_row, xmit_table_resize_factor, xmit_table_max_compaction_time, false); if(exponential_backoff > 0) win.setRetransmitTimeouts(new ExponentialInterval(exponential_backoff)); else win.setRetransmitTimeouts(new StaticInterval(retransmit_timeouts)); if(xmit_stagger_timeout > 0) win.setXmitStaggerTimeout(xmit_stagger_timeout); return win; }
@ManagedOperation(description="Compacts the retransmission tables") public void compact() { for(Map.Entry<Address,NakReceiverWindow> entry: xmit_table.entrySet()) { NakReceiverWindow win=entry.getValue(); win.compact(); } }
private void reset() { seqno.set(0); for(NakReceiverWindow win: xmit_table.values()) win.destroy(); xmit_table.clear(); }
public String printLossRate() { StringBuilder sb=new StringBuilder(); int num_missing=getPendingXmits(); int num_received=size(); int total=num_missing + num_received; sb.append("total=").append(total).append(" (received=").append(num_received).append(", missing=") .append(num_missing).append(")"); return sb.toString(); }
boolean added=loopback || win.add(hdr.seqno, msg); msg=win.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)) { if(msg.setTransientFlagIfAbsent(Message.OOB_DELIVERED)) { final AtomicBoolean processing=win.getProcessing(); if(!processing.compareAndSet(false, true)) { return; while(true) { List<Message> msgs=win.removeMany(processing, remove_msgs, max_msg_batch_size); if(msgs == null || msgs.isEmpty()) { released_processing=true;
if(local_addr.equals(member)) { win.setHighestDelivered(highest_delivered_seqno); continue; // don't destroy my own window win.destroy(); // stops retransmission
|| win.getHighestDelivered() >= highest_delivered_seqno) // my seqno is >= digest's seqno for sender continue; win.destroy(); // stops retransmission
my_highest_rcvd=recv_win.getHighestReceived(); stability_highest_rcvd=high_seqno_received; recv_win.stable(high_seqno_delivered); // delete all messages with seqnos <= seqno
/** * Returns a message digest: for each member P the highest delivered and received seqno is added */ public Digest getDigest() { final Map<Address,long[]> map=new HashMap<>(); for(Map.Entry<Address,NakReceiverWindow> entry: xmit_table.entrySet()) { Address sender=entry.getKey(); // guaranteed to be non-null (CCHM) NakReceiverWindow win=entry.getValue(); // guaranteed to be non-null (CCHM) long[] seqnos=win.getDigest(); map.put(sender, seqnos); } return new Digest(map); }
@ManagedAttribute public int getXmitTableMissingMessages() { int num=0; for(NakReceiverWindow win: xmit_table.values()) { num+=win.getMissingMessages(); } return num; }
@ManagedAttribute(description="Total number of missing messages") public int getPendingXmitRequests() { int num=0; for(NakReceiverWindow win: xmit_table.values()) { num+=win.getPendingXmits(); } return num; }
try { msg.putHeader(this.id, NakAckHeader.createMessageHeader(msg_id)); win.add(msg_id, msg); break;
boolean added=loopback || win.add(hdr.seqno, msg); msg=win.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)) { if(msg.setTransientFlagIfAbsent(Message.OOB_DELIVERED)) { final AtomicBoolean processing=win.getProcessing(); if(!processing.compareAndSet(false, true)) { return; while(true) { List<Message> msgs=win.removeMany(processing, remove_msgs, max_msg_batch_size); if(msgs == null || msgs.isEmpty()) { released_processing=true;
public String printLossRate() { StringBuilder sb=new StringBuilder(); int num_missing=getPendingXmits(); int num_received=size(); int total=num_missing + num_received; sb.append("total=").append(total).append(" (received=").append(num_received).append(", missing=") .append(num_missing).append(")"); return sb.toString(); }
if(local_addr.equals(member)) { win.setHighestDelivered(highest_delivered_seqno); continue; // don't destroy my own window win.destroy(); // stops retransmission
|| win.getHighestDelivered() >= highest_delivered_seqno) // my seqno is >= digest's seqno for sender continue; win.destroy(); // stops retransmission
my_highest_rcvd=recv_win.getHighestReceived(); stability_highest_rcvd=high_seqno_received; recv_win.stable(high_seqno_delivered); // delete all messages with seqnos <= seqno
/** * Returns a message digest: for each member P the highest delivered and received seqno is added */ public Digest getDigest() { final Map<Address,long[]> map=new HashMap<>(); for(Map.Entry<Address,NakReceiverWindow> entry: xmit_table.entrySet()) { Address sender=entry.getKey(); // guaranteed to be non-null (CCHM) NakReceiverWindow win=entry.getValue(); // guaranteed to be non-null (CCHM) long[] seqnos=win.getDigest(); map.put(sender, seqnos); } return new Digest(map); }
@ManagedAttribute public int getXmitTableMissingMessages() { int num=0; for(NakReceiverWindow win: xmit_table.values()) { num+=win.getMissingMessages(); } return num; }