diff options
| author | Gordon Sim <gsim@apache.org> | 2010-06-09 10:21:59 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2010-06-09 10:21:59 +0000 |
| commit | b6b344dccb18ed44500232e492573244b8a6bdf3 (patch) | |
| tree | 00ee9fa0637b487771c9bdb3677b52f4e94684a1 /cpp/src | |
| parent | 56428d040f004086fd9c22847aec7e3c3ec8fd6a (diff) | |
| download | qpid-python-b6b344dccb18ed44500232e492573244b8a6bdf3.tar.gz | |
Ensure that bindings for dynamic bridges are not propagated over failed sessions.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@952942 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
| -rw-r--r-- | cpp/src/qpid/broker/Bridge.cpp | 26 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/Bridge.h | 2 |
2 files changed, 19 insertions, 9 deletions
diff --git a/cpp/src/qpid/broker/Bridge.cpp b/cpp/src/qpid/broker/Bridge.cpp index 003d508e79..3e632f6659 100644 --- a/cpp/src/qpid/broker/Bridge.cpp +++ b/cpp/src/qpid/broker/Bridge.cpp @@ -153,16 +153,12 @@ void Bridge::create(Connection& c) if (args.i_srcIsLocal) sessionHandler.getSession()->enableReceiverTracking(); } -void Bridge::cancel(Connection& c) +void Bridge::cancel(Connection&) { - if (args.i_srcIsLocal) { - //recreate peer to be sure that the session handler reference - //is valid (it could have been deleted due to a detach) - SessionHandler& sessionHandler = c.getChannel(id); - peer.reset(new framing::AMQP_ServerProxy(sessionHandler.out)); + if (resetProxy()) { + peer->getMessage().cancel(args.i_dest); + peer->getSession().detach(name); } - peer->getMessage().cancel(args.i_dest); - peer->getSession().detach(name); } void Bridge::closed() @@ -310,10 +306,22 @@ void Bridge::sendReorigin() conn->requestIOProcessing(boost::bind(&Bridge::ioThreadPropagateBinding, this, queueName, args.i_src, args.i_key, bindArgs)); } +bool Bridge::resetProxy() +{ + SessionHandler& sessionHandler = conn->getChannel(id); + if (!sessionHandler.getSession()) peer.reset(); + else peer.reset(new framing::AMQP_ServerProxy(sessionHandler.out)); + return peer.get(); +} void Bridge::ioThreadPropagateBinding(const string& queue, const string& exchange, const string& key, FieldTable args) { - peer->getExchange().bind(queue, exchange, key, args); + if (resetProxy()) { + peer->getExchange().bind(queue, exchange, key, args); + } else { + QPID_LOG(error, "Cannot propagate binding for dynamic bridge as session has been detached, deleting dynamic bridge"); + destroy(); + } } bool Bridge::containsLocalTag(const string& tagList) const diff --git a/cpp/src/qpid/broker/Bridge.h b/cpp/src/qpid/broker/Bridge.h index 5f9a46a861..f25d32e7b2 100644 --- a/cpp/src/qpid/broker/Bridge.h +++ b/cpp/src/qpid/broker/Bridge.h @@ -101,6 +101,8 @@ private: mutable uint64_t persistenceId; ConnectionState* connState; Connection* conn; + + bool resetProxy(); }; |
