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 2013/10/22 19:53:50 UTC

svn commit: r1534710 - in /qpid/trunk/qpid/extras/dispatch: include/qpid/dispatch/iterator.h src/iterator.c src/router_node.c tests/field_test.c tests/system_tests_one_router.py

Author: tross
Date: Tue Oct 22 17:53:50 2013
New Revision: 1534710

URL: http://svn.apache.org/r1534710
Log:
QPID-5216 - Cleaned up the format of a router-id in the message annotations.

Modified:
    qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h
    qpid/trunk/qpid/extras/dispatch/src/iterator.c
    qpid/trunk/qpid/extras/dispatch/src/router_node.c
    qpid/trunk/qpid/extras/dispatch/tests/field_test.c
    qpid/trunk/qpid/extras/dispatch/tests/system_tests_one_router.py

Modified: qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h?rev=1534710&r1=1534709&r2=1534710&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h (original)
+++ qpid/trunk/qpid/extras/dispatch/include/qpid/dispatch/iterator.h Tue Oct 22 17:53:50 2013
@@ -76,13 +76,22 @@ typedef struct dx_field_iterator_t dx_fi
  *    amqp:/<mobile>
  *         M^^^^^^^^
  *
+ * ITER_VIEW_NODE_HASH - Isolate the hashable part of a router-id, used for headers
+ *
+ *    <area>/<router>
+ *   A^^^^^^
+ *
+ *    <my_area>/<router>
+ *             R^^^^^^^^
+ *
  */
 typedef enum {
     ITER_VIEW_ALL,
     ITER_VIEW_NO_HOST,
     ITER_VIEW_NODE_ID,
     ITER_VIEW_NODE_SPECIFIC,
-    ITER_VIEW_ADDRESS_HASH
+    ITER_VIEW_ADDRESS_HASH,
+    ITER_VIEW_NODE_HASH
 } dx_iterator_view_t;
 
 

Modified: qpid/trunk/qpid/extras/dispatch/src/iterator.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/iterator.c?rev=1534710&r1=1534709&r2=1534710&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/iterator.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/iterator.c Tue Oct 22 17:53:50 2013
@@ -114,6 +114,29 @@ static void parse_address_view(dx_field_
 }
 
 
+static void parse_node_view(dx_field_iterator_t *iter)
+{
+    //
+    // This function starts with an iterator view that is identical to
+    // ITER_VIEW_NO_HOST.  We will now further refine the view in order
+    // to aid the router in looking up nodes.
+    //
+
+    if (dx_field_iterator_prefix(iter, my_area)) {
+        iter->prefix      = 'R';
+        iter->at_prefix   = 1;
+        iter->view_prefix = 1;
+        iter->mode        = MODE_TO_END;
+        return;
+    }
+
+    iter->prefix      = 'A';
+    iter->at_prefix   = 1;
+    iter->view_prefix = 1;
+    iter->mode        = MODE_TO_SLASH;
+}
+
+
 static void view_initialize(dx_field_iterator_t *iter)
 {
     //
@@ -210,6 +233,12 @@ static void view_initialize(dx_field_ite
         return;
     }
 
+    if (iter->view == ITER_VIEW_NODE_HASH) {
+        iter->mode = MODE_TO_END;
+        parse_node_view(iter);
+        return;
+    }
+
     if (iter->view == ITER_VIEW_NODE_SPECIFIC) {
         iter->mode = MODE_TO_END;
         while (!dx_field_iterator_end(iter)) {

Modified: qpid/trunk/qpid/extras/dispatch/src/router_node.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/src/router_node.c?rev=1534710&r1=1534709&r2=1534710&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/src/router_node.c (original)
+++ qpid/trunk/qpid/extras/dispatch/src/router_node.c Tue Oct 22 17:53:50 2013
@@ -32,6 +32,7 @@ static char *router_role   = "inter-rout
 static char *local_prefix  = "_local/";
 static char *topo_prefix   = "_topo/";
 static char *direct_prefix;
+static char *node_id;
 
 /**
  * Address Types and Processing:
@@ -388,7 +389,7 @@ static dx_field_iterator_t *router_annot
             dx_parsed_field_t *trace_item = dx_parse_sub_value(trace, idx);
             while (trace_item) {
                 dx_field_iterator_t *iter = dx_parse_raw(trace_item);
-                if (dx_field_iterator_equal(iter, (unsigned char*) direct_prefix))
+                if (dx_field_iterator_equal(iter, (unsigned char*) node_id))
                     *drop = 1;
                 dx_field_iterator_reset(iter);
                 dx_compose_insert_string_iterator(out_da, iter);
@@ -398,7 +399,7 @@ static dx_field_iterator_t *router_annot
         }
     }
 
-    dx_compose_insert_string(out_da, direct_prefix);
+    dx_compose_insert_string(out_da, node_id);
     dx_compose_end_list(out_da);
 
     //
@@ -410,7 +411,7 @@ static dx_field_iterator_t *router_annot
         ingress_iter = dx_parse_raw(ingress);
         dx_compose_insert_string_iterator(out_da, ingress_iter);
     } else
-        dx_compose_insert_string(out_da, direct_prefix);
+        dx_compose_insert_string(out_da, node_id);
 
     dx_compose_end_map(out_da);
 
@@ -585,7 +586,7 @@ static void router_rx_handler(void* cont
                         //
                         int origin = -1;
                         if (ingress_iter) {
-                            dx_field_iterator_reset_view(ingress_iter, ITER_VIEW_ADDRESS_HASH);
+                            dx_field_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
                             dx_address_t *origin_addr;
                             dx_hash_retrieve(router->addr_hash, ingress_iter, (void*) &origin_addr);
                             if (origin_addr && DEQ_SIZE(origin_addr->rnodes) == 1) {
@@ -1105,6 +1106,11 @@ dx_router_t *dx_router(dx_dispatch_t *dx
     strcat(direct_prefix, id);
     strcat(direct_prefix, "/");
 
+    node_id = (char*) malloc(dplen);
+    strcpy(node_id, area);
+    strcat(node_id, "/");
+    strcat(node_id, id);
+
     dx_router_t *router = NEW(dx_router_t);
 
     router_node.type_context = router;
@@ -1186,7 +1192,7 @@ void dx_router_free(dx_router_t *router)
 
 const char *dx_router_id(const dx_dispatch_t *dx)
 {
-    return direct_prefix;
+    return node_id;
 }
 
 

Modified: qpid/trunk/qpid/extras/dispatch/tests/field_test.c
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/tests/field_test.c?rev=1534710&r1=1534709&r2=1534710&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/tests/field_test.c (original)
+++ qpid/trunk/qpid/extras/dispatch/tests/field_test.c Tue Oct 22 17:53:50 2013
@@ -137,6 +137,30 @@ static char* test_view_address_hash(void
 }
 
 
+static char* test_view_node_hash(void *context)
+{
+    struct {const char *addr; const char *view;} cases[] = {
+    {"area/router",       "Aarea"},
+    {"my-area/router",    "Rrouter"},
+    {"my-area/my-router", "Rmy-router"},
+    {0, 0}
+    };
+    int idx;
+
+    for (idx = 0; cases[idx].addr; idx++) {
+        dx_field_iterator_t *iter = dx_field_iterator_string(cases[idx].addr, ITER_VIEW_NODE_HASH);
+        if (!dx_field_iterator_equal(iter, (unsigned char*) cases[idx].view)) {
+            char *got = (char*) dx_field_iterator_copy(iter);
+            snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed.  Expected '%s', got '%s'",
+                     cases[idx].addr, cases[idx].view, got);
+            return fail_text;
+        }
+    }
+
+    return 0;
+}
+
+
 int field_tests(void)
 {
     int result = 0;
@@ -147,6 +171,7 @@ int field_tests(void)
     TEST_CASE(test_view_global_non_dns, 0);
     TEST_CASE(test_view_global_no_host, 0);
     TEST_CASE(test_view_address_hash, 0);
+    TEST_CASE(test_view_node_hash, 0);
 
     return result;
 }

Modified: qpid/trunk/qpid/extras/dispatch/tests/system_tests_one_router.py
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/extras/dispatch/tests/system_tests_one_router.py?rev=1534710&r1=1534709&r2=1534710&view=diff
==============================================================================
--- qpid/trunk/qpid/extras/dispatch/tests/system_tests_one_router.py (original)
+++ qpid/trunk/qpid/extras/dispatch/tests/system_tests_one_router.py Tue Oct 22 17:53:50 2013
@@ -369,8 +369,8 @@ class RouterTest(unittest.TestCase):
       self.assertEqual(i, rm.body['number'])
       da = rm.instructions
       self.assertEqual(da.__class__, dict)
-      self.assertEqual(da['qdx.ingress'], '_topo/area/Qpid.Dispatch.Router.A/')
-      self.assertEqual(da['qdx.trace'], ['_topo/area/Qpid.Dispatch.Router.A/'])
+      self.assertEqual(da['qdx.ingress'], 'area/Qpid.Dispatch.Router.A')
+      self.assertEqual(da['qdx.trace'], ['area/Qpid.Dispatch.Router.A'])
 
     ##
     ## Pre-existing ingress
@@ -388,7 +388,7 @@ class RouterTest(unittest.TestCase):
       da = rm.instructions
       self.assertEqual(da.__class__, dict)
       self.assertEqual(da['qdx.ingress'], 'ingress-router')
-      self.assertEqual(da['qdx.trace'], ['_topo/area/Qpid.Dispatch.Router.A/'])
+      self.assertEqual(da['qdx.trace'], ['area/Qpid.Dispatch.Router.A'])
 
     ##
     ## Invalid trace type
@@ -405,8 +405,8 @@ class RouterTest(unittest.TestCase):
       self.assertEqual(i, rm.body['number'])
       da = rm.instructions
       self.assertEqual(da.__class__, dict)
-      self.assertEqual(da['qdx.ingress'], '_topo/area/Qpid.Dispatch.Router.A/')
-      self.assertEqual(da['qdx.trace'], ['_topo/area/Qpid.Dispatch.Router.A/'])
+      self.assertEqual(da['qdx.ingress'], 'area/Qpid.Dispatch.Router.A')
+      self.assertEqual(da['qdx.trace'], ['area/Qpid.Dispatch.Router.A'])
 
     ##
     ## Empty trace
@@ -423,13 +423,13 @@ class RouterTest(unittest.TestCase):
       self.assertEqual(i, rm.body['number'])
       da = rm.instructions
       self.assertEqual(da.__class__, dict)
-      self.assertEqual(da['qdx.ingress'], '_topo/area/Qpid.Dispatch.Router.A/')
-      self.assertEqual(da['qdx.trace'], ['_topo/area/Qpid.Dispatch.Router.A/'])
+      self.assertEqual(da['qdx.ingress'], 'area/Qpid.Dispatch.Router.A')
+      self.assertEqual(da['qdx.trace'], ['area/Qpid.Dispatch.Router.A'])
 
     ##
     ## Non-empty trace
     ##
-    tm.instructions = {'qdx.trace' : ['first.hop']}
+    tm.instructions = {'qdx.trace' : ['area/first.hop']}
     for i in range(10):
       tm.body = {'number': i}
       M1.put(tm)
@@ -441,8 +441,8 @@ class RouterTest(unittest.TestCase):
       self.assertEqual(i, rm.body['number'])
       da = rm.instructions
       self.assertEqual(da.__class__, dict)
-      self.assertEqual(da['qdx.ingress'], '_topo/area/Qpid.Dispatch.Router.A/')
-      self.assertEqual(da['qdx.trace'], ['first.hop', '_topo/area/Qpid.Dispatch.Router.A/'])
+      self.assertEqual(da['qdx.ingress'], 'area/Qpid.Dispatch.Router.A')
+      self.assertEqual(da['qdx.trace'], ['area/first.hop', 'area/Qpid.Dispatch.Router.A'])
 
     M1.stop()
     M2.stop()



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