org.jgroups.stack
Class NakReceiverWindow

java.lang.Object
  extended by org.jgroups.stack.NakReceiverWindow

public class NakReceiverWindow
extends java.lang.Object

Keeps track of messages according to their sequence numbers. Allows messages to be added out of order, and with gaps between sequence numbers. Method remove() removes the first message with a sequence number that is 1 higher than next_to_remove (this variable is then incremented), or it returns null if no message is present, or if no message's sequence number is 1 higher.

When there is a gap upon adding a message, its seqno will be added to the Retransmitter, which (using a timer) requests retransmissions of missing messages and keeps on trying until the message has been received, or the member who sent the message is suspected. There are 3 variables which keep track of messages:

Note that the first seqno expected is 1. This design is described in doc/design.NAKACK.txt

Example: 1,2,3,5,6,8: low=1, highest_delivered=2 (or 3, depending on whether remove() was called !), highest_received=8

Version:
$Id: NakReceiverWindow.java,v 1.52.2.2 2008/06/09 09:23:08 belaban Exp $
Author:
Bela Ban May 27 1999, May 2004, Jan 2007, John Georgiadis May 8 2001

Nested Class Summary
static interface NakReceiverWindow.Listener
           
 
Field Summary
protected static org.apache.commons.logging.Log log
           
static Message NULL_MSG
          dummy for null values: ConcurrentHashMap doesn't allow null values
 
Constructor Summary
NakReceiverWindow(Address local_addr, Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno, long lowest_seqno, TimeScheduler sched)
           
NakReceiverWindow(Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno)
          Creates a new instance with the given retransmit command
NakReceiverWindow(Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno, long lowest_seqno, TimeScheduler sched)
          Creates a new instance with the given retransmit command
NakReceiverWindow(Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno, TimeScheduler sched)
          Creates a new instance with the given retransmit command
 
Method Summary
 boolean add(long seqno, Message msg)
          Adds a message according to its seqno (sequence number).
 void destroy()
          Stop the retransmitter and reset the nak window
 Message get(long seqno)
          Returns the message from xmit_table
 long getHighestDelivered()
          Returns the highest sequence number of a message consumed by the application (by remove()).
 long getHighestReceived()
          Returns the highest sequence number received so far (which may be higher than the highest seqno delivered so far; e.g., for 1,2,3,5,6 it would be 6.
 java.util.concurrent.locks.ReentrantLock getLock()
           
 double getLossRate()
          Returns the loss rate, which is defined as the number of pending retransmission requests / the total number of messages in xmit_table
 long getLowestSeen()
           
 int getMaxXmitBufSize()
           
 int getPendingXmits()
           
 double getSmoothedLossRate()
           
 boolean hasMessagesToRemove()
           
 java.lang.String printLossRate()
           
 Message remove()
           
 Message removeOOBMessage()
           
 void reset()
          Reset the retransmitter and the nak window
 void setDiscardDeliveredMessages(boolean flag)
           
 void setListener(NakReceiverWindow.Listener l)
           
 void setMaxXmitBufSize(int max_xmit_buf_size)
           
 void setRetransmitTimeouts(Interval timeouts)
           
 int size()
           
 void stable(long seqno)
          Delete all messages <= seqno (they are stable, that is, have been received at all members).
 java.lang.String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

NULL_MSG

public static final Message NULL_MSG
dummy for null values: ConcurrentHashMap doesn't allow null values


log

protected static final org.apache.commons.logging.Log log
Constructor Detail

NakReceiverWindow

public NakReceiverWindow(Address sender,
                         Retransmitter.RetransmitCommand cmd,
                         long highest_delivered_seqno,
                         long lowest_seqno,
                         TimeScheduler sched)
Creates a new instance with the given retransmit command

Parameters:
sender - The sender associated with this instance
cmd - The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be started
highest_delivered_seqno - The next seqno to remove is highest_delivered_seqno +1
lowest_seqno - The low seqno purged
sched - the external scheduler to use for retransmission requests of missing msgs. If it's not provided or is null, an internal

NakReceiverWindow

public NakReceiverWindow(Address local_addr,
                         Address sender,
                         Retransmitter.RetransmitCommand cmd,
                         long highest_delivered_seqno,
                         long lowest_seqno,
                         TimeScheduler sched)

NakReceiverWindow

public NakReceiverWindow(Address sender,
                         Retransmitter.RetransmitCommand cmd,
                         long highest_delivered_seqno,
                         TimeScheduler sched)
Creates a new instance with the given retransmit command

Parameters:
sender - The sender associated with this instance
cmd - The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be started
highest_delivered_seqno - The next seqno to remove is highest_delivered_seqno +1
sched - the external scheduler to use for retransmission requests of missing msgs. If it's not provided or is null, an internal

NakReceiverWindow

public NakReceiverWindow(Address sender,
                         Retransmitter.RetransmitCommand cmd,
                         long highest_delivered_seqno)
Creates a new instance with the given retransmit command

Parameters:
sender - The sender associated with this instance
cmd - The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be started
highest_delivered_seqno - The next seqno to remove is highest_delivered_seqno +1
Method Detail

getLock

public java.util.concurrent.locks.ReentrantLock getLock()

setRetransmitTimeouts

public void setRetransmitTimeouts(Interval timeouts)

setDiscardDeliveredMessages

public void setDiscardDeliveredMessages(boolean flag)

getMaxXmitBufSize

public int getMaxXmitBufSize()

setMaxXmitBufSize

public void setMaxXmitBufSize(int max_xmit_buf_size)

setListener

public void setListener(NakReceiverWindow.Listener l)

getPendingXmits

public int getPendingXmits()

getLossRate

public double getLossRate()
Returns the loss rate, which is defined as the number of pending retransmission requests / the total number of messages in xmit_table

Returns:
The loss rate

getSmoothedLossRate

public double getSmoothedLossRate()

add

public boolean add(long seqno,
                   Message msg)
Adds a message according to its seqno (sequence number).

There are 4 cases where messages are added:

  1. seqno is the next to be expected seqno: added to map
  2. seqno is <= highest_delivered: discard as we've already delivered it
  3. seqno is smaller than the next expected seqno: missing message, add it
  4. seqno is greater than the next expected seqno: add it to map and fill the gaps with null messages for retransmission. Add the seqno to the retransmitter too

Returns:
True if the message was added successfully, false otherwise (e.g. duplicate message)

remove

public Message remove()

removeOOBMessage

public Message removeOOBMessage()

hasMessagesToRemove

public boolean hasMessagesToRemove()

stable

public void stable(long seqno)
Delete all messages <= seqno (they are stable, that is, have been received at all members). Stop when a number > seqno is encountered (all messages are ordered on seqnos).


reset

public void reset()
Reset the retransmitter and the nak window


destroy

public void destroy()
Stop the retransmitter and reset the nak window


getLowestSeen

public long getLowestSeen()
Returns:
the lowest sequence number of a message that has been delivered or is a candidate for delivery (by the next call to remove())

getHighestDelivered

public long getHighestDelivered()
Returns the highest sequence number of a message consumed by the application (by remove()). Note that this is different from the highest deliverable seqno. E.g. in 23,24,26,27,29, the highest delivered message may be 22, whereas the highest deliverable message may be 24 !

Returns:
the highest sequence number of a message consumed by the application (by remove())

getHighestReceived

public long getHighestReceived()
Returns the highest sequence number received so far (which may be higher than the highest seqno delivered so far; e.g., for 1,2,3,5,6 it would be 6.

See Also:
getHighestDelivered()

get

public Message get(long seqno)
Returns the message from xmit_table

Parameters:
seqno -
Returns:
Message from xmit_table

size

public int size()

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

printLossRate

public java.lang.String printLossRate()


Copyright © 1998-2008 Bela Ban. All Rights Reserved.