org.jgroups.stack

Class AckMcastSenderWindow

public class AckMcastSenderWindow extends Object

Keeps track of ACKs from receivers for each message. When a new message is sent, it is tagged with a sequence number and the receiver set (set of members to which the message is sent) and added to a hashtable (key = sequence number, val = message + receiver set). Each incoming ACK is noted and when all ACKs for a specific sequence number haven been received, the corresponding entry is removed from the hashtable. A retransmission thread periodically re-sends the message point-to-point to all receivers from which no ACKs have been received yet. A view change or suspect message causes the corresponding non-existing receivers to be removed from the hashtable.

This class may need flow control in order to avoid needless retransmissions because of timeouts.

Version: $Revision: 1.9 $

Author: Bela Ban June 9 1999 John Georgiadis May 8 2001

Nested Class Summary
interfaceAckMcastSenderWindow.RetransmitCommand
Called by retransmitter thread whenever a message needs to be re-sent to a destination.
Field Summary
protected static Loglog
Constructor Summary
AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, long[] retransmit_intervals, TimeScheduler sched)
Create and start the retransmitter
AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, TimeScheduler sched)
Create and start the retransmitter
AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, long[] retransmit_intervals)
Create and start the retransmitter
AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd)
Create and start the retransmitter
Method Summary
voidack(long seqno, Address sender)
An ACK has been received from sender.
voidadd(long seqno, Message msg, Vector receivers)
Adds a new message to the hash table.
voidclearStableMessages()
longgetNumberOfResponsesExpected(long seqno)
Returns the number of members for a given entry for which acks have to be received
longgetNumberOfResponsesReceived(long seqno)
Returns the number of members for a given entry for which acks have been received
VectorgetStableMessages()
StringprintDetails(long seqno)
Prints all members plus whether an ack has been received from those members for a given seqno
voidremove(Address obj)
Remove obj from all receiver sets and wake up retransmission thread.
voidreset()
Remove all pending msgs from the hashtable.
longsize()
voidstart()
Start the retransmitter.
voidstop()
Stop the rentransmition and clear all pending msgs.
voidsuspect(Address suspected)
Process with address suspected is suspected: remove it from all receiver sets.
StringtoString()
voidwaitUntilAllAcksReceived(long timeout)
Waits until all outstanding messages have been ACKed by all receivers.

Field Detail

log

protected static final Log log

Constructor Detail

AckMcastSenderWindow

public AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, long[] retransmit_intervals, TimeScheduler sched)
Create and start the retransmitter

Parameters: cmd the callback object for retranmissions retransmit_intervals the interval between two consecutive retransmission attempts sched the external scheduler to use to schedule retransmissions

Throws: IllegalArgumentException if cmd is null

AckMcastSenderWindow

public AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, TimeScheduler sched)
Create and start the retransmitter

Parameters: cmd the callback object for retranmissions sched the external scheduler to use to schedule retransmissions

Throws: IllegalArgumentException if cmd is null

AckMcastSenderWindow

public AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd, long[] retransmit_intervals)
Create and start the retransmitter

Parameters: cmd the callback object for retranmissions retransmit_intervals the interval between two consecutive retransmission attempts

Throws: IllegalArgumentException if cmd is null

AckMcastSenderWindow

public AckMcastSenderWindow(AckMcastSenderWindow.RetransmitCommand cmd)
Create and start the retransmitter

Parameters: cmd the callback object for retranmissions

Throws: IllegalArgumentException if cmd is null

Method Detail

ack

public void ack(long seqno, Address sender)
An ACK has been received from sender. Tag the sender in the hash table as 'received'. If all ACKs have been received, remove the entry all together.

Parameters: seqno The sequence number of the message for which an ACK has been received. sender The sender which sent the ACK

add

public void add(long seqno, Message msg, Vector receivers)
Adds a new message to the hash table.

Parameters: seqno The sequence number associated with the message msg The message (should be a copy!) receivers The set of addresses to which the message was sent and from which consequently an ACK is expected

clearStableMessages

public void clearStableMessages()

getNumberOfResponsesExpected

public long getNumberOfResponsesExpected(long seqno)
Returns the number of members for a given entry for which acks have to be received

getNumberOfResponsesReceived

public long getNumberOfResponsesReceived(long seqno)
Returns the number of members for a given entry for which acks have been received

getStableMessages

public Vector getStableMessages()

Returns: a copy of stable messages, or null (if non available). Removes all stable messages afterwards

printDetails

public String printDetails(long seqno)
Prints all members plus whether an ack has been received from those members for a given seqno

remove

public void remove(Address obj)
Remove obj from all receiver sets and wake up retransmission thread.

Parameters: obj the sender to remove

reset

public void reset()
Remove all pending msgs from the hashtable. Cancel all associated tasks in the retransmission scheduler

size

public long size()

Returns: the number of currently pending msgs

start

public void start()
Start the retransmitter. This has no effect, if the retransmitter was externally provided

stop

public void stop()
Stop the rentransmition and clear all pending msgs.

If this retransmitter has been provided an externally managed scheduler, then just clear all msgs and the associated tasks, else stop the scheduler. In this case the method blocks until the scheduler's thread is dead. Only the owner of the scheduler should stop it.

suspect

public void suspect(Address suspected)
Process with address suspected is suspected: remove it from all receiver sets. This means that no ACKs are expected from this process anymore.

Parameters: suspected The suspected process

toString

public String toString()

waitUntilAllAcksReceived

public void waitUntilAllAcksReceived(long timeout)
Waits until all outstanding messages have been ACKed by all receivers. Takes into account suspicions and view changes. Returns when there are no entries left in the hashtable. While waiting, no entries can be added to the hashtable (they will be discarded).

Parameters: timeout Miliseconds to wait. 0 means wait indefinitely.

Copyright ? 1998-2005 Bela Ban. All Rights Reserved.