org.jgroups.protocols

Class STABLE

Implemented Interfaces:
RequestHandler

public class STABLE
extends RpcProtocol

Computes the broadcast messages that are stable, i.e. have been received by all members. Sends STABLE events up the stack when this is the case. Uses a probabilistic scheme to do so, as described in:
GSGC: An Efficient Gossip-Style Garbage Collection Scheme for Scalable Reliable Multicast, K. Guo et al., 1997.

The only difference is that instead of using counters for an estimation of messages received from each member, we retrieve this actual information from the NAKACK layer (which must be present for the STABLE protocol to work).

Note: the the Event.MSG call path path must be as lightweight as possible. It should not request any lock for which there is a high contention and/or long delay.

 Changes(igeorg - 2.VI.2001):
 i. Thread-safety (in RPC calls most notably on the lines of Gianluca
 Collot's bugfix)
 ii. All slow calls (RPCs, seqnos requests, etc.) placed outside locks
 iii. Removed redundant initialization in adaptation to a higher round
 iv. heard_from[this meber] is always set to true on every new round
 (i.e. on every stability bcast).
 v. Replaced gossip thread with TimeScheduler.Task
 

[[[ TODO(igeorg - 2.VI.2001) i. Faster stability convergence by better selection of gossip subsets (replace Util.pickSubset()). ii. Special mutex on the Event.MSG call path. I.e. remove synchronized(this)> with e.g. synchronized(msg_mutex). ]] TODO

Field Summary

Fields inherited from class org.jgroups.stack.MessageProtocol

_corr, members

Fields inherited from class org.jgroups.stack.Protocol

down_handler, down_prot, down_queue, down_thread, down_thread_prio, log, observer, props, stack, up_handler, up_prot, up_queue, up_thread, up_thread_prio

Method Summary

String
getName()
void
gossip(ViewId view_id, long gossip_round, long[] gossip_seqnos, boolean[] heard, Object sender)
Contains the highest sequence numbers as seen by sender
boolean
handleDownEvent(Event evt)
Callback.
boolean
handleUpEvent(Event evt)
Callback.
Vector
requiredUpServices()
The events expected to be handled from some layer above:
  • GET_MSGS_RECEIVED: NAKACK layer
boolean
setProperties(Properties props)
Set the parameters for this layer.
void
stability(ViewId view_id, long gossip_round, long[] stability_vector, Object sender)
Contains the highest message sequence numbers (for each member) that can safely be deleted (because they have been seen by all members).
void
start()
Start the layer: i.
void
stop()
Stop scheduling the gossip task

Methods inherited from class org.jgroups.stack.RpcProtocol

callRemoteMethod, callRemoteMethod, callRemoteMethod, callRemoteMethod, callRemoteMethods, callRemoteMethods, callRemoteMethods, getName, handle, handleDownEvent, handleUpEvent

Methods inherited from class org.jgroups.stack.MessageProtocol

castMessage, down, handle, handleDownEvent, handleUpEvent, sendMessage, start, stop, up, updateView

Methods inherited from class org.jgroups.stack.Protocol

destroy, down, getDownProtocol, getDownQueue, getName, getProperties, getUpProtocol, getUpQueue, handleSpecialDownEvent, init, passDown, passUp, providedDownServices, providedUpServices, receiveDownEvent, receiveUpEvent, requiredDownServices, requiredUpServices, setDownProtocol, setObserver, setProperties, setPropertiesInternal, setProtocolStack, setUpProtocol, start, startDownHandler, startUpHandler, stop, stopInternal, up

Method Details

getName

public String getName()
Overrides:
getName in interface RpcProtocol

Returns:
this protocol name


gossip

public void gossip(ViewId view_id,
                   long gossip_round,
                   long[] gossip_seqnos,
                   boolean[] heard,
                   Object sender)
Contains the highest sequence numbers as seen by sender

Parameters:
view_id - The view ID in which the gossip was sent. Must be the same as ours, otherwise it is discarded
gossip_round - The round in which the gossip was sent
gossip_seqnos - A vector with the highest sequence numbers as seen by sender
heard - The sender's heard_from array. This allows us to minimize the gossip msgs for a given round as a member does not have to receive gossip msgs from each member, but members pass gossips they've received from others on in their own gossips. E.g. when a member P (of group {P,Q,R}) receives a gossip from R, its own gossip to Q might be {R,P}. Q, who hasn't received a gossip from R, will not need to receive it anymore as it is already sent by P. This simple scheme reduces the number of gossip messages needed.
sender - The sender of the gossip message (obviously :-))


handleDownEvent

public boolean handleDownEvent(Event evt)
Callback. Called by superclass when event may be handled.

Do not use PassDown in this method as the event is passed down by default by the superclass after this method returns !

Overrides:
handleDownEvent in interface RpcProtocol

Returns:
boolean Defaults to true. If false, event will not be passed down the stack.


handleUpEvent

public boolean handleUpEvent(Event evt)
Callback. Called by superclass when event may be handled.

Do not use PassUp in this method as the event is passed up by default by the superclass after this method returns !

Overrides:
handleUpEvent in interface RpcProtocol

Returns:
boolean Defaults to true. If false, event will not be passed up the stack.


requiredUpServices

public Vector requiredUpServices()
The events expected to be handled from some layer above:
  • GET_MSGS_RECEIVED: NAKACK layer
Overrides:
requiredUpServices in interface Protocol

Returns:
a list of events expected by to be handled from some layer above


setProperties

public boolean setProperties(Properties props)
Set the parameters for this layer.
  • subset: the percentage of the group'size to which the msgs_seen_so_far gossip is sent periodically.
  • max_msgs: the max number of msgs to wait for between two consecutive gossipings.
  • max_wait_time: the max time to wait for between two consecutive gossipings.
  • highest_seqno_timeout: time to wait to receive from NAKACK the array of highest deliverable seqnos
Overrides:
setProperties in interface Protocol

Parameters:
props - the list of parameters


stability

public void stability(ViewId view_id,
                      long gossip_round,
                      long[] stability_vector,
                      Object sender)
Contains the highest message sequence numbers (for each member) that can safely be deleted (because they have been seen by all members).


start

public void start()
            throws Exception
Start the layer: i. Set the gossip task scheduler ii. Reset the layer's state. iii. Start the gossiping task
Overrides:
start in interface MessageProtocol


stop

public void stop()
Stop scheduling the gossip task
Overrides:
stop in interface MessageProtocol


Copyright B) 2001,2002 www.jgroups.com . All Rights Reserved.