diff options
author | Carl C. Trieloff <cctrieloff@apache.org> | 2009-07-07 01:53:13 +0000 |
---|---|---|
committer | Carl C. Trieloff <cctrieloff@apache.org> | 2009-07-07 01:53:13 +0000 |
commit | cbc1284b92c4598409cb671a668ce9a6deae8fc3 (patch) | |
tree | 06b05de0bfa3d379086e06ad6a6f0beeed662aa6 /cpp/src | |
parent | 26cb2d00a4fab187d24c9af9115eb9e126a0d0d2 (diff) | |
download | qpid-python-cbc1284b92c4598409cb671a668ce9a6deae8fc3.tar.gz |
Corrected the case where message on more than one queue does not persist when last node standing is enabled
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@791672 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/qpid/broker/Message.cpp | 10 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Message.h | 1 | ||||
-rw-r--r-- | cpp/src/qpid/broker/Queue.cpp | 2 | ||||
-rw-r--r-- | cpp/src/tests/QueueTest.cpp | 33 |
4 files changed, 43 insertions, 3 deletions
diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp index 6aeb9e47f9..2c3c444baa 100644 --- a/cpp/src/qpid/broker/Message.cpp +++ b/cpp/src/qpid/broker/Message.cpp @@ -59,7 +59,15 @@ Message::~Message() void Message::forcePersistent() { - forcePersistentPolicy = true; + // only set forced bit if we actually need to force. + if (! getAdapter().isPersistent(frames) ){ + forcePersistentPolicy = true; + } +} + +bool Message::isForcedPersistent() +{ + return forcePersistentPolicy; } std::string Message::getRoutingKey() const diff --git a/cpp/src/qpid/broker/Message.h b/cpp/src/qpid/broker/Message.h index cd2513284a..94ce7561a7 100644 --- a/cpp/src/qpid/broker/Message.h +++ b/cpp/src/qpid/broker/Message.h @@ -147,6 +147,7 @@ public: void addTraceId(const std::string& id); void forcePersistent(); + bool isForcedPersistent(); boost::intrusive_ptr<Message>& getReplacementMessage(const Queue* qfor) const; void setReplacementMessage(boost::intrusive_ptr<Message> msg, const Queue* qfor); diff --git a/cpp/src/qpid/broker/Queue.cpp b/cpp/src/qpid/broker/Queue.cpp index 64efc93a22..30b33d877b 100644 --- a/cpp/src/qpid/broker/Queue.cpp +++ b/cpp/src/qpid/broker/Queue.cpp @@ -668,7 +668,7 @@ void Queue::setLastNodeFailure() for ( Messages::iterator i = messages.begin(); i != messages.end(); ++i ) { if (lastValueQueue) checkLvqReplace(*i); i->payload->forcePersistent(); - if (i->payload->getPersistenceId() == 0){ + if (i->payload->isForcedPersistent() ){ enqueue(0, i->payload); } } diff --git a/cpp/src/tests/QueueTest.cpp b/cpp/src/tests/QueueTest.cpp index 5a93533755..7ba3598ea7 100644 --- a/cpp/src/tests/QueueTest.cpp +++ b/cpp/src/tests/QueueTest.cpp @@ -272,20 +272,25 @@ QPID_AUTO_TEST_CASE(testPersistLastNodeStanding){ class TestMessageStoreOC : public NullMessageStore { public: + + uint enqCnt; + uint deqCnt; virtual void dequeue(TransactionContext*, const boost::intrusive_ptr<PersistableMessage>& /*msg*/, const PersistableQueue& /*queue*/) { + deqCnt++; } virtual void enqueue(TransactionContext*, const boost::intrusive_ptr<PersistableMessage>& /*msg*/, const PersistableQueue& /* queue */) { + enqCnt++; } - TestMessageStoreOC() : NullMessageStore() {} + TestMessageStoreOC() : NullMessageStore(),enqCnt(0),deqCnt(0) {} ~TestMessageStoreOC(){} }; @@ -521,6 +526,32 @@ QPID_AUTO_TEST_CASE(testQueueCleaner) { BOOST_CHECK_EQUAL(queue->getMessageCount(), 0u); } +QPID_AUTO_TEST_CASE(testMultiQueueLastNode){ + + TestMessageStoreOC testStore; + client::QueueOptions args; + args.setPersistLastNode(); + + Queue::shared_ptr queue1(new Queue("queue1", true, &testStore )); + queue1->configure(args); + Queue::shared_ptr queue2(new Queue("queue2", true, &testStore )); + queue2->configure(args); + + intrusive_ptr<Message> msg1 = create_message("e", "A"); + + queue1->deliver(msg1); + queue2->deliver(msg1); + + //change mode + queue1->setLastNodeFailure(); + BOOST_CHECK_EQUAL(testStore.enqCnt, 1u); + queue2->setLastNodeFailure(); + BOOST_CHECK_EQUAL(testStore.enqCnt, 2u); + +} + + + QPID_AUTO_TEST_SUITE_END() |