[
http://jira.jboss.com/jira/browse/JGRP-774?page=comments#action_12415582 ]
Bela Ban commented on JGRP-774:
-------------------------------
Okay, the cause is this (A is the state provider, B the requester):
- A gets the unicast GET-STATE request
- This acquires a lock on the AckReceiverWindow for B
- The GET-STATE request is passed up
- The app provides the state and sends it back to B *in the same thread*
- Since the state is large, FRAG2 breaks it into smaller fragments messages)
- One of those messages gets blocked in FC.down() (above UNICAST), as we're out of
credits
- B sends new credits to A, but A will *not* receive them as those credits (as *OOB*
message) have to pass through UNICAST first
- However, UNICAST won't let the CREDIT message pass as the original GET-STATE request
stilll holds the lock for B's AckReceiverWindow !
SOLUTION:
- OOB requests should *never* have to acquire the lock on an AckreceiverWindow; we simply
add the request to the AckReceiverWindow, pass up the message, and then return
- This way, OOB messages will never block on other (unrelated) messages in UNICAST
TODO: apply the same code changes to NAKACK (see sub-issue)
STATE_TRANSFER: state transfer broken for large states
------------------------------------------------------
Key: JGRP-774
URL:
http://jira.jboss.com/jira/browse/JGRP-774
Project: JGroups
Issue Type: Bug
Reporter: Bela Ban
Assigned To: Bela Ban
Priority: Critical
Fix For: 2.7, 2.6.3
To reproduce:
Shell #1:
jt LargeState -provider -size 10000000 -props udp.xml
Shell #2:
jt LargeState -props udp.xml
This fails with a state around 10MB, smaller states pass.
Note that this only fails for STATE_TRANSFER, if we switch to STREAMING_STATE_TRANSFER,
it passes !
--
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