You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2009/10/22 14:53:10 UTC

svn commit: r828674 - in /qpid/trunk/qpid: cpp/src/qpid/broker/ python/tests_0-10/

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-subscribe@qpid.apache.org