Author: gsim
Date: Wed Jun  9 10:21:59 2010
New Revision: 952942

URL: http://svn.apache.org/viewvc?rev=952942&view=rev
Log:
Ensure that bindings for dynamic bridges are not propagated over failed 
sessions.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.cpp?rev=952942&r1=952941&r2=952942&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.cpp Wed Jun  9 10:21:59 2010
@@ -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

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.h?rev=952942&r1=952941&r2=952942&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Bridge.h Wed Jun  9 10:21:59 2010
@@ -101,6 +101,8 @@ private:
     mutable uint64_t  persistenceId;
     ConnectionState* connState;
     Connection* conn;
+
+    bool resetProxy();
 };
 
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to