Author: gsim
Date: Thu May 13 21:10:34 2010
New Revision: 944016

URL: http://svn.apache.org/viewvc?rev=944016&view=rev
Log:
QPID-2588: Ensure we do not make calls on store for a given queue once it has 
been destroyed

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/PersistableMessage.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/PersistableQueue.h
    qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/Queue.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/PersistableMessage.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/PersistableMessage.cpp?rev=944016&r1=944015&r2=944016&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/PersistableMessage.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/PersistableMessage.cpp Thu May 13 
21:10:34 2010
@@ -52,7 +52,7 @@ void PersistableMessage::flush()
     }
     for (syncList::iterator i = copy.begin(); i != copy.end(); ++i) {
         PersistableQueue::shared_ptr q(i->lock());
-        if (q) {
+        if (q && q->isValid()) {
             store->flush(*q);
         }
     } 

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/PersistableQueue.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/PersistableQueue.h?rev=944016&r1=944015&r2=944016&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/PersistableQueue.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/PersistableQueue.h Thu May 13 21:10:34 
2010
@@ -60,6 +60,7 @@ public:
     };
 
     virtual void setExternalQueueStore(ExternalQueueStore* inst) = 0;
+    virtual bool isValid() = 0;
     
     inline ExternalQueueStore* getExternalQueueStore() const {return 
externalQueueStore;};
     

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp?rev=944016&r1=944015&r2=944016&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Queue.cpp Thu May 13 21:10:34 2010
@@ -725,6 +725,7 @@ bool Queue::enqueue(TransactionContext* 
         Messages dequeues;
         {
             Mutex::ScopedLock locker(messageLock);
+            if (deleted) return false;
             policy->tryEnqueue(msg);
             policy->getPendingDequeues(dequeues);
         }
@@ -766,7 +767,7 @@ bool Queue::dequeue(TransactionContext* 
 {
     {
         Mutex::ScopedLock locker(messageLock);
-        if (!isEnqueued(msg)) return false;
+        if (deleted || !isEnqueued(msg)) return false;
         if (!ctxt) { 
             dequeued(msg);
         }
@@ -892,6 +893,7 @@ void Queue::destroy()
             popAndDequeue();
         }
         alternateExchange->decAlternateUsers();
+        deleted = true;
     }
 
     if (store) {
@@ -1169,3 +1171,9 @@ void Queue::checkNotDeleted()
         throw ResourceDeletedException(QPID_MSG("Queue " << getName() << " has 
been deleted."));
     }
 }
+
+bool Queue::isValid()
+{
+    Mutex::ScopedLock locker(messageLock);
+    return !deleted;
+}

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Queue.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Queue.h?rev=944016&r1=944015&r2=944016&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Queue.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Queue.h Thu May 13 21:10:34 2010
@@ -341,6 +341,8 @@ namespace qpid {
              * has been recovered in the prepared state (dtx only)
              */
             void recoverPrepared(boost::intrusive_ptr<Message>& msg);
+
+            bool isValid();
         };
     }
 }



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

Reply via email to