Class GMS

java.lang.Object
org.jgroups.stack.Protocol
org.jgroups.protocols.pbcast.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 Details

    • num_prev_mbrs

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

      public static final String name
      See Also:
  • Constructor Details

    • GMS

      public GMS()
  • Method Details

    • getName

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

      public String getView()
    • getNumberOfViews

      public int getNumberOfViews()
    • getLocalAddress

      public String getLocalAddress()
    • getMembers

      public 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 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 String dumpViewHandlerQueue()
    • dumpViewHandlerHistory

      public String dumpViewHandlerHistory()
    • suspendViewHandler

      public void suspendViewHandler()
    • resumeViewHandler

      public void resumeViewHandler()
    • printPreviousViews

      public String printPreviousViews()
    • isCoordinator

      public boolean isCoordinator()
    • resetStats

      public void resetStats()
      Overrides:
      resetStats in class Protocol
    • requiredDownServices

      public Vector<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 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:
      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 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:
      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(Collection<Address> new_mbrs, Collection<Address> old_mbrs, 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, 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(Vector<Address> mbrs)
      Returns true if local_addr is member of mbrs, else false
    • makeView

      public View makeView(Vector<Address> mbrs)
    • makeView

      public static View makeView(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 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 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(Properties props)
      Setup the Protocol instance according to the configuration string
      Overrides:
      setProperties in class Protocol