You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kg...@apache.org on 2018/12/10 16:43:48 UTC

qpid-dispatch git commit: DISPATCH-1154: fix proxy route deletion, improve edge unit tests

Repository: qpid-dispatch
Updated Branches:
  refs/heads/master c9e32ebf6 -> e9b7bd5ae


DISPATCH-1154: fix proxy route deletion, improve edge unit tests


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/e9b7bd5a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/e9b7bd5a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/e9b7bd5a

Branch: refs/heads/master
Commit: e9b7bd5ae7b09df7a83c196443b229ae30b8ff2a
Parents: c9e32eb
Author: Kenneth Giusti <kg...@apache.org>
Authored: Mon Dec 10 11:41:48 2018 -0500
Committer: Kenneth Giusti <kg...@apache.org>
Committed: Mon Dec 10 11:43:32 2018 -0500

----------------------------------------------------------------------
 .../modules/edge_router/link_route_proxy.c      |  9 +-
 tests/system_tests_edge_router.py               | 96 ++++++++++++++++----
 2 files changed, 84 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e9b7bd5a/src/router_core/modules/edge_router/link_route_proxy.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/link_route_proxy.c b/src/router_core/modules/edge_router/link_route_proxy.c
index a5d6172..79f51ed 100644
--- a/src/router_core/modules/edge_router/link_route_proxy.c
+++ b/src/router_core/modules/edge_router/link_route_proxy.c
@@ -343,9 +343,16 @@ static void _link_route_deleted_CT(qdr_core_t *core, qdr_address_t *addr)
     qd_log(core->log, QD_LOG_TRACE,
            "edge deleting proxy link route for '%s'", address);
 
+    size_t len = strlen(&address[1]);  // skip prefix
+    if (QDR_IS_LINK_ROUTE_PREFIX(address[0])) {
+        // see above comment re: prefix handling.  Need to ignore the trailing \#
+        assert(len > 2);
+        len -= 2;
+    }
+
     qd_direction_t dir = QDR_LINK_ROUTE_DIR(address[0]);
     link_route_proxy_t *lrp = DEQ_HEAD(_link_route_proxies);
-    DEQ_FIND(lrp, dir == lrp->direction && strcmp(lrp->address, &address[1]) == 0);
+    DEQ_FIND(lrp, dir == lrp->direction && strncmp(lrp->address, &address[1], len) == 0);
     if (lrp) {
         switch (lrp->proxy_state) {
         case QDR_LINK_ROUTE_PROXY_NEW:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/e9b7bd5a/tests/system_tests_edge_router.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_edge_router.py b/tests/system_tests_edge_router.py
index bbfcd22..b84e214 100644
--- a/tests/system_tests_edge_router.py
+++ b/tests/system_tests_edge_router.py
@@ -670,28 +670,44 @@ class LinkRouteProxyTest(TestCase):
 
         cls.routers = []
 
+        interrouter_port = cls.tester.get_port()
+        cls.INTA_edge_port   = cls.tester.get_port()
+        cls.INTB_edge_port   = cls.tester.get_port()
+
         router('INT.A', 'interior',
-               [('listener', {'role': 'inter-router', 'port': cls.tester.get_port()})])
+               [('listener', {'role': 'inter-router', 'port': interrouter_port}),
+                ('listener', {'role': 'edge', 'port': cls.INTA_edge_port})])
         cls.INT_A = cls.routers[0]
+        cls.INT_A.listener = cls.INT_A.addresses[0]
 
         router('INT.B', 'interior',
                [('connector', {'name': 'connectorToA', 'role': 'inter-router',
-                               'port': cls.INT_A.ports[1]})])
+                               'port': interrouter_port}),
+                ('listener', {'role': 'edge', 'port': cls.INTB_edge_port})])
         cls.INT_B = cls.routers[1]
+        cls.INT_B.listener = cls.INT_B.addresses[0]
 
         router('EA1', 'edge',
                [('listener', {'name': 'rc', 'role': 'route-container',
                               'port': cls.tester.get_port()}),
                 ('connector', {'name': 'uplink', 'role': 'edge',
-                               'port': cls.INT_A.ports[0]}),
+                               'port': cls.INTA_edge_port}),
                 ('linkRoute', {'prefix': 'CfgLinkRoute1', 'containerId': 'FakeBroker', 'direction': 'in'}),
                 ('linkRoute', {'prefix': 'CfgLinkRoute1', 'containerId': 'FakeBroker', 'direction': 'out'})])
         cls.EA1 = cls.routers[2]
+        cls.EA1.listener = cls.EA1.addresses[0]
+        cls.EA1.route_container = cls.EA1.addresses[1]
 
         router('EB1', 'edge',
                [('connector', {'name': 'uplink', 'role': 'edge',
-                               'port': cls.INT_B.ports[0]})])
+                               'port': cls.INTB_edge_port}),
+                ('listener', {'name': 'rc', 'role': 'route-container',
+                              'port': cls.tester.get_port()}),
+                ('linkRoute', {'pattern': '*.cfg.pattern.#', 'containerId': 'FakeBroker', 'direction': 'in'}),
+                ('linkRoute', {'pattern': '*.cfg.pattern.#', 'containerId': 'FakeBroker', 'direction': 'out'})])
         cls.EB1 = cls.routers[3]
+        cls.EB1.listener = cls.EB1.addresses[0]
+        cls.EB1.route_container = cls.EB1.addresses[1]
 
         cls.INT_A.wait_router_connected('INT.B')
         cls.INT_B.wait_router_connected('INT.A')
@@ -708,6 +724,10 @@ class LinkRouteProxyTest(TestCase):
         return list(filter(lambda a: a['name'].find(address) != -1,
                            addrs))
 
+    def _wait_address_gone(self, router, address):
+        while self._get_address(router, address):
+            sleep(0.1)
+
     def _test_traffic(self, sender, receiver, address, count=5):
         tr = AsyncTestReceiver(receiver, address)
         ts = AsyncTestSender(sender, address, count)
@@ -721,20 +741,41 @@ class LinkRouteProxyTest(TestCase):
         Activate the configured link routes via a FakeService, verify proxies
         created by passing traffic from/to and interior router
         """
+        a_type = 'org.apache.qpid.dispatch.router.address'
 
-        fs = FakeService(self.EA1.addresses[1])
+        fs = FakeService(self.EA1.route_container)
         self.INT_B.wait_address("CfgLinkRoute1")
-        self._test_traffic(self.INT_B.addresses[0],
-                           self.INT_B.addresses[0],
+        self._test_traffic(self.INT_B.listener,
+                           self.INT_B.listener,
                            "CfgLinkRoute1/hi",
                            count=5)
         fs.join()
         self.assertEqual(5, fs.in_count)
         self.assertEqual(5, fs.out_count)
 
+        # now that FakeService is gone, the link route should no longer be
+        # active:
+        self._wait_address_gone(self.INT_A, "CfgLinkRoute1")
+
+        # repeat test, but this time with patterns:
+
+        fs = FakeService(self.EB1.route_container)
+        self.INT_A.wait_address("*.cfg.pattern.#")
+        self._test_traffic(self.INT_A.listener,
+                           self.INT_A.listener,
+                           "MATCH.cfg.pattern",
+                           count=5)
+        fs.join()
+        self.assertEqual(5, fs.in_count)
+        self.assertEqual(5, fs.out_count)
+        self._wait_address_gone(self.INT_A, "*.cfg.pattern.#")
+
     def test_conn_link_route_proxy(self):
         """
-        Test connection scoped link routes
+        Test connection scoped link routes by connecting a fake service to the
+        Edge via the route-container connection.  Have the fake service
+        configured some link routes.  Then have clients on the interior
+        exchange messages via the fake service.
         """
         fs = ConnLinkRouteService(self.EA1.addresses[1],
                                   container_id="FakeService",
@@ -749,16 +790,22 @@ class LinkRouteProxyTest(TestCase):
         self.INT_B.wait_address("Conn/*/One")
         self.assertEqual(2, len(self._get_address(self.INT_A, "Conn/*/One")))
 
-        self._test_traffic(self.INT_B.addresses[0],
-                           self.INT_A.addresses[0],
+        # between interiors
+        self._test_traffic(self.INT_B.listener,
+                           self.INT_A.listener,
                            "Conn/BLAB/One",
                            count=5)
+
+        # edge to edge
+        self._test_traffic(self.EB1.listener,
+                           self.EA1.listener,
+                           "Conn/BLECH/One",
+                           count=5)
         fs.join()
-        self.assertEqual(5, fs.in_count)
-        self.assertEqual(5, fs.out_count)
+        self.assertEqual(10, fs.in_count)
+        self.assertEqual(10, fs.out_count)
 
-        # the link route service connection is closed, verify delete
-        self.assertEqual(0, len(self._get_address(self.INT_A, "Conn/*/One")))
+        self._wait_address_gone(self.INT_A, "Conn/*/One")
 
     def test_interior_conn_lost(self):
         """
@@ -783,28 +830,34 @@ class LinkRouteProxyTest(TestCase):
         fs = FakeService(er.addresses[1])
         er.wait_address("Edge1/*")
 
-
         # create the connection to interior
         er_mgmt = er.management
         ctor = er_mgmt.create(type=self.CONNECTOR_TYPE,
                               name='toA',
                               attributes={'role': 'edge',
-                                          'port': self.INT_A.ports[0]})
+                                          'port': self.INTA_edge_port})
         self.INT_B.wait_address("Edge1/*")
 
         # delete it, and verify the routes are removed
         ctor.delete()
-        while self._get_address(self.INT_B, "Edge1/*"):
-            sleep(0.5)
+        self._wait_address_gone(self.INT_B, "Edge1/*")
 
         # now recreate and verify routes re-appear
         ctor = er_mgmt.create(type=self.CONNECTOR_TYPE,
                               name='toA',
                               attributes={'role': 'edge',
-                                          'port': self.INT_A.ports[0]})
+                                          'port': self.INTA_edge_port})
         self.INT_B.wait_address("Edge1/*")
-        er.teardown()
+        self._test_traffic(self.INT_B.listener,
+                           self.INT_B.listener,
+                           "Edge1/One",
+                           count=5)
+        fs.join()
+        self.assertEqual(5, fs.in_count)
+        self.assertEqual(5, fs.out_count)
 
+        er.teardown()
+        self._wait_address_gone(self.INT_B, "Edge1/*")
 
     def test_thrashing_link_routes(self):
         """
@@ -833,6 +886,9 @@ class LinkRouteProxyTest(TestCase):
             lr1.delete()
             lr2.delete()
 
+        fs.join()
+        self._wait_address_gone(self.INT_B, "CfgLinkRoute1")
+
 
 class Timeout(object):
     def __init__(self, parent):


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org