org.jgroups.protocols.pbcast
Class Digest

java.lang.Object
  extended by org.jgroups.protocols.pbcast.Digest
All Implemented Interfaces:
java.io.Externalizable, java.io.Serializable, Streamable

public class Digest
extends java.lang.Object
implements java.io.Externalizable, Streamable

A message digest, which is used by the PBCAST layer for gossiping (also used by NAKACK for keeping track of current seqnos for all members). It contains pairs of senders and a range of seqnos (low and high), where each sender is associated with its highest and lowest seqnos seen so far. That is, the lowest seqno which was not yet garbage-collected and the highest that was seen so far and is deliverable (or was already delivered) to the application. A range of [0 - 0] means no messages have been received yet.

April 3 2001 (bela): Added high_seqnos_seen member. It is used to disseminate information about the last (highest) message M received from a sender P. Since we might be using a negative acknowledgment message numbering scheme, we would never know if the last message was lost. Therefore we periodically gossip and include the last message seqno. Members who haven't seen it (e.g. because msg was dropped) will request a retransmission. See DESIGN for details.

Author:
Bela Ban
See Also:
Serialized Form

Nested Class Summary
static class Digest.Entry
          Class keeping track of the lowest and highest sequence numbers delivered, and the highest sequence numbers received, per member
 
Field Summary
protected static org.apache.commons.logging.Log log
           
 
Constructor Summary
Digest()
           
Digest(int size)
           
 
Method Summary
 void add(Address sender, long low_seqno, long high_seqno)
           
 void add(Address sender, long low_seqno, long high_seqno, long high_seqno_seen)
           
 void add(Digest d)
           
 void clear()
           
 boolean contains(Address sender)
           
 Digest copy()
           
 boolean equals(java.lang.Object obj)
           
 Digest.Entry get(Address sender)
           
 long highSeqnoAt(Address sender)
           
 long highSeqnoSeenAt(Address sender)
           
 void incrementHighSeqno(Address sender)
          Increments the sender's high_seqno by 1.
 long lowSeqnoAt(Address sender)
           
 void merge(Address sender, long low_seqno, long high_seqno, long high_seqno_seen)
          Similar to add(), but if the sender already exists, its seqnos will be modified (no new entry) as follows: this.low_seqno=min(this.low_seqno, low_seqno) this.high_seqno=max(this.high_seqno, high_seqno) this.high_seqno_seen=max(this.high_seqno_seen, high_seqno_seen) If the sender doesn not exist, a new entry will be added (provided there is enough space)
 void merge(Digest d)
          Adds a digest to this digest.
 java.lang.String printHighSeqnos()
           
 java.lang.String printHighSeqnosSeen()
           
 void readExternal(java.io.ObjectInput in)
           
 void readFrom(java.io.DataInputStream in)
          Read the state of the current object (including superclasses) from instream Note that the input stream must not be closed
 void replace(Digest d)
           
 void resetAt(Address sender)
          Resets the seqnos for the sender at 'index' to 0.
 boolean sameSenders(Digest other)
          Compares two digests and returns true if the senders are the same, otherwise false.
 long serializedSize()
           
 boolean set(Address sender, long low_seqno, long high_seqno, long high_seqno_seen)
           
 void setHighestDeliveredAndSeenSeqnos(Address sender, long high_seqno, long high_seqno_seen)
           
 void setHighSeqnoAt(Address sender, long high_seqno)
           
 void setHighSeqnoSeenAt(Address sender, long high_seqno_seen)
           
 int size()
           
 java.lang.String toString()
           
 void writeExternal(java.io.ObjectOutput out)
           
 void writeTo(java.io.DataOutputStream out)
          Write the entire state of the current object (including superclasses) to outstream.
 
Methods inherited from class java.lang.Object
clone, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

log

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

Digest

public Digest()

Digest

public Digest(int size)
Method Detail

equals

public boolean equals(java.lang.Object obj)
Overrides:
equals in class java.lang.Object

add

public void add(Address sender,
                long low_seqno,
                long high_seqno)

add

public void add(Address sender,
                long low_seqno,
                long high_seqno,
                long high_seqno_seen)

add

public void add(Digest d)

replace

public void replace(Digest d)

get

public Digest.Entry get(Address sender)

set

public boolean set(Address sender,
                   long low_seqno,
                   long high_seqno,
                   long high_seqno_seen)

merge

public void merge(Digest d)
Adds a digest to this digest. This digest must have enough space to add the other digest; otherwise an error message will be written. For each sender in the other digest, the merge() method will be called.


merge

public void merge(Address sender,
                  long low_seqno,
                  long high_seqno,
                  long high_seqno_seen)
Similar to add(), but if the sender already exists, its seqnos will be modified (no new entry) as follows:
  1. this.low_seqno=min(this.low_seqno, low_seqno)
  2. this.high_seqno=max(this.high_seqno, high_seqno)
  3. this.high_seqno_seen=max(this.high_seqno_seen, high_seqno_seen)
If the sender doesn not exist, a new entry will be added (provided there is enough space)


contains

public boolean contains(Address sender)

sameSenders

public boolean sameSenders(Digest other)
Compares two digests and returns true if the senders are the same, otherwise false.

Parameters:
other -
Returns:
True if senders are the same, otherwise false.

incrementHighSeqno

public void incrementHighSeqno(Address sender)
Increments the sender's high_seqno by 1.


size

public int size()

resetAt

public void resetAt(Address sender)
Resets the seqnos for the sender at 'index' to 0. This happens when a member has left the group, but it is still in the digest. Resetting its seqnos ensures that no-one will request a message retransmission from the dead member.


clear

public void clear()

lowSeqnoAt

public long lowSeqnoAt(Address sender)

highSeqnoAt

public long highSeqnoAt(Address sender)

highSeqnoSeenAt

public long highSeqnoSeenAt(Address sender)

setHighSeqnoAt

public void setHighSeqnoAt(Address sender,
                           long high_seqno)

setHighSeqnoSeenAt

public void setHighSeqnoSeenAt(Address sender,
                               long high_seqno_seen)

setHighestDeliveredAndSeenSeqnos

public void setHighestDeliveredAndSeenSeqnos(Address sender,
                                             long high_seqno,
                                             long high_seqno_seen)

copy

public Digest copy()

toString

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

printHighSeqnos

public java.lang.String printHighSeqnos()

printHighSeqnosSeen

public java.lang.String printHighSeqnosSeen()

writeExternal

public void writeExternal(java.io.ObjectOutput out)
                   throws java.io.IOException
Specified by:
writeExternal in interface java.io.Externalizable
Throws:
java.io.IOException

readExternal

public void readExternal(java.io.ObjectInput in)
                  throws java.io.IOException,
                         java.lang.ClassNotFoundException
Specified by:
readExternal in interface java.io.Externalizable
Throws:
java.io.IOException
java.lang.ClassNotFoundException

writeTo

public void writeTo(java.io.DataOutputStream out)
             throws java.io.IOException
Description copied from interface: Streamable
Write the entire state of the current object (including superclasses) to outstream. Note that the output stream must not be closed

Specified by:
writeTo in interface Streamable
Throws:
java.io.IOException

readFrom

public void readFrom(java.io.DataInputStream in)
              throws java.io.IOException,
                     java.lang.IllegalAccessException,
                     java.lang.InstantiationException
Description copied from interface: Streamable
Read the state of the current object (including superclasses) from instream Note that the input stream must not be closed

Specified by:
readFrom in interface Streamable
Throws:
java.io.IOException
java.lang.IllegalAccessException
java.lang.InstantiationException

serializedSize

public long serializedSize()


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