From b6b344dccb18ed44500232e492573244b8a6bdf3 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Wed, 9 Jun 2010 10:21:59 +0000 Subject: 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 --- cpp/src/qpid/broker/Bridge.cpp | 26 +++++++++++++++++--------- cpp/src/qpid/broker/Bridge.h | 2 ++ 2 files changed, 19 insertions(+), 9 deletions(-) (limited to 'cpp/src') 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(); }; -- cgit v1.2.1