summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2010-06-09 10:21:59 +0000
committerGordon Sim <gsim@apache.org>2010-06-09 10:21:59 +0000
commitb6b344dccb18ed44500232e492573244b8a6bdf3 (patch)
tree00ee9fa0637b487771c9bdb3677b52f4e94684a1 /cpp/src
parent56428d040f004086fd9c22847aec7e3c3ec8fd6a (diff)
downloadqpid-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.cpp26
-rw-r--r--cpp/src/qpid/broker/Bridge.h2
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();
};