org.jgroups.protocols.pbcast
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.
Method Summary |
void | becomeClient() |
void | becomeCoordinator() |
void | becomeParticipant() |
void | castViewChange(Vector new_mbrs, Vector old_mbrs, Vector suspected_mbrs)
Compute a new view, given the current view, the new members and the suspected/left
members. |
void | castViewChange(View new_view, Digest digest) |
void | castViewChangeWithDest(View new_view, Digest digest, List members)
Broadcasts the new view and digest, and waits for acks from all members in the list given as argument.
|
protected boolean | checkSelfInclusion(Vector mbrs) Returns true if local_addr is member of mbrs, else false |
protected Address | determineCoordinator() |
void | down(Event evt) |
String | dumpViewHandlerHistory() |
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() |
long | getJoinTimeout() |
String | getLocalAddress() |
String | getMembers() |
String | getName() |
View | getNextView(Vector new_mbrs, Vector old_mbrs, Vector suspected_mbrs)
Computes the next view. |
int | getNumberOfViews() |
int | getNumMembers() |
String | getView() |
void | init() |
void | installView(View new_view, Digest digest)
Sets the new view and sends a VIEW_CHANGE event up and down the stack. |
void | installView(View new_view)
Sets the new view and sends a VIEW_CHANGE event up and down the stack. |
boolean | isCoordinator() |
boolean | isShun() |
boolean | isViewHandlerSuspended() |
View | makeView(Vector mbrs) |
View | makeView(Vector mbrs, ViewId vid) |
void | mergeDigest(Digest d) Send down a MERGE_DIGEST event |
String | printPreviousMembers() |
String | printPreviousViews() |
void | receiveUpEvent(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. |
Vector | requiredDownServices() |
void | resetStats() |
void | resumeViewHandler() |
void | setDigest(Digest d) Send down a SET_DIGEST event |
void | setImpl(GmsImpl new_impl) |
void | setJoinRetryTimeout(long t) |
void | setJoinTimeout(long t) |
boolean | setProperties(Properties props) Setup the Protocol instance according to the configuration string |
void | setShun(boolean s) |
void | start() |
void | stop() |
void | suspendViewHandler() |
void | up(Event evt) |
int | viewHandlerSize() |
protected boolean | wouldBeNewCoordinator(Address potential_new_coord) Checks whether the potential_new_coord would be the new coordinator (2nd in line) |
protected int num_prev_mbrs
Max number of old members to keep in history
public final GMS.ViewHandler view_handler
Class to process JOIN, LEAVE and MERGE requests
public GMS()
public void becomeClient()
public void becomeCoordinator()
public void becomeParticipant()
public void castViewChange(Vector new_mbrs, Vector old_mbrs, Vector suspected_mbrs)
Compute a new view, given the current view, the new members and the suspected/left
members. Then simply mcast the view to all members. This is different to the VS GMS protocol,
in which we run a FLUSH protocol which tries to achive consensus on the set of messages mcast in
the current view before proceeding to install the next view.
The members for the new view are computed as follows:
existing leaving suspected joining
1. new_view y n n y
2. tmp_view y y n y
(view_dest)
-
The new view to be installed includes the existing members plus the joining ones and
excludes the leaving and suspected members.
-
A temporary view is sent down the stack as an event. This allows the bottom layer
(e.g. UDP or TCP) to determine the members to which to send a multicast message. Compared
to the new view, leaving members are included since they have are waiting for a
view in which they are not members any longer before they leave. So, if we did not set a
temporary view, joining members would not receive the view (signalling that they have been
joined successfully). The temporary view is essentially the current view plus the joining
members (old members are still part of the current view).
Returns: View The new view
public void castViewChange(
View new_view,
Digest digest)
public void castViewChangeWithDest(
View new_view,
Digest digest, List members)
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 members
protected boolean checkSelfInclusion(Vector mbrs)
Returns true if local_addr is member of mbrs, else false
protected
Address determineCoordinator()
public void down(
Event evt)
public String dumpViewHandlerHistory()
public String dumpViewHandlerQueue()
Sends down a GET_DIGEST event and waits for the GET_DIGEST_OK response, or
timeout, whichever occurs first
public long getJoinRetryTimeout()
public long getJoinTimeout()
public String getLocalAddress()
public String getMembers()
public String getName()
public
View getNextView(Vector new_mbrs, Vector old_mbrs, Vector suspected_mbrs)
Computes the next view. Returns a copy that has old_mbrs
and
suspected_mbrs
removed and new_mbrs
added.
public int getNumberOfViews()
public int getNumMembers()
public String getView()
public void init()
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.
public void installView(
View new_view)
Sets the new view and sends a VIEW_CHANGE event up and down the stack.
public boolean isCoordinator()
public boolean isShun()
public boolean isViewHandlerSuspended()
public
View makeView(Vector mbrs)
public void mergeDigest(
Digest d)
Send down a MERGE_DIGEST event
public String printPreviousMembers()
public String printPreviousViews()
public void receiveUpEvent(
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.
public Vector requiredDownServices()
public void resetStats()
public void resumeViewHandler()
public void setDigest(
Digest d)
Send down a SET_DIGEST event
public void setImpl(
GmsImpl new_impl)
public void setJoinRetryTimeout(long t)
public void setJoinTimeout(long t)
public boolean setProperties(Properties props)
Setup the Protocol instance according to the configuration string
public void setShun(boolean s)
public void start()
public void stop()
public void suspendViewHandler()
public void up(
Event evt)
public int viewHandlerSize()
protected boolean wouldBeNewCoordinator(
Address potential_new_coord)
Checks whether the potential_new_coord would be the new coordinator (2nd in line)
Copyright ? 1998-2005 Bela Ban. All Rights Reserved.