Package org.jgroups.stack
Class NakReceiverWindow
- java.lang.Object
-
- 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. Methodremove()
removes the first message with a sequence number that is 1 higher thannext_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:
- low: lowest seqno, modified on stable(). On stable(), we purge msgs [low digest.highest_delivered]
- highest_delivered: the highest delivered seqno, updated on remove(). The next message to be removed is highest_delivered + 1
- highest_received: the highest received message, updated on add (if a new message is added, not updated e.g. if a missing msg was received)
- 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
Nested Classes Modifier and Type Class Description static interface
NakReceiverWindow.Listener
-
Constructor Summary
Constructors Constructor Description 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 commandNakReceiverWindow(Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno, long lowest_seqno, TimeScheduler sched)
Creates a new instance with the given retransmit commandNakReceiverWindow(Address sender, Retransmitter.RetransmitCommand cmd, long highest_delivered_seqno, TimeScheduler sched)
Creates a new instance with the given retransmit command
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
add(long seqno, Message msg)
Adds a message according to its seqno (sequence number).void
destroy()
Stop the retransmitter and reset the nak windowMessage
get(long seqno)
Returns the message from xmit_tablelong
getHighestDelivered()
Returns the highest sequence number of a message consumed by the application (byremove()
).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_tablelong
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 windowvoid
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()
-
-
-
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 instancecmd
- The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be startedhighest_delivered_seqno
- The next seqno to remove is highest_delivered_seqno +1lowest_seqno
- The low seqno purgedsched
- 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 instancecmd
- The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be startedhighest_delivered_seqno
- The next seqno to remove is highest_delivered_seqno +1sched
- 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 instancecmd
- The command used to retransmit a missing message, will be invoked by the table. If null, the retransmit thread will not be startedhighest_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:
- seqno is the next to be expected seqno: added to map
- seqno is <= highest_delivered: discard as we've already delivered it
- seqno is smaller than the next expected seqno: missing message, add it
- 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 (byremove()
). 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 classjava.lang.Object
-
printLossRate
public java.lang.String printLossRate()
-
-