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
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
view_id
- The view ID in which the gossip was sent. Must be the
same as ours, otherwise it is discardedgossip_round
- The round in which the gossip was sentgossip_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 !
- handleDownEvent in interface RpcProtocol
- 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 !
- handleUpEvent in interface RpcProtocol
- 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
- requiredUpServices in interface Protocol
- 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
- setProperties in interface Protocol
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
- start in interface MessageProtocol