[ 
https://issues.apache.org/jira/browse/QPID-3757?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gordon Sim resolved QPID-3757.
------------------------------

       Resolution: Fixed
    Fix Version/s: 0.17
    
> Difficult recovery on broker death
> ----------------------------------
>
>                 Key: QPID-3757
>                 URL: https://issues.apache.org/jira/browse/QPID-3757
>             Project: Qpid
>          Issue Type: Bug
>          Components: C++ Client
>    Affects Versions: 0.12
>         Environment: RHEL 4.7 and RHEL 6.2
>            Reporter: Rob Springer
>            Assignee: Gordon Sim
>            Priority: Minor
>             Fix For: 0.17
>
>         Attachments: backtrace, restart_example.cpp
>
>
> When using the old API (which might render this bug as invalid, if the old 
> API is completely deprecated), if the broker dies, it's not possible to 
> recover Subscription and LocalQueue variables unless you follow a precise 
> workaround procedure.  
> The problem is:
>    If the broker dies and is then respawned, if one attempts to reconnect to 
> the new broker and doesn't create a new Session (i.e., use the old one), bad 
> things happen (since Session doesn't yet support resume(), I assume that's 
> expected behavior).
>    If, however, one tries to create new Session, new SubscriptionManager, and 
> new Subscription objects, an assertion failure is generated (backtrace 
> attached).
>    After reading the backtrace, I believe the following is happening:
> 1) In recovery, we attempt to assign a new Subscription to the previous 
> Subscription variable (i.e., "sub = subMgr->subscribe()")
> 2) That causes the refcount for the old Subscription to fall to 0, causing it 
> to be cleaned up.
> 3) As part of that cleanup, the associated SubscriptionImpl object goes to 
> destroy its (std::auto_ptr<ScopedDivert>) demuxRule member.
> 4) That demuxRule member maintains a reference to a Demux object, demuxer, 
> which exists inside the Session object. Since the Session object has been 
> re-created, that old reference is invalid & results in the assertion.
> Thus, we have a fatal circle - we need to create a new Session object to be 
> able to proceed, but when we do so, we render ourselves unable to re-use 
> Subscription variables.
> Gordon proposed a workaround which does solve the problem for me, in 
> practice, and that is to assign "null" Subscription and LocalQueue objects to 
> those variables before re-creating the Session object. Unfortunately, this 
> won't be clear to any new users, so if anyone is still using the old API, 
> they might be likely to encounter it.
> I'll attach an example showing the problem and the fix as well as snippets 
> from my backtrace shortly.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to