Class GMS


  • public class GMS
    extends Protocol
    Group membership protocol. Handles joins/leaves/crashes (suspicions) and emits new views accordingly. Use VIEW_ENFORCER on top of this layer to make sure new members don't receive any messages until they are members
    Version:
    $Id: GMS.java,v 1.126.2.20.2.3 2009/04/22 06:57:51 belaban Exp $
    Author:
    Bela Ban
    • Field Detail

      • num_prev_mbrs

        protected int num_prev_mbrs
        Max number of old members to keep in history
    • Constructor Detail

      • GMS

        public GMS()
    • Method Detail

      • getName

        public java.lang.String getName()
        Specified by:
        getName in class Protocol
      • getView

        public java.lang.String getView()
      • getNumberOfViews

        public int getNumberOfViews()
      • getLocalAddress

        public java.lang.String getLocalAddress()
      • getMembers

        public java.lang.String getMembers()
      • getNumMembers

        public int getNumMembers()
      • getJoinTimeout

        public long getJoinTimeout()
      • setJoinTimeout

        public void setJoinTimeout​(long t)
      • getJoinRetryTimeout

        public long getJoinRetryTimeout()
        Deprecated.
      • setJoinRetryTimeout

        public void setJoinRetryTimeout​(long t)
        Deprecated.
      • isShun

        public boolean isShun()
      • setShun

        public void setShun​(boolean s)
      • isPrintLocalAddr

        public boolean isPrintLocalAddr()
      • setPrintLocalAddr

        public void setPrintLocalAddr​(boolean print_local_addr)
      • printPreviousMembers

        public java.lang.String printPreviousMembers()
      • getViewAckCollectionTimeout

        public long getViewAckCollectionTimeout()
      • setViewAckCollectionTimeout

        public void setViewAckCollectionTimeout​(long view_ack_collection_timeout)
      • isViewBundling

        public boolean isViewBundling()
      • setViewBundling

        public void setViewBundling​(boolean view_bundling)
      • getMaxBundlingTime

        public long getMaxBundlingTime()
      • setMaxBundlingTime

        public void setMaxBundlingTime​(long max_bundling_time)
      • viewHandlerSize

        public int viewHandlerSize()
      • isViewHandlerSuspended

        public boolean isViewHandlerSuspended()
      • dumpViewHandlerQueue

        public java.lang.String dumpViewHandlerQueue()
      • dumpViewHandlerHistory

        public java.lang.String dumpViewHandlerHistory()
      • suspendViewHandler

        public void suspendViewHandler()
      • resumeViewHandler

        public void resumeViewHandler()
      • printPreviousViews

        public java.lang.String printPreviousViews()
      • isCoordinator

        public boolean isCoordinator()
      • requiredDownServices

        public java.util.Vector<java.lang.Integer> requiredDownServices()
        Description copied from class: Protocol
        List of events that are required to be answered by some layer below.
        Overrides:
        requiredDownServices in class Protocol
        Returns:
        Vector (of Integers)
      • setImpl

        public void setImpl​(GmsImpl new_impl)
      • getImpl

        public GmsImpl getImpl()
      • init

        public void init()
                  throws java.lang.Exception
        Description copied from class: Protocol
        Called after instance has been created (null constructor) and before protocol is started. Properties are already set. Other protocols are not yet connected and events cannot yet be sent.
        Overrides:
        init in class Protocol
        Throws:
        java.lang.Exception - Thrown if protocol cannot be initialized successfully. This will cause the ProtocolStack to fail, so the channel constructor will throw an exception
      • start

        public void start()
                   throws java.lang.Exception
        Description copied from class: Protocol
        This method is called on a Channel.connect(String). Starts work. Protocols are connected and queues are ready to receive events. Will be called from bottom to top. This call will replace the START and START_OK events.
        Overrides:
        start in class Protocol
        Throws:
        java.lang.Exception - Thrown if protocol cannot be started successfully. This will cause the ProtocolStack to fail, so Channel.connect(String) will throw an exception
      • stop

        public void stop()
        Description copied from class: Protocol
        This method is called on a Channel.disconnect(). Stops work (e.g. by closing multicast socket). Will be called from top to bottom. This means that at the time of the method invocation the neighbor protocol below is still working. This method will replace the STOP, STOP_OK, CLEANUP and CLEANUP_OK events. The ProtocolStack guarantees that when this method is called all messages in the down queue will have been flushed
        Overrides:
        stop in class Protocol
      • becomeCoordinator

        public void becomeCoordinator()
      • becomeParticipant

        public void becomeParticipant()
      • becomeClient

        public void becomeClient()
      • getNextView

        public View getNextView​(java.util.Collection<Address> new_mbrs,
                                java.util.Collection<Address> old_mbrs,
                                java.util.Collection<Address> suspected_mbrs)
        Computes the next view. Returns a copy that has old_mbrs and suspected_mbrs removed and new_mbrs added.
      • castViewChangeWithDest

        public void castViewChangeWithDest​(View new_view,
                                           Digest digest,
                                           JoinRsp jr,
                                           java.util.Collection<Address> newMembers)
        Broadcasts the new view and digest, and waits for acks from all members in the list given as argument. If the list is null, we take the members who are part of new_view
        Parameters:
        new_view -
        digest -
        newMembers -
      • sendJoinResponse

        public void sendJoinResponse​(JoinRsp rsp,
                                     Address dest)
      • installView

        public void installView​(View new_view)
      • installView

        public void installView​(View new_view,
                                Digest digest)
        Sets the new view and sends a VIEW_CHANGE event up and down the stack. If the view is a MergeView (subclass of View), then digest will be non-null and has to be set before installing the view.
      • determineCoordinator

        protected Address determineCoordinator()
      • wouldBeNewCoordinator

        protected boolean wouldBeNewCoordinator​(Address potential_new_coord)
        Checks whether the potential_new_coord would be the new coordinator (2nd in line)
      • checkSelfInclusion

        protected boolean checkSelfInclusion​(java.util.Vector<Address> mbrs)
        Returns true if local_addr is member of mbrs, else false
      • makeView

        public View makeView​(java.util.Vector<Address> mbrs)
      • makeView

        public static View makeView​(java.util.Vector<Address> mbrs,
                                    ViewId vid)
      • setDigest

        public void setDigest​(Digest d)
        Send down a SET_DIGEST event
      • mergeDigest

        public void mergeDigest​(Digest d)
        Send down a MERGE_DIGEST event
      • getDigest

        public Digest getDigest()
        Sends down a GET_DIGEST event and waits for the GET_DIGEST_OK response, or timeout, whichever occurs first
      • up

        public java.lang.Object up​(Event evt)
        Description copied from class: Protocol
        An event was received from the layer below. Usually the current layer will want to examine the event type and - depending on its type - perform some computation (e.g. removing headers from a MSG event type, or updating the internal membership list when receiving a VIEW_CHANGE event). Finally the event is either a) discarded, or b) an event is sent down the stack using down_prot.down() or c) the event (or another event) is sent up the stack using up_prot.up().
        Overrides:
        up in class Protocol
      • down

        public java.lang.Object down​(Event evt)
        This method is overridden to avoid hanging on getDigest(): when a JOIN is received, the coordinator needs to retrieve the digest from the NAKACK layer. It therefore sends down a GET_DIGEST event, to which the NAKACK layer responds with a GET_DIGEST_OK event.

        However, the GET_DIGEST_OK event will not be processed because the thread handling the JOIN request won't process the GET_DIGEST_OK event until the JOIN event returns. The receiveUpEvent() method is executed by the up-handler thread of the lower protocol and therefore can handle the event. All we do here is unblock the mutex on which JOIN is waiting, allowing JOIN to return with a valid digest. The GET_DIGEST_OK event is then discarded, because it won't be processed twice.

        Overrides:
        down in class Protocol
      • setProperties

        public boolean setProperties​(java.util.Properties props)
        Setup the Protocol instance according to the configuration string
        Overrides:
        setProperties in class Protocol