summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Ross <tross@apache.org>2013-10-11 15:14:12 +0000
committerTed Ross <tross@apache.org>2013-10-11 15:14:12 +0000
commit1b1c02486f1036d1e26a073361b6688ca48eaeb2 (patch)
treec7fb4d8ecdb9f594d8d9e3a3749c059e62a07863
parent3fb57a88813f6fa7e8d8bb9c85a5383dbc7e2d95 (diff)
downloadqpid-python-1b1c02486f1036d1e26a073361b6688ca48eaeb2.tar.gz
QPID-5216
- Fixed bug that blocked routing of messages inbound from a client link - Changed trace to accept any initial header value git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1531328 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/extras/dispatch/python/qpid/dispatch/router/node.py3
-rw-r--r--qpid/extras/dispatch/src/router_node.c25
-rw-r--r--qpid/extras/dispatch/src/router_pynode.c1
-rw-r--r--qpid/extras/dispatch/tests/router_engine_test.py35
-rw-r--r--qpid/extras/dispatch/tests/system_tests_one_router.py2
5 files changed, 34 insertions, 32 deletions
diff --git a/qpid/extras/dispatch/python/qpid/dispatch/router/node.py b/qpid/extras/dispatch/python/qpid/dispatch/router/node.py
index b1f6df2662..f1abb5702a 100644
--- a/qpid/extras/dispatch/python/qpid/dispatch/router/node.py
+++ b/qpid/extras/dispatch/python/qpid/dispatch/router/node.py
@@ -36,9 +36,10 @@ class NodeTracker(object):
self.max_routers = max_routers
self.nodes = {} # id => RemoteNode
self.maskbits = []
- self.next_maskbit = 0
+ self.next_maskbit = 1 # Reserve bit '0' to represent this router
for i in range(max_routers):
self.maskbits.append(None)
+ self.maskbits[0] = True
def tick(self, now):
diff --git a/qpid/extras/dispatch/src/router_node.c b/qpid/extras/dispatch/src/router_node.c
index 4b13230687..414d920428 100644
--- a/qpid/extras/dispatch/src/router_node.c
+++ b/qpid/extras/dispatch/src/router_node.c
@@ -333,17 +333,19 @@ static dx_field_iterator_t *router_annotate_message(dx_router_t *router, dx_mess
//
// If there is a trace field, append this router's ID to the trace.
//
- if (trace && dx_parse_is_list(trace)) {
+ if (trace) {
dx_compose_insert_string(out_da, DX_DA_TRACE);
dx_compose_start_list(out_da);
- uint32_t idx = 0;
- 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);
- dx_compose_insert_string_iterator(out_da, iter);
- idx++;
- trace_item = dx_parse_sub_value(trace, idx);
+ if (dx_parse_is_list(trace)) {
+ uint32_t idx = 0;
+ 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);
+ dx_compose_insert_string_iterator(out_da, iter);
+ idx++;
+ trace_item = dx_parse_sub_value(trace, idx);
+ }
}
dx_compose_insert_string(out_da, direct_prefix);
@@ -366,6 +368,10 @@ static dx_field_iterator_t *router_annotate_message(dx_router_t *router, dx_mess
dx_message_set_delivery_annotations(msg, out_da);
dx_compose_free(out_da);
+ //
+ // Return the iterator to the ingress field _if_ it was present.
+ // If we added the ingress, return NULL.
+ //
return ingress_iter;
}
@@ -529,7 +535,8 @@ static void router_rx_handler(void* context, dx_link_t *link, dx_delivery_t *del
dx_router_ref_t *rref = DEQ_HEAD(origin_addr->rnodes);
origin = rref->router->mask_bit;
}
- }
+ } else
+ origin = 0;
//
// Forward to the next-hops for remote destinations.
diff --git a/qpid/extras/dispatch/src/router_pynode.c b/qpid/extras/dispatch/src/router_pynode.c
index 70882326af..0638c06c3e 100644
--- a/qpid/extras/dispatch/src/router_pynode.c
+++ b/qpid/extras/dispatch/src/router_pynode.c
@@ -292,6 +292,7 @@ static PyObject* dx_set_valid_origins(PyObject *self, PyObject *args)
}
dx_bitmask_clear_all(rnode->valid_origins);
+ dx_bitmask_set_bit(rnode->valid_origins, 0); // This router is a valid origin for all destinations
for (idx = 0; idx < origin_count; idx++) {
maskbit = PyInt_AS_LONG(PyList_GetItem(origin_list, idx));
dx_bitmask_set_bit(rnode->valid_origins, maskbit);
diff --git a/qpid/extras/dispatch/tests/router_engine_test.py b/qpid/extras/dispatch/tests/router_engine_test.py
index e7257756e1..e25ce35d22 100644
--- a/qpid/extras/dispatch/tests/router_engine_test.py
+++ b/qpid/extras/dispatch/tests/router_engine_test.py
@@ -135,54 +135,47 @@ class NodeTrackerTest(unittest.TestCase):
tracker.new_neighbor('A', 1)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 1)
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
tracker.new_neighbor('B', 5)
self.assertEqual(self.address, 'amqp:/_topo/area/B')
self.assertEqual(self.link_bit, 5)
- self.assertEqual(self.router_bit, 1)
+ self.assertEqual(self.router_bit, 2)
self.assertEqual(self.calls, 1)
self.reset()
tracker.new_neighbor('C', 6)
self.assertEqual(self.address, 'amqp:/_topo/area/C')
self.assertEqual(self.link_bit, 6)
- self.assertEqual(self.router_bit, 2)
+ self.assertEqual(self.router_bit, 3)
self.assertEqual(self.calls, 1)
self.reset()
tracker.new_neighbor('D', 7)
self.assertEqual(self.address, 'amqp:/_topo/area/D')
self.assertEqual(self.link_bit, 7)
- self.assertEqual(self.router_bit, 3)
- self.assertEqual(self.calls, 1)
-
- self.reset()
- tracker.new_neighbor('E', 8)
- self.assertEqual(self.address, 'amqp:/_topo/area/E')
- self.assertEqual(self.link_bit, 8)
self.assertEqual(self.router_bit, 4)
self.assertEqual(self.calls, 1)
self.reset()
try:
- tracker.new_neighbor('F', 9)
+ tracker.new_neighbor('E', 9)
AssertFalse("We shouldn't be here")
except:
pass
self.reset()
tracker.lost_neighbor('C')
- self.assertEqual(self.router_bit, 2)
+ self.assertEqual(self.router_bit, 3)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('F', 9)
- self.assertEqual(self.address, 'amqp:/_topo/area/F')
+ tracker.new_neighbor('E', 9)
+ self.assertEqual(self.address, 'amqp:/_topo/area/E')
self.assertEqual(self.link_bit, 9)
- self.assertEqual(self.router_bit, 2)
+ self.assertEqual(self.router_bit, 3)
self.assertEqual(self.calls, 1)
@@ -193,14 +186,14 @@ class NodeTrackerTest(unittest.TestCase):
tracker.new_node('A')
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertFalse(self.link_bit)
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
tracker.new_neighbor('A', 3)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 3)
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 2)
self.reset()
@@ -212,7 +205,7 @@ class NodeTrackerTest(unittest.TestCase):
self.reset()
tracker.lost_neighbor('A')
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
@@ -223,7 +216,7 @@ class NodeTrackerTest(unittest.TestCase):
tracker.new_neighbor('A', 3)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 3)
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
@@ -236,12 +229,12 @@ class NodeTrackerTest(unittest.TestCase):
self.reset()
tracker.lost_neighbor('A')
self.assertEqual(self.address, 'amqp:/_topo/area/A')
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 2)
self.reset()
tracker.lost_node('A')
- self.assertEqual(self.router_bit, 0)
+ self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
diff --git a/qpid/extras/dispatch/tests/system_tests_one_router.py b/qpid/extras/dispatch/tests/system_tests_one_router.py
index c026888c54..302030e463 100644
--- a/qpid/extras/dispatch/tests/system_tests_one_router.py
+++ b/qpid/extras/dispatch/tests/system_tests_one_router.py
@@ -406,7 +406,7 @@ class RouterTest(unittest.TestCase):
da = rm.instructions
self.assertEqual(da.__class__, dict)
self.assertEqual(da['qdx.ingress'], '_topo/area/Qpid.Dispatch.Router.A/')
- self.assertFalse('qdx.trace' in da)
+ self.assertEqual(da['qdx.trace'], ['_topo/area/Qpid.Dispatch.Router.A/'])
##
## Empty trace