diff options
| author | Ted Ross <tross@apache.org> | 2013-10-22 17:53:50 +0000 |
|---|---|---|
| committer | Ted Ross <tross@apache.org> | 2013-10-22 17:53:50 +0000 |
| commit | 36a729cdaece12d37506772a1a9196719ab0d076 (patch) | |
| tree | bacf46a8a245db6aef983a5958326c3bbac7bcf4 /qpid | |
| parent | 612fe8ab5b8df4ba91604e85549d594ccf78d45b (diff) | |
| download | qpid-python-36a729cdaece12d37506772a1a9196719ab0d076.tar.gz | |
QPID-5216 - Cleaned up the format of a router-id in the message annotations.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1534710 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid')
| -rw-r--r-- | qpid/extras/dispatch/include/qpid/dispatch/iterator.h | 11 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/iterator.c | 29 | ||||
| -rw-r--r-- | qpid/extras/dispatch/src/router_node.c | 16 | ||||
| -rw-r--r-- | qpid/extras/dispatch/tests/field_test.c | 25 | ||||
| -rw-r--r-- | qpid/extras/dispatch/tests/system_tests_one_router.py | 20 |
5 files changed, 85 insertions, 16 deletions
diff --git a/qpid/extras/dispatch/include/qpid/dispatch/iterator.h b/qpid/extras/dispatch/include/qpid/dispatch/iterator.h index 4d7f9a9c65..e31e67e6fd 100644 --- a/qpid/extras/dispatch/include/qpid/dispatch/iterator.h +++ b/qpid/extras/dispatch/include/qpid/dispatch/iterator.h @@ -76,13 +76,22 @@ typedef struct dx_field_iterator_t dx_field_iterator_t; * 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; diff --git a/qpid/extras/dispatch/src/iterator.c b/qpid/extras/dispatch/src/iterator.c index 0239a083ca..7898e04cc9 100644 --- a/qpid/extras/dispatch/src/iterator.c +++ b/qpid/extras/dispatch/src/iterator.c @@ -114,6 +114,29 @@ static void parse_address_view(dx_field_iterator_t *iter) } +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_iterator_t *iter) 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)) { diff --git a/qpid/extras/dispatch/src/router_node.c b/qpid/extras/dispatch/src/router_node.c index 931f4551bb..a810462f1b 100644 --- a/qpid/extras/dispatch/src/router_node.c +++ b/qpid/extras/dispatch/src/router_node.c @@ -32,6 +32,7 @@ static char *router_role = "inter-router"; 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_annotate_message(dx_router_t *router, dx_mess 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_annotate_message(dx_router_t *router, dx_mess } } - 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_annotate_message(dx_router_t *router, dx_mess 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* context, dx_link_t *link, dx_delivery_t *del // 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, dx_router_mode_t mode, const char *are 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; } diff --git a/qpid/extras/dispatch/tests/field_test.c b/qpid/extras/dispatch/tests/field_test.c index 33f9fe5d03..77cb6d969f 100644 --- a/qpid/extras/dispatch/tests/field_test.c +++ b/qpid/extras/dispatch/tests/field_test.c @@ -137,6 +137,30 @@ static char* test_view_address_hash(void *context) } +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; } diff --git a/qpid/extras/dispatch/tests/system_tests_one_router.py b/qpid/extras/dispatch/tests/system_tests_one_router.py index 1154b3ed37..366c9896eb 100644 --- a/qpid/extras/dispatch/tests/system_tests_one_router.py +++ b/qpid/extras/dispatch/tests/system_tests_one_router.py @@ -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() |
