You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2009/11/17 11:52:53 UTC

svn commit: r881237 - in /qpid/trunk/qpid/cpp/src: qpid/client/amqp0_10/AddressResolution.cpp qpid/client/amqp0_10/SessionImpl.cpp tests/MessagingSessionTests.cpp

Author: gsim
Date: Tue Nov 17 10:52:53 2009
New Revision: 881237

URL: http://svn.apache.org/viewvc?rev=881237&view=rev
Log:
QPID-664: Cancel all senders and receivers on closing session; check queue/exchange exists before deleting.

Modified:
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
    qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp?rev=881237&r1=881236&r2=881237&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/AddressResolution.cpp Tue Nov 17 10:52:53 2009
@@ -598,7 +598,11 @@
 
 void Queue::checkDelete(qpid::client::AsyncSession& session, CheckMode mode)
 {
-    if (enabled(deletePolicy, mode)) {
+    //Note: queue-delete will cause a session exception if the queue
+    //does not exist, the query here prevents obvious cases of this
+    //but there is a race whenever two deletions are made concurrently
+    //so careful use of the delete policy is recommended at present
+    if (enabled(deletePolicy, mode) && sync(session).queueQuery(name).getQueue() == name) {
         QPID_LOG(debug, "Auto-deleting queue '" << name << "'");
         sync(session).queueDelete(arg::queue=name);
     }
@@ -683,7 +687,12 @@
 
 void Exchange::checkDelete(qpid::client::AsyncSession& session, CheckMode mode)
 {
-    if (enabled(deletePolicy, mode)) {
+    //Note: exchange-delete will cause a session exception if the
+    //exchange does not exist, the query here prevents obvious cases
+    //of this but there is a race whenever two deletions are made
+    //concurrently so careful use of the delete policy is recommended
+    //at present
+    if (enabled(deletePolicy, mode) && !sync(session).exchangeQuery(name).getNotFound()) {
         sync(session).exchangeDelete(arg::exchange=name);
     }
 }

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp?rev=881237&r1=881236&r2=881237&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/SessionImpl.cpp Tue Nov 17 10:52:53 2009
@@ -94,6 +94,20 @@
 
 void SessionImpl::close()
 {
+    //cancel all the senders and receivers (get copy of names and then
+    //make the calls to avoid modifying maps while iterating over
+    //them):
+    std::vector<std::string> s;
+    std::vector<std::string> r;
+    {
+        qpid::sys::Mutex::ScopedLock l(lock);        
+        for (Senders::const_iterator i = senders.begin(); i != senders.end(); ++i) s.push_back(i->first);
+        for (Receivers::const_iterator i = receivers.begin(); i != receivers.end(); ++i) r.push_back(i->first);
+    }
+    for (std::vector<std::string>::const_iterator i = s.begin(); i != s.end(); ++i) getSender(*i).cancel();
+    for (std::vector<std::string>::const_iterator i = r.begin(); i != r.end(); ++i) getReceiver(*i).cancel();
+    
+
     connection.closed(*this);
     session.close();
 }

Modified: qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp?rev=881237&r1=881236&r2=881237&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp Tue Nov 17 10:52:53 2009
@@ -607,10 +607,6 @@
             BOOST_CHECK(!exists(address));
             break;
           case ALWAYS:
-            //Problematic case at present; multiple attempts to delete
-            //will result in all but one attempt failing and killing
-            //the session which is not desirable. TODO: better
-            //implementation of delete policy.
             s.cancel();
             BOOST_CHECK(!exists(address));
             break;



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org