diff options
author | Gordon Sim <gsim@apache.org> | 2008-02-14 11:49:17 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2008-02-14 11:49:17 +0000 |
commit | 02507ea2ad2f9f826f99b68c3daccaa88ad0748c (patch) | |
tree | c28134fa81bf79bc048c79439e15ffbfb6721306 /cpp/src/qpid/broker/Queue.cpp | |
parent | 299cb36acd8d12611f5b0daa28f03ffd004f0500 (diff) | |
download | qpid-python-02507ea2ad2f9f826f99b68c3daccaa88ad0748c.tar.gz |
Fixed bug in browsing that failed to deal correctly with 'gaps' in message sequence.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@627718 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/Queue.cpp')
-rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index c7dd656a4e..d34ca06364 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -170,12 +170,17 @@ void Queue::requeue(const QueuedMessage& msg){ bool Queue::acquire(const QueuedMessage& msg) { Mutex::ScopedLock locker(messageLock); + QPID_LOG(debug, "attempting to acquire " << msg.position); for (Messages::iterator i = messages.begin(); i != messages.end(); i++) { if (i->position == msg.position) { messages.erase(i); + QPID_LOG(debug, "Match found, acquire succeeded: " << i->position << " == " << msg.position); return true; + } else { + QPID_LOG(debug, "No match: " << i->position << " != " << msg.position); } } + QPID_LOG(debug, "Acquire failed for " << msg.position); return false; } @@ -255,8 +260,8 @@ bool Queue::browseNextMessage(QueuedMessage& m, Consumer& c) m = msg; return true; } else { - //consumer hasn't got enough credit for the message - QPID_LOG(debug, "Consumer can't currently accept message from '" << name << "'"); + //browser hasn't got enough credit for the message + QPID_LOG(debug, "Browser can't currently accept message from '" << name << "'"); return false; } } else { @@ -304,11 +309,13 @@ bool Queue::seek(QueuedMessage& msg, Consumer& c) { msg = messages.front(); return true; } else { - uint index = (c.position - messages.front().position) + 1; - if (index < messages.size()) { - msg = messages[index]; - return true; - } + //TODO: can improve performance of this search, for now just searching linearly from end + Messages::reverse_iterator pos; + for (Messages::reverse_iterator i = messages.rbegin(); i != messages.rend() && i->position > c.position; i++) { + pos = i; + } + msg = *pos; + return true; } } addListener(c); |