org.jgroups.protocols.pbcast
Class GMS

java.lang.Object
  extended by org.jgroups.stack.Protocol
      extended by 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

Nested Class Summary
static class GMS.GmsHeader
           
 
Field Summary
static java.lang.String name
           
protected  int num_prev_mbrs
          Max number of old members to keep in history
 
Fields inherited from class org.jgroups.stack.Protocol
down_prot, log, props, stack, stats, up_prot
 
Constructor Summary
GMS()
           
 
Method Summary
 void becomeClient()
           
 void becomeCoordinator()
           
 void becomeParticipant()
           
 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.
protected  boolean checkSelfInclusion(java.util.Vector<Address> mbrs)
          Returns true if local_addr is member of mbrs, else false
protected  Address determineCoordinator()
           
 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.
 java.lang.String dumpViewHandlerHistory()
           
 java.lang.String dumpViewHandlerQueue()
           
 Digest getDigest()
          Sends down a GET_DIGEST event and waits for the GET_DIGEST_OK response, or timeout, whichever occurs first
 GmsImpl getImpl()
           
 long getJoinRetryTimeout()
          Deprecated.  
 long getJoinTimeout()
           
 java.lang.String getLocalAddress()
           
 long getMaxBundlingTime()
           
 java.lang.String getMembers()
           
 java.lang.String getName()
           
 View getNextView(java.util.Collection<Address> new_mbrs, java.util.Collection<Address> old_mbrs, java.util.Collection<Address> suspected_mbrs)
          Computes the next view.
 int getNumberOfViews()
           
 int getNumMembers()
           
 java.lang.String getView()
           
 long getViewAckCollectionTimeout()
           
 void init()
          Called after instance has been created (null constructor) and before protocol is started.
 void installView(View new_view)
           
 void installView(View new_view, Digest digest)
          Sets the new view and sends a VIEW_CHANGE event up and down the stack.
 boolean isCoordinator()
           
 boolean isPrintLocalAddr()
           
 boolean isShun()
           
 boolean isViewBundling()
           
 boolean isViewHandlerSuspended()
           
 View makeView(java.util.Vector<Address> mbrs)
           
static View makeView(java.util.Vector<Address> mbrs, ViewId vid)
           
 void mergeDigest(Digest d)
          Send down a MERGE_DIGEST event
 java.lang.String printPreviousMembers()
           
 java.lang.String printPreviousViews()
           
 java.util.Vector<java.lang.Integer> requiredDownServices()
          List of events that are required to be answered by some layer below.
 void resetStats()
           
 void resumeViewHandler()
           
 void sendJoinResponse(JoinRsp rsp, Address dest)
           
 void setDigest(Digest d)
          Send down a SET_DIGEST event
 void setImpl(GmsImpl new_impl)
           
 void setJoinRetryTimeout(long t)
          Deprecated.  
 void setJoinTimeout(long t)
           
 void setMaxBundlingTime(long max_bundling_time)
           
 void setPrintLocalAddr(boolean print_local_addr)
           
 boolean setProperties(java.util.Properties props)
          Setup the Protocol instance according to the configuration string
 void setShun(boolean s)
           
 void setViewAckCollectionTimeout(long view_ack_collection_timeout)
           
 void setViewBundling(boolean view_bundling)
           
 void start()
          This method is called on a Channel.connect(String).
 void stop()
          This method is called on a Channel.disconnect().
 void suspendViewHandler()
           
 java.lang.Object up(Event evt)
          An event was received from the layer below.
 int viewHandlerSize()
           
protected  boolean wouldBeNewCoordinator(Address potential_new_coord)
          Checks whether the potential_new_coord would be the new coordinator (2nd in line)
 
Methods inherited from class org.jgroups.stack.Protocol
destroy, downThreadEnabled, dumpStats, enableStats, getDownProtocol, getProperties, getProtocolStack, getThreadFactory, getTransport, getUpProtocol, printStats, providedDownServices, providedUpServices, requiredUpServices, setDownProtocol, setPropertiesInternal, setProtocolStack, setUpProtocol, statsEnabled, upThreadEnabled
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

num_prev_mbrs

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


name

public static final java.lang.String name
See Also:
Constant Field Values
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()

resetStats

public void resetStats()
Overrides:
resetStats in class Protocol

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


Copyright ? 1998-2008 Bela Ban. All Rights Reserved.