diff options
author | Carl C. Trieloff <cctrieloff@apache.org> | 2009-11-10 19:17:32 +0000 |
---|---|---|
committer | Carl C. Trieloff <cctrieloff@apache.org> | 2009-11-10 19:17:32 +0000 |
commit | 1b4f7d549a7c44ffe5a5e000ca0b3b5d2cdd3e73 (patch) | |
tree | 8c0a6b7e63c675b85e3c4f58a7ade20bb371c343 /cpp/src | |
parent | ac8ea7e7ef33c4f6e0beab1131a66662ca82c8cb (diff) | |
download | qpid-python-1b4f7d549a7c44ffe5a5e000ca0b3b5d2cdd3e73.tar.gz |
Also remove liner search from seek() & add tests
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@834607 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 11 | ||||
-rw-r--r-- | cpp/src/tests/QueueTest.cpp | 52 |
2 files changed, 57 insertions, 6 deletions
diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index a3a7336f35..7087c6b081 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -429,6 +429,7 @@ bool Queue::dispatch(Consumer::shared_ptr c) } } +// Find the next message bool Queue::seek(QueuedMessage& msg, Consumer::shared_ptr c) { Mutex::ScopedLock locker(messageLock); if (!messages.empty() && messages.back().position > c->position) { @@ -436,13 +437,11 @@ bool Queue::seek(QueuedMessage& msg, Consumer::shared_ptr c) { msg = getFront(); return true; } else { - //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; + Messages::iterator pos = findAt(c->position); + if (pos != messages.end() && pos+1 != messages.end()) { + msg = *(pos+1); + return true; } - msg = *pos; - return true; } } listeners.addListener(c); diff --git a/cpp/src/tests/QueueTest.cpp b/cpp/src/tests/QueueTest.cpp index e1645d97e3..6c2adf5c87 100644 --- a/cpp/src/tests/QueueTest.cpp +++ b/cpp/src/tests/QueueTest.cpp @@ -280,6 +280,58 @@ QPID_AUTO_TEST_CASE(testPersistLastNodeStanding){ } + +QPID_AUTO_TEST_CASE(testSeek){ + + Queue::shared_ptr queue(new Queue("my-queue", true)); + + intrusive_ptr<Message> msg1 = create_message("e", "A"); + intrusive_ptr<Message> msg2 = create_message("e", "B"); + intrusive_ptr<Message> msg3 = create_message("e", "C"); + + //enqueue 2 messages + queue->deliver(msg1); + queue->deliver(msg2); + queue->deliver(msg3); + + TestConsumer::shared_ptr consumer(new TestConsumer(false)); + SequenceNumber seq(2); + consumer->position = seq; + + QueuedMessage qm; + queue->dispatch(consumer); + + BOOST_CHECK_EQUAL(msg3.get(), consumer->last.get()); + queue->dispatch(consumer); + queue->dispatch(consumer); // make sure over-run is safe + +} + +QPID_AUTO_TEST_CASE(testSearch){ + + Queue::shared_ptr queue(new Queue("my-queue", true)); + + intrusive_ptr<Message> msg1 = create_message("e", "A"); + intrusive_ptr<Message> msg2 = create_message("e", "B"); + intrusive_ptr<Message> msg3 = create_message("e", "C"); + + //enqueue 2 messages + queue->deliver(msg1); + queue->deliver(msg2); + queue->deliver(msg3); + + SequenceNumber seq(2); + QueuedMessage qm = queue->find(seq); + + BOOST_CHECK_EQUAL(seq.getValue(), qm.position.getValue()); + + queue->acquire(qm); + BOOST_CHECK_EQUAL(queue->getMessageCount(), 2u); + SequenceNumber seq1(3); + QueuedMessage qm1 = queue->find(seq1); + BOOST_CHECK_EQUAL(seq1.getValue(), qm1.position.getValue()); + +} const std::string nullxid = ""; class SimpleDummyCtxt : public TransactionContext {}; |