summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/broker/QueueRegistry.cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2016-06-15 08:47:59 +0000
committerGordon Sim <gsim@apache.org>2016-06-15 08:47:59 +0000
commit7ab8ebde50308f76428359c0120473c4d491b55a (patch)
tree8992337581991eb83f728baaab0de351384bf17a /qpid/cpp/src/qpid/broker/QueueRegistry.cpp
parentac0636922f3d15a55b5ede7c01b236c047f9603a (diff)
downloadqpid-python-7ab8ebde50308f76428359c0120473c4d491b55a.tar.gz
QPID-7302: Restart delayed auto-delete timer if the queue is declared
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1748523 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/qpid/broker/QueueRegistry.cpp')
-rw-r--r--qpid/cpp/src/qpid/broker/QueueRegistry.cpp43
1 files changed, 34 insertions, 9 deletions
diff --git a/qpid/cpp/src/qpid/broker/QueueRegistry.cpp b/qpid/cpp/src/qpid/broker/QueueRegistry.cpp
index 1283a42e6d..2101d51fc2 100644
--- a/qpid/cpp/src/qpid/broker/QueueRegistry.cpp
+++ b/qpid/cpp/src/qpid/broker/QueueRegistry.cpp
@@ -74,6 +74,7 @@ QueueRegistry::declare(const string& name, const QueueSettings& settings,
result = std::pair<Queue::shared_ptr, bool>(queue, true);
} else {
result = std::pair<Queue::shared_ptr, bool>(i->second, false);
+ ++(i->second->version);
}
if (getBroker() && getBroker()->getManagementAgent()) {
getBroker()->getManagementAgent()->raiseEvent(
@@ -97,17 +98,41 @@ void QueueRegistry::destroy(
QueueMap::iterator i = queues.find(name);
if (i != queues.end()) {
q = i->second;
- queues.erase(i);
- if (getBroker()) {
- // NOTE: queueDestroy and raiseEvent must be called with the
- // lock held in order to ensure events are generated
- // in the correct order.
- getBroker()->getBrokerObservers().queueDestroy(q);
- if (getBroker()->getManagementAgent())
- getBroker()->getManagementAgent()->raiseEvent(
- _qmf::EventQueueDelete(connectionId, userId, name));
+ eraseLH(i, q, name, connectionId, userId);
+ }
+ }
+}
+
+void QueueRegistry::eraseLH(QueueMap::iterator i, Queue::shared_ptr q, const string& name, const string& connectionId, const string& userId)
+{
+ queues.erase(i);
+ if (getBroker()) {
+ // NOTE: queueDestroy and raiseEvent must be called with the
+ // lock held in order to ensure events are generated
+ // in the correct order.
+ getBroker()->getBrokerObservers().queueDestroy(q);
+ if (getBroker()->getManagementAgent())
+ getBroker()->getManagementAgent()->raiseEvent(
+ _qmf::EventQueueDelete(connectionId, userId, name));
+ }
+}
+
+
+bool QueueRegistry::destroyIfUntouched(const string& name, long version,
+ const string& connectionId, const string& userId)
+{
+ Queue::shared_ptr q;
+ {
+ qpid::sys::RWlock::ScopedWlock locker(lock);
+ QueueMap::iterator i = queues.find(name);
+ if (i != queues.end()) {
+ q = i->second;
+ if (q->version == version) {
+ eraseLH(i, q, name, connectionId, userId);
+ return true;
}
}
+ return false;
}
}