[
http://jira.jboss.com/jira/browse/JGRP-425?page=all ]
Bela Ban resolved JGRP-425.
---------------------------
Resolution: Done
- Added BARRIER protocol (below UNICAST and NAKACK)
- Modified STATE_TRANSFER and STREAMING_STATE_TRANSFER: when flushing is *not* used (with
flushing, traffic is stopped anyway before getting the state, so closing and opening the
barrier to block incoming messages is not necessary), we send down a CLOSE_BARRIER and
wait until all incoming messages have been processed. Then the digest is retrieved and the
state is fetched from the application. When done, we open the barrier again.
Incorrect state transfer in high contention scenarios
-----------------------------------------------------
Key: JGRP-425
URL:
http://jira.jboss.com/jira/browse/JGRP-425
Project: JGroups
Issue Type: Bug
Affects Versions: 2.4
Reporter: Bela Ban
Assigned To: Bela Ban
Fix For: 2.5
State transfer (with digests) works as follows:
- State is requested from a provider
- Provider (1) gets the digest from NAKACK (below) and then (2) the application state
from the channel (above)
- Between (1) and (2), some multicast message received can alter the state, as follows:
- Multicast message M is received
- At the same time, a state request is received
- To handle the state request, we ask NAKACK for the digest
- The digest contains M
- Now - before M is passed up - the digest is returned to STATE_TRANSFER and we fetch
the state
*WITHOUT* M ! When the state requester gets the state&digest, it will reject a
resent M because it thinks
it is in its state (because it is in its digest), however M is not part of the state
!
Other issue:
- M is received after the digest has been retrieved by STATE_TRANSFER, but then M passes
the state transfer and is received by the channel and applied to the state *before* the
state request can fetch the state. Now M is *not* part of the digest, but it *is* part of
the state !
SOLUTION:
- When getting the digest, set a flag (in NAKACK) such that all subsequent multicast
up-messages are blocked (or add them into a bounded FIFO list)
- Fetch the state from the channel (the application)
- Unblock NAKACK (send down an UNBLOCK event)
- Return the state&digest to the state requester
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira