Author: tross Date: Thu Oct 22 12:53:10 2009 New Revision: 828674 URL: http://svn.apache.org/viewvc?rev=828674&view=rev Log: QPID-1732 - When an exchange is deleted, the binding-count for bound queues is not adjusted for deleted bindings.
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/DirectExchange.cpp qpid/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp qpid/trunk/qpid/cpp/src/qpid/broker/FanOutExchange.cpp qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp qpid/trunk/qpid/cpp/src/qpid/broker/TopicExchange.cpp qpid/trunk/qpid/python/tests_0-10/management.py Modified: qpid/trunk/qpid/cpp/src/qpid/broker/DirectExchange.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/DirectExchange.cpp?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/broker/DirectExchange.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/broker/DirectExchange.cpp Thu Oct 22 12:53:10 2009 @@ -80,7 +80,6 @@ propagate = bk.fedBinding.addOrigin(fedOrigin); if (mgmtExchange != 0) { mgmtExchange->inc_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->inc_bindingCount(); } } else { return false; @@ -130,7 +129,6 @@ propagate = bk.fedBinding.delOrigin(); if (mgmtExchange != 0) { mgmtExchange->dec_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->dec_bindingCount(); } } else { return false; Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/broker/Exchange.cpp Thu Oct 22 12:53:10 2009 @@ -306,6 +306,7 @@ if (!origin.empty()) mgmtBinding->set_origin(origin); agent->addObject (mgmtBinding, agent->allocateId(this)); + static_cast<_qmf::Queue*>(mo)->inc_bindingCount(); } } } @@ -314,8 +315,12 @@ Exchange::Binding::~Binding () { - if (mgmtBinding != 0) + if (mgmtBinding != 0) { + ManagementObject* mo = queue->GetManagementObject(); + if (mo != 0) + static_cast<_qmf::Queue*>(mo)->dec_bindingCount(); mgmtBinding->resourceDestroy (); + } } ManagementObject* Exchange::Binding::GetManagementObject () const Modified: qpid/trunk/qpid/cpp/src/qpid/broker/FanOutExchange.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/FanOutExchange.cpp?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/broker/FanOutExchange.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/broker/FanOutExchange.cpp Thu Oct 22 12:53:10 2009 @@ -66,7 +66,6 @@ propagate = fedBinding.addOrigin(fedOrigin); if (mgmtExchange != 0) { mgmtExchange->inc_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->inc_bindingCount(); } } else { return false; @@ -95,7 +94,6 @@ propagate = fedBinding.delOrigin(); if (mgmtExchange != 0) { mgmtExchange->dec_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->dec_bindingCount(); } } else { return false; Modified: qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/broker/HeadersExchange.cpp Thu Oct 22 12:53:10 2009 @@ -82,7 +82,6 @@ if (bindings.add_unless(binding, MatchArgs(queue, args))) { if (mgmtExchange != 0) { mgmtExchange->inc_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->inc_bindingCount(); } routeIVE(); return true; @@ -95,7 +94,6 @@ if (bindings.remove_if(MatchKey(queue, bindingKey))) { if (mgmtExchange != 0) { mgmtExchange->dec_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->dec_bindingCount(); } return true; } else { Modified: qpid/trunk/qpid/cpp/src/qpid/broker/TopicExchange.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/TopicExchange.cpp?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/broker/TopicExchange.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/broker/TopicExchange.cpp Thu Oct 22 12:53:10 2009 @@ -212,7 +212,6 @@ propagate = bk.fedBinding.addOrigin(fedOrigin); if (mgmtExchange != 0) { mgmtExchange->inc_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->inc_bindingCount(); } } } else if (fedOp == fedOpUnbind) { @@ -273,7 +272,6 @@ if(qv.empty()) bindings.erase(bi); if (mgmtExchange != 0) { mgmtExchange->dec_bindingCount(); - ((_qmf::Queue*) queue->GetManagementObject())->dec_bindingCount(); } if (propagate) Modified: qpid/trunk/qpid/python/tests_0-10/management.py URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/python/tests_0-10/management.py?rev=828674&r1=828673&r2=828674&view=diff ============================================================================== --- qpid/trunk/qpid/python/tests_0-10/management.py (original) +++ qpid/trunk/qpid/python/tests_0-10/management.py Thu Oct 22 12:53:10 2009 @@ -317,3 +317,82 @@ conn = self.connect() session = conn.session("my-named-session") session.queue_declare(queue="whatever", exclusive=True, auto_delete=True) + + def test_binding_count_on_queue(self): + self.startQmf() + conn = self.connect() + session = self.session + + QUEUE = "binding_test_queue" + EX_DIR = "binding_test_exchange_direct" + EX_FAN = "binding_test_exchange_fanout" + EX_TOPIC = "binding_test_exchange_topic" + EX_HDR = "binding_test_exchange_headers" + + # + # Create a test queue + # + session.queue_declare(queue=QUEUE, exclusive=True, auto_delete=True) + queue = self.qmf.getObjects(_class="queue", name=QUEUE)[0] + if not queue: + self.fail("Queue not found") + self.assertEqual(queue.bindingCount, 1, "wrong initial binding count") + + # + # Create an exchange of each supported type + # + session.exchange_declare(exchange=EX_DIR, type="direct") + session.exchange_declare(exchange=EX_FAN, type="fanout") + session.exchange_declare(exchange=EX_TOPIC, type="topic") + session.exchange_declare(exchange=EX_HDR, type="headers") + + # + # Bind each exchange to the test queue + # + match = {} + match['x-match'] = "all" + match['key'] = "value" + session.exchange_bind(exchange=EX_DIR, queue=QUEUE, binding_key="key1") + session.exchange_bind(exchange=EX_DIR, queue=QUEUE, binding_key="key2") + session.exchange_bind(exchange=EX_FAN, queue=QUEUE) + session.exchange_bind(exchange=EX_TOPIC, queue=QUEUE, binding_key="key1.#") + session.exchange_bind(exchange=EX_TOPIC, queue=QUEUE, binding_key="key2.#") + session.exchange_bind(exchange=EX_HDR, queue=QUEUE, binding_key="key1", arguments=match) + match['key2'] = "value2" + session.exchange_bind(exchange=EX_HDR, queue=QUEUE, binding_key="key2", arguments=match) + + # + # Verify that the queue's binding count accounts for the new bindings + # + queue.update() + self.assertEqual(queue.bindingCount, 8, + "added bindings not accounted for (expected 8, got %d)" % queue.bindingCount) + + # + # Remove some of the bindings + # + session.exchange_unbind(exchange=EX_DIR, queue=QUEUE, binding_key="key2") + session.exchange_unbind(exchange=EX_TOPIC, queue=QUEUE, binding_key="key2.#") + session.exchange_unbind(exchange=EX_HDR, queue=QUEUE, binding_key="key2") + + # + # Verify that the queue's binding count accounts for the deleted bindings + # + queue.update() + self.assertEqual(queue.bindingCount, 5, + "deleted bindings not accounted for (expected 5, got %d)" % queue.bindingCount) + # + # Delete the exchanges + # + session.exchange_delete(exchange=EX_DIR) + session.exchange_delete(exchange=EX_FAN) + session.exchange_delete(exchange=EX_TOPIC) + session.exchange_delete(exchange=EX_HDR) + + # + # Verify that the queue's binding count accounts for the lost bindings + # + queue.update() + self.assertEqual(queue.bindingCount, 1, + "deleted bindings not accounted for (expected 1, got %d)" % queue.bindingCount) + --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org