[jboss-jira] [JBoss JIRA] Assigned: (JGRP-335) Hangs with FLUSH

Bela Ban (JIRA) jira-events at jboss.com
Tue Oct 3 04:34:41 EDT 2006


     [ http://jira.jboss.com/jira/browse/JGRP-335?page=all ]

Bela Ban reassigned JGRP-335:
-----------------------------

    Assignee: Vladimir Blagojevic  (was: Bela Ban)

> Hangs with FLUSH
> ----------------
>
>                 Key: JGRP-335
>                 URL: http://jira.jboss.com/jira/browse/JGRP-335
>             Project: JGroups
>          Issue Type: Bug
>    Affects Versions: 2.3 SP1
>            Reporter: Bela Ban
>         Assigned To: Vladimir Blagojevic
>             Fix For: 2.4
>
>
> 2 use cases where we can run into the problem (members A and B).
> #1 View change
>     * A is running, B joins
>     * B is *not* blocking in FLUSH, A is blocking after START_FLUSH
>     * A starts the flush
>     * A returns the new view to B in a JOIN_RSP. This causes B's Channel.connect() to return
>     * B sends a unicast message to A, to which A sends a response *in the same thread* (service STATE_REQ)
>     * A competes the flush, multicasting a STOP_FLUSH message
>     * The STATE_REQ at A hangs on FLUSH.down()
>     * The STOP_FLUSH at A can never unblock FLUSH.down() because it was received *after* the STATE_REQ from B !
> SOLUTION:
>    1. Make B block in FLUSH.down() as soon as the client sends the JOIN_REQ to A
>    2. Make STOP_FLUSH *synchronous*. This means we only return from Channel.connect() (for example) once every member has ack'ed the STOP_FLUSH. See next issue (state transfer) for a description of what happens if we don't do this.
> #2 State transfer
>     * A and B are members of the group
>     * B calls Channel.getState()
>     * A and B receive a START_FLUSH, start the block in FLUSH
>     * State is transferred from A to B
>     * B multicasts a STOP_FLUSH and *immediately afterwards* sends a *unicast* message (which can 'pass' multicast messages, as they're unrelated)
>     * A happens to receive the unicast message *before* the STOP_FLUSH. The unicast blocks and the STOP_FLUSH, which would unblock it, cannot be delivered
> SOLUTION:
>    1. Same as solution 2 above. If we make the STOP_FLUSH phase synchronous, connect() or getState() only return once everyone has been unblocked
> LONG TERM SOLUTION:
>     * The much better solution of course is to make the STOP_FLUSH message *out-of-band*, so it can be delivered in parallel to other messages, and is not blocked (e.g.) by the unicast in the queue. So even if the unicast message was blocked waiting for STOP_FLUSH, once STOP_FLUSH has been received, it will be delivered, causing the unicast to unblock
>     * Once we have this solution in place (2.5, threadless stack and out-of-band messages), we can revert the STOP_FLUSH to only use 1 phase rather than 2

-- 
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

        



More information about the jboss-jira mailing list