org.javagroups.protocols.pbcast
Class Digest

java.lang.Object
  |
  +--org.javagroups.protocols.pbcast.Digest
All Implemented Interfaces:
java.io.Externalizable, java.io.Serializable

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

A message digest, which is used e.g. 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

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)
           
 boolean contains(Address sender)
           
 Digest copy()
           
 int getIndex(Address sender)
           
 long highSeqnoAt(Address sender)
           
 long highSeqnoAt(int index)
           
 long highSeqnoSeenAt(Address sender)
           
 long highSeqnoSeenAt(int index)
           
 void incrementHighSeqno(Address sender)
          Increment the sender's high_seqno by 1
 long lowSeqnoAt(int index)
           
 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 reset(int size)
           
 void resetAt(int index)
          Resets the seqnos for the sender at 'index' to 0.
 Address senderAt(int index)
           
 void setHighSeqnoAt(Address sender, long high_seqno)
           
 void setHighSeqnoAt(int index, long high_seqno)
           
 void setHighSeqnoSeenAt(Address sender, long high_seqno_seen)
           
 void setHighSeqnoSeenAt(int index, long high_seqno_seen)
           
 void setLowSeqnoAt(int index, long low_seqno)
           
 int size()
           
 java.lang.String toString()
           
 void writeExternal(java.io.ObjectOutput out)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

Digest

public Digest()

Digest

public Digest(int size)
Method Detail

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)

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)

getIndex

public int getIndex(Address sender)

contains

public boolean contains(Address sender)

incrementHighSeqno

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

size

public int size()

senderAt

public Address senderAt(int index)

resetAt

public void resetAt(int index)
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.

reset

public void reset(int size)

lowSeqnoAt

public long lowSeqnoAt(int index)

highSeqnoAt

public long highSeqnoAt(int index)

highSeqnoSeenAt

public long highSeqnoSeenAt(int index)

highSeqnoAt

public long highSeqnoAt(Address sender)

highSeqnoSeenAt

public long highSeqnoSeenAt(Address sender)

setLowSeqnoAt

public void setLowSeqnoAt(int index,
                          long low_seqno)

setHighSeqnoAt

public void setHighSeqnoAt(int index,
                           long high_seqno)

setHighSeqnoSeenAt

public void setHighSeqnoSeenAt(int index,
                               long high_seqno_seen)

setHighSeqnoAt

public void setHighSeqnoAt(Address sender,
                           long high_seqno)

setHighSeqnoSeenAt

public void setHighSeqnoSeenAt(Address sender,
                               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

readExternal

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


Copyright © 2001,2002 www.javagroups.com . All Rights Reserved.