Class GMS

  • All Implemented Interfaces:
    DiagnosticsHandler.ProbeHandler

    public class GMS
    extends Protocol
    implements DiagnosticsHandler.ProbeHandler
    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
    Author:
    Bela Ban
    • Field Detail

      • join_timeout

        protected long join_timeout
      • max_join_attempts

        protected int max_join_attempts
      • all_clients_retry_timeout

        protected int all_clients_retry_timeout
      • leave_timeout

        protected long leave_timeout
      • max_leave_attempts

        protected int max_leave_attempts
      • merge_timeout

        protected long merge_timeout
      • print_local_addr

        protected boolean print_local_addr
      • print_physical_addrs

        protected boolean print_physical_addrs
      • view_bundling

        @Deprecated
        protected boolean view_bundling
        Deprecated.
        Whether view bundling (http://jira.jboss.com/jira/browse/JGRP-144) should be enabled or not. Setting this to false forces each JOIN/LEAVE/SUPSECT request to be handled separately. By default these requests are processed together if they are queued at approximately the same time
      • use_delta_views

        protected boolean use_delta_views
      • max_bundling_time

        @Deprecated
        protected long max_bundling_time
        Deprecated.
      • num_prev_mbrs

        protected int num_prev_mbrs
      • num_prev_views

        protected int num_prev_views
      • view_ack_collection_timeout

        protected long view_ack_collection_timeout
      • use_flush_if_present

        protected boolean use_flush_if_present
      • log_collect_msgs

        protected boolean log_collect_msgs
      • log_view_warnings

        protected boolean log_view_warnings
      • install_view_locally_first

        @Deprecated
        protected boolean install_view_locally_first
        Deprecated.
        true by default
      • print_view_details

        protected boolean print_view_details
      • num_views

        protected int num_views
      • prev_views

        protected BoundedList<java.lang.String> prev_views
        Stores the last 20 views
      • impl_lock

        protected final java.util.concurrent.locks.Lock impl_lock
      • impls

        protected final java.util.Map<java.lang.String,​GmsImpl> impls
      • merger

        protected Merger merger
      • leaver

        protected final Leaver leaver
      • local_addr

        protected Address local_addr
      • tmp_members

        protected final Membership tmp_members
      • joining

        protected final java.util.List<Address> joining
        Members joined but for which no view has been received yet
      • leaving

        protected final java.util.List<Address> leaving
        Members excluded from group, but for which no view has been received yet
      • prev_members

        protected BoundedList<Address> prev_members
        Keeps track of old members (up to num_prev_mbrs)
      • view

        protected volatile View view
      • ltime

        protected long ltime
      • ack_collector

        protected final AckCollector ack_collector
        To collect VIEW_ACKs from all members
      • merge_ack_collector

        protected final AckCollector merge_ack_collector
      • flushProtocolInStack

        protected boolean flushProtocolInStack
      • first_view_sent

        protected boolean first_view_sent
    • Constructor Detail

      • GMS

        public GMS()
    • Method Detail

      • getViewId

        public ViewId getViewId()
      • view

        public View view()
      • getViewAndDigest

        public Tuple<View,​Digest> getViewAndDigest()
        Returns the current view and digest. Try to find a matching digest twice (if not found on the first try)
      • 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 GMS setJoinTimeout​(long t)
      • joinTimeout

        public GMS joinTimeout​(long timeout)
      • leaveTimeout

        public GMS leaveTimeout​(long timeout)
      • setLeaveTimeout

        public GMS setLeaveTimeout​(long t)
      • getMergeTimeout

        public long getMergeTimeout()
      • setMergeTimeout

        public GMS setMergeTimeout​(long timeout)
      • getMaxJoinAttempts

        public int getMaxJoinAttempts()
      • setMaxJoinAttempts

        public GMS setMaxJoinAttempts​(int t)
      • getMaxLeaveAttempts

        public int getMaxLeaveAttempts()
      • setMaxLeaveAttempts

        public GMS setMaxLeaveAttempts​(int t)
      • printViewDetails

        public boolean printViewDetails()
      • printViewDetails

        public GMS printViewDetails​(boolean p)
      • getImplementation

        public java.lang.String getImplementation()
      • isCoord

        public boolean isCoord()
      • isLeaving

        public boolean isLeaving()
      • getMergeId

        public java.lang.String getMergeId()
      • isMergeInProgress

        public boolean isMergeInProgress()
      • getMerger

        public Merger getMerger()
        Only used for internal testing, don't use this method !
      • setMembershipChangePolicy

        public GMS setMembershipChangePolicy​(java.lang.String classname)
      • printMergeIdHistory

        public java.lang.String printMergeIdHistory()
      • printPreviousMembers

        public java.lang.String printPreviousMembers()
      • setPrintLocalAddress

        public GMS setPrintLocalAddress​(boolean flag)
      • setPrintLocalAddr

        public GMS setPrintLocalAddr​(boolean flag)
      • printLocalAddress

        public GMS printLocalAddress​(boolean flag)
      • getViewAckCollectionTimeout

        public long getViewAckCollectionTimeout()
      • setViewAckCollectionTimeout

        public GMS setViewAckCollectionTimeout​(long view_ack_collection_timeout)
      • viewAckCollectionTimeout

        public GMS viewAckCollectionTimeout​(long view_ack_collection_timeout)
      • getViewHandlerSize

        public int getViewHandlerSize()
      • 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()
      • suspect

        public void suspect​(java.lang.String suspected_member)
      • _getMergeId

        public MergeId _getMergeId()
      • setLogCollectMessages

        public GMS setLogCollectMessages​(boolean flag)
      • getLogCollectMessages

        public boolean getLogCollectMessages()
      • requiredDownServices

        public java.util.List<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
      • providedDownServices

        public java.util.List<java.lang.Integer> providedDownServices()
        Description copied from class: Protocol
        List of events that are provided to layers below (they will be handled when sent from down below)
        Overrides:
        providedDownServices in class Protocol
      • 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 JChannel.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 JChannel.connect(String) will throw an exception
      • stop

        public void stop()
        Description copied from class: Protocol
        This method is called on a JChannel.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()
      • fixDigests

        public void fixDigests()
      • cancelMerge

        public void cancelMerge()
      • isMergeTaskRunning

        public boolean isMergeTaskRunning()
      • isMergeKillerRunning

        public boolean isMergeKillerRunning()
      • getNextView

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

        protected java.util.List<Address> computeNewMembership​(java.util.List<Address> current_members,
                                                               java.util.Collection<Address> joiners,
                                                               java.util.Collection<Address> leavers,
                                                               java.util.Collection<Address> suspects)
        Computes the regular membership
      • computeNewMembership

        protected java.util.List<Address> computeNewMembership​(java.util.Collection<java.util.Collection<Address>> subviews)
        Computes a merge membership
      • castViewChangeAndSendJoinRsps

        public void castViewChangeAndSendJoinRsps​(View new_view,
                                                  Digest digest,
                                                  java.util.Collection<Address> expected_acks,
                                                  java.util.Collection<Address> joiners,
                                                  JoinRsp jr)
        Broadcasts the new view and digest as VIEW messages, possibly sends JOIN-RSP messages to joiners and then waits for acks from expected_acks
        Parameters:
        new_view - the new view (View or MergeView)
        digest - the digest, can be null if new_view is not a MergeView
        expected_acks - the members from which to wait for VIEW_ACKs (self will be excluded)
        joiners - the list of members to which to send the join response (jr). If null, no JOIN_RSPs will be sent
        jr - the JoinRsp. If null (or joiners is null), no JOIN_RSPs will be sent
      • sendJoinResponses

        protected void sendJoinResponses​(JoinRsp jr,
                                         java.util.Collection<Address> joiners)
      • sendJoinResponse

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

        protected void sendJoinResponse​(Buffer marshalled_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.
      • getCoord

        protected Address getCoord()
      • determineCoordinator

        protected Address determineCoordinator()
      • determineNextCoordinator

        protected Address determineNextCoordinator()
        Returns the second-in-line
      • createDeltaView

        protected static View createDeltaView​(View current_view,
                                              View next_view)
      • wouldBeNewCoordinator

        protected boolean wouldBeNewCoordinator​(Address potential_new_coord)
        Checks whether the potential_new_coord would be the new coordinator (2nd in line)
      • 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()
        Grabs the current digest from NAKACK{2}
      • _startFlush

        protected boolean _startFlush​(View new_view,
                                      int maxAttempts,
                                      boolean resumeIfFailed,
                                      long randomFloor,
                                      long randomCeiling)
      • up

        public java.lang.Object up​(Event evt)
        Description copied from class: Protocol
        An event was received from the protocol below. Usually the current protocol 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
      • up

        public java.lang.Object up​(Message msg)
        Description copied from class: Protocol
        A single message was received. Protocols may examine the message and do something (e.g. add a header) with it before passing it up.
        Overrides:
        up in class Protocol
      • down

        public java.lang.Object down​(Event evt)
        Description copied from class: Protocol
        An event is to be sent down the stack. A protocol may want to examine its type and perform some action on it, depending on the event's type. If the event is a message MSG, then the protocol may need to add a header to it (or do nothing at all) before sending it down the stack using down_prot.down().
        Overrides:
        down in class Protocol
      • handleProbe

        public java.util.Map<java.lang.String,​java.lang.String> handleProbe​(java.lang.String... keys)
        Description copied from interface: DiagnosticsHandler.ProbeHandler
        Handles a probe. For each key that is handled, the key and its result should be in the returned map.
        Specified by:
        handleProbe in interface DiagnosticsHandler.ProbeHandler
        Returns:
        Map. A map of keys and values. A null return value is permissible.
      • initState

        protected void initState()
      • sendViewAck

        protected void sendViewAck​(Address dest)
      • createViewFromDeltaView

        protected View createViewFromDeltaView​(View current_view,
                                               DeltaView delta_view)
      • writeAddresses

        protected static boolean writeAddresses​(View view,
                                                Digest digest)
      • determineFlags

        protected static short determineFlags​(View view,
                                              Digest digest)
      • marshal

        protected static Buffer marshal​(java.util.Collection<? extends Address> mbrs)
      • marshal

        protected static Buffer marshal​(ViewId view_id)
      • readJoinRsp

        protected JoinRsp readJoinRsp​(byte[] buffer,
                                      int offset,
                                      int length)
      • readMembers

        protected java.util.Collection<? extends Address> readMembers​(byte[] buffer,
                                                                      int offset,
                                                                      int length)
      • readViewAndDigest

        protected Tuple<View,​Digest> readViewAndDigest​(byte[] buffer,
                                                             int offset,
                                                             int length)
      • _readViewAndDigest

        public static Tuple<View,​Digest> _readViewAndDigest​(byte[] buffer,
                                                                  int offset,
                                                                  int length)
                                                           throws java.lang.Exception
        Throws:
        java.lang.Exception
      • readViewId

        protected ViewId readViewId​(byte[] buffer,
                                    int offset,
                                    int length)
      • process

        protected void process​(java.util.Collection<GmsImpl.Request> requests)