summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/broker/Queue.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/Queue.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/Queue.cpp')
-rw-r--r--qpid/cpp/src/qpid/broker/Queue.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/qpid/cpp/src/qpid/broker/Queue.cpp b/qpid/cpp/src/qpid/broker/Queue.cpp
index d90bd1110a..fea5946247 100644
--- a/qpid/cpp/src/qpid/broker/Queue.cpp
+++ b/qpid/cpp/src/qpid/broker/Queue.cpp
@@ -1297,9 +1297,10 @@ boost::shared_ptr<Exchange> Queue::getAlternateExchange()
struct AutoDeleteTask : qpid::sys::TimerTask
{
Queue::shared_ptr queue;
+ long expectedVersion;
AutoDeleteTask(Queue::shared_ptr q, AbsTime fireTime)
- : qpid::sys::TimerTask(fireTime, "DelayedAutoDeletion:"+q->getName()), queue(q) {}
+ : qpid::sys::TimerTask(fireTime, "DelayedAutoDeletion:"+q->getName()), queue(q), expectedVersion(q->version) {}
void fire()
{
@@ -1307,7 +1308,7 @@ struct AutoDeleteTask : qpid::sys::TimerTask
//created, but then became unused again before the task fired;
//in this case ignore this request as there will have already
//been a later task added
- queue->tryAutoDelete();
+ queue->tryAutoDelete(expectedVersion);
}
};
@@ -1320,29 +1321,37 @@ void Queue::scheduleAutoDelete(bool immediate)
broker->getTimer().add(autoDeleteTask);
QPID_LOG(debug, "Timed auto-delete for " << getName() << " initiated");
} else {
- tryAutoDelete();
+ tryAutoDelete(version);
}
}
}
-void Queue::tryAutoDelete()
+void Queue::tryAutoDelete(long expectedVersion)
{
bool proceed(false);
{
Mutex::ScopedLock locker(messageLock);
if (!deleted && checkAutoDelete(locker)) {
proceed = true;
- deleted = true;
}
}
if (proceed) {
- broker->getQueues().destroy(name);
- if (broker->getAcl())
- broker->getAcl()->recordDestroyQueue(name);
+ if (broker->getQueues().destroyIfUntouched(name, expectedVersion)) {
+ {
+ Mutex::ScopedLock locker(messageLock);
+ deleted = true;
+ }
+ if (broker->getAcl())
+ broker->getAcl()->recordDestroyQueue(name);
- QPID_LOG_CAT(debug, model, "Auto-delete queue deleted: " << name << " (" << deleted << ")");
- destroyed();
+ QPID_LOG_CAT(debug, model, "Auto-delete queue deleted: " << name << " (" << deleted << ")");
+ destroyed();
+ } else {
+ //queue was accessed since the delayed auto-delete was scheduled, so try again
+ QPID_LOG_CAT(debug, model, "Auto-delete interrupted for queue: " << name);
+ scheduleAutoDelete();
+ }
} else {
QPID_LOG_CAT(debug, model, "Auto-delete queue could not be deleted: " << name);
}