Class Digest

  • All Implemented Interfaces:
    java.io.Externalizable, java.io.Serializable, Streamable
    Direct Known Subclasses:
    MutableDigest

    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.

    Version:
    $Id: Digest.java,v 1.8.2.1 2008/01/22 10:01:17 belaban Exp $
    Author:
    Bela Ban
    See Also:
    Serialized Form
    • Field Detail

      • EMPTY_DIGEST

        public static final Digest EMPTY_DIGEST
      • log

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

      • Digest

        public Digest()
        Used for externalization
      • Digest

        public Digest​(int size)
      • Digest

        public Digest​(java.util.Map<Address,​Digest.Entry> map)
        Creates a new digest from an existing map by copying the keys and values from map
      • Digest

        public Digest​(Digest d)
      • Digest

        public Digest​(Address sender,
                      long low,
                      long highest_delivered,
                      long highest_received)
      • Digest

        public Digest​(Address sender,
                      long low,
                      long highest_delivered)
    • Method Detail

      • getSenders

        public java.util.Map<Address,​Digest.Entry> getSenders()
        Returns an unmodifiable map, so modifications will result in exceptions
      • equals

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

        public boolean contains​(Address sender)
      • get

        public Digest.Entry get​(Address sender)
        Returns the Entry for the given sender. Note that Entry is immutable
      • 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.
      • highestSequence

        public Digest highestSequence​(Digest other)
      • size

        public int size()
      • lowSeqnoAt

        public long lowSeqnoAt​(Address sender)
      • highestDeliveredSeqnoAt

        public long highestDeliveredSeqnoAt​(Address sender)
      • highestReceivedSeqnoAt

        public long highestReceivedSeqnoAt​(Address sender)
      • isGreaterThanOrEqual

        public boolean isGreaterThanOrEqual​(Digest other)
        Returns true if all senders of the current digest have their seqnos >= the ones from other
        Parameters:
        other -
        Returns:
      • toString

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

        public java.lang.String printHighestDeliveredSeqnos()
      • printHighestReceivedSeqnos

        public java.lang.String printHighestReceivedSeqnos()
      • 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()