org.jgroups.protocols
public class STABLE extends RpcProtocol
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
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:
|
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 |
Returns: this protocol name
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 :-))
Do not use PassDown
in this method as the event is
passed down by default by the superclass after this method returns !
Returns: boolean Defaults to true. If false, event will not be passed down the stack.
Do not use PassUp
in this method as the event is passed
up by default by the superclass after this method returns !
Returns: boolean Defaults to true. If false, event will not be passed up the stack.
Returns: a list of events expected by to be handled from some layer above
Parameters: props the list of parameters