From 23880661d6e82428620ebecc22762db225bee48d Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 31 Jan 2013 19:43:40 +0000 Subject: QPID-4555: Fix handling of no-credit consumers in Queue::getNextMessage. This was discovered while investigating QPID-4555 but could affect any consumer using bounded credt. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1441163 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/Consumer.h | 2 ++ cpp/src/qpid/broker/Queue.cpp | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'cpp') diff --git a/cpp/src/qpid/broker/Consumer.h b/cpp/src/qpid/broker/Consumer.h index d21dbb19f0..662b0f937d 100644 --- a/cpp/src/qpid/broker/Consumer.h +++ b/cpp/src/qpid/broker/Consumer.h @@ -86,6 +86,8 @@ class Consumer : public QueueCursor { */ virtual bool isCounted() { return true; } + QueueCursor getCursor() const { return *this; } + void setCursor(const QueueCursor& qc) { static_cast(*this) = qc; } protected: //framing::SequenceNumber position; diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index 9a0e4a96f4..81e26d0b48 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -366,7 +366,8 @@ bool Queue::getNextMessage(Message& m, Consumer::shared_ptr& c) while (true) { //TODO: reduce lock scope Mutex::ScopedLock locker(messageLock); - Message* msg = messages->next(*c); + QueueCursor cursor = c->getCursor(); // Save current position. + Message* msg = messages->next(*c); // Advances c. if (msg) { if (msg->hasExpired()) { QPID_LOG(debug, "Message expired from queue '" << name << "'"); @@ -405,6 +406,7 @@ bool Queue::getNextMessage(Message& m, Consumer::shared_ptr& c) } else { //message(s) are available but consumer hasn't got enough credit QPID_LOG(debug, "Consumer can't currently accept message from '" << name << "'"); + c->setCursor(cursor); // Restore cursor, will try again with credit if (c->preAcquires()) { //let someone else try listeners.populate(set); -- cgit v1.2.1