Author: tross
Date: Wed Dec 17 21:44:29 2014
New Revision: 1646339
URL: http://svn.apache.org/r1646339
Log:
DISPATCH-59 - Improved the performance and stability of the routing protocol.
Modified:
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/data.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/engine.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/link.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/mobile.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/neighbor.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/node.py
qpid/dispatch/trunk/python/qpid_dispatch_internal/router/routing.py
qpid/dispatch/trunk/src/router_agent.c
qpid/dispatch/trunk/tests/router_engine_test.py
qpid/dispatch/trunk/tools/qdstat
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/data.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/data.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/data.py (original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/data.py Wed Dec 17
21:44:29 2014
@@ -82,6 +82,7 @@ class LinkState(object):
def del_all_peers(self):
self.peers = []
+ self.ls_seq = 0
def has_peers(self):
return len(self.peers) > 0
@@ -97,26 +98,29 @@ class MessageHELLO(object):
This message is used by directly connected routers to determine with whom
they have
bidirectional connectivity.
"""
- def __init__(self, body, _id=None, _area=None, _seen_peers=None):
+ def __init__(self, body, _id=None, _area=None, _seen_peers=None,
_instance=long(0)):
if body:
self.id = getMandatory(body, 'id', str)
self.area = getMandatory(body, 'area', str)
self.seen_peers = getMandatory(body, 'seen', list)
+ self.instance = getOptional(body, 'instance', 0, long)
else:
self.id = _id
self.area = _area
self.seen_peers = _seen_peers
+ self.instance = _instance
def __repr__(self):
- return "HELLO(id=%s area=%s seen=%r)" % (self.id, self.area,
self.seen_peers)
+ return "HELLO(id=%s area=%s inst=%d seen=%r)" % (self.id, self.area,
self.instance, self.seen_peers)
def get_opcode(self):
return 'HELLO'
def to_dict(self):
- return {'id' : self.id,
- 'area' : self.area,
- 'seen' : self.seen_peers}
+ return {'id' : self.id,
+ 'area' : self.area,
+ 'instance' : self.instance,
+ 'seen' : self.seen_peers}
def is_seen(self, _id):
return self.seen_peers.count(_id) > 0
@@ -129,28 +133,31 @@ class MessageRA(object):
This message is sent periodically to indicate the originating router's
sequence numbers
for link-state and mobile-address-state.
"""
- def __init__(self, body, _id=None, _area=None, _ls_seq=None,
_mobile_seq=None):
+ def __init__(self, body, _id=None, _area=None, _ls_seq=None,
_mobile_seq=None, _instance=long(0)):
if body:
self.id = getMandatory(body, 'id', str)
self.area = getMandatory(body, 'area', str)
self.ls_seq = getMandatory(body, 'ls_seq', long)
self.mobile_seq = getMandatory(body, 'mobile_seq', long)
+ self.instance = getOptional(body, 'instance', 0, long)
else:
self.id = _id
self.area = _area
self.ls_seq = long(_ls_seq)
self.mobile_seq = long(_mobile_seq)
+ self.instance = _instance
def get_opcode(self):
return 'RA'
def __repr__(self):
- return "RA(id=%s area=%s ls_seq=%d mobile_seq=%d)" % \
- (self.id, self.area, self.ls_seq, self.mobile_seq)
+ return "RA(id=%s area=%s inst=%d ls_seq=%d mobile_seq=%d)" % \
+ (self.id, self.area, self.instance, self.ls_seq,
self.mobile_seq)
def to_dict(self):
return {'id' : self.id,
'area' : self.area,
+ 'instance' : self.instance,
'ls_seq' : self.ls_seq,
'mobile_seq' : self.mobile_seq}
@@ -158,30 +165,33 @@ class MessageRA(object):
class MessageLSU(object):
"""
"""
- def __init__(self, body, _id=None, _area=None, _ls_seq=None, _ls=None):
+ def __init__(self, body, _id=None, _area=None, _ls_seq=None, _ls=None,
_instance=long(0)):
if body:
self.id = getMandatory(body, 'id', str)
self.area = getMandatory(body, 'area', str)
self.ls_seq = getMandatory(body, 'ls_seq', long)
self.ls = LinkState(getMandatory(body, 'ls', dict))
+ self.instance = getOptional(body, 'instance', 0, long)
else:
self.id = _id
self.area = _area
self.ls_seq = long(_ls_seq)
self.ls = _ls
+ self.instance = _instance
def get_opcode(self):
return 'LSU'
def __repr__(self):
- return "LSU(id=%s area=%s ls_seq=%d ls=%r)" % \
- (self.id, self.area, self.ls_seq, self.ls)
+ return "LSU(id=%s area=%s inst=%d ls_seq=%d ls=%r)" % \
+ (self.id, self.area, self.instance, self.ls_seq, self.ls)
def to_dict(self):
- return {'id' : self.id,
- 'area' : self.area,
- 'ls_seq' : self.ls_seq,
- 'ls' : self.ls.to_dict()}
+ return {'id' : self.id,
+ 'area' : self.area,
+ 'instance' : self.instance,
+ 'ls_seq' : self.ls_seq,
+ 'ls' : self.ls.to_dict()}
class MessageLSR(object):
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/engine.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/engine.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/engine.py
(original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/engine.py Wed Dec
17 21:44:29 2014
@@ -17,8 +17,6 @@
# under the License.
#
-from time import time
-
from data import MessageHELLO, MessageRA, MessageLSU, MessageMAU, MessageMAR,
MessageLSR
from neighbor import NeighborEngine
from link import LinkStateEngine
@@ -30,6 +28,7 @@ from message import Message
import sys
import traceback
+import time
##
## Import the Dispatch adapters from the environment. If they are not found
@@ -56,8 +55,9 @@ class RouterEngine:
self.max_routers = max_routers
self.id = router_id
self.area = area
- self.log(LOG_INFO, "Router Engine Instantiated: area=%s id=%s
max_routers=%d" %
- (self.area, self.id, self.max_routers))
+ self.instance = long(time.time())
+ self.log(LOG_INFO, "Router Engine Instantiated: area=%s id=%s
instance=%d max_routers=%d" %
+ (self.area, self.id, self.instance, self.max_routers))
self._config = None # Not yet loaded
##
## Launch the sub-module engines
@@ -125,7 +125,7 @@ class RouterEngine:
"""
"""
try:
- now = time()
+ now = time.time()
self.neighbor_engine.tick(now)
self.link_state_engine.tick(now)
self.path_engine.tick(now)
@@ -142,7 +142,7 @@ class RouterEngine:
"""
"""
try:
- now = time()
+ now = time.time()
if opcode == 'HELLO':
msg = MessageHELLO(body)
self.log(LOG_TRACE, "RCVD: %r" % msg)
@@ -265,36 +265,44 @@ class RouterEngine:
def get_next_hops(self):
return self.routing_table_engine.get_next_hops()
- def new_neighbor(self, rid, link_id):
- self.log(LOG_DEBUG, "Event: new_neighbor: id=%s link_id=%d" % (rid,
link_id))
- self.node_tracker.new_neighbor(rid, link_id)
+ def new_neighbor(self, rid, link_id, instance):
+ self.log(LOG_DEBUG, "Event: new_neighbor: id=%s link_id=%d inst=%r" %
(rid, link_id, instance))
+ self.node_tracker.new_neighbor(rid, link_id, instance)
+ self.link_state_engine.new_neighbor(rid)
def lost_neighbor(self, rid):
self.log(LOG_DEBUG, "Event: lost_neighbor: id=%s" % rid)
self.node_tracker.lost_neighbor(rid)
- def new_node(self, rid):
- self.log(LOG_DEBUG, "Event: new_node: id=%s" % rid)
- self.node_tracker.new_node(rid)
+ def new_node(self, rid, instance):
+ self.log(LOG_DEBUG, "Event: new_node: id=%s inst=%r" % (rid, instance))
+ self.node_tracker.new_node(rid, instance)
def lost_node(self, rid):
self.log(LOG_DEBUG, "Event: lost_node: id=%s" % rid)
self.node_tracker.lost_node(rid)
+ def touch_node(self, rid, instance):
+ return self.node_tracker.touch_node(rid, instance)
+
def add_neighbor_router(self, address, router_bit, link_bit):
self.log(LOG_DEBUG, "Event: add_neighbor_router: address=%s,
router_bit=%d, link_bit=%d" % \
(address, router_bit, link_bit))
self.router_adapter.add_neighbor_router(address, router_bit, link_bit)
- def del_neighbor_router(self, router_bit):
+ def del_neighbor_router(self, router_id, router_bit):
self.log(LOG_DEBUG, "Event: del_neighbor_router: router_bit=%d" %
router_bit)
+ self.link_state_engine.purge_remote(router_id)
+ self.mobile_address_engine.purge_remote(router_id)
self.router_adapter.del_neighbor_router(router_bit)
def add_remote_router(self, address, router_bit):
self.log(LOG_DEBUG, "Event: add_remote_router: address=%s,
router_bit=%d" % (address, router_bit))
self.router_adapter.add_remote_router(address, router_bit)
- def del_remote_router(self, router_bit):
+ def del_remote_router(self, router_id, router_bit):
self.log(LOG_DEBUG, "Event: del_remote_router: router_bit=%d" %
router_bit)
+ self.link_state_engine.purge_remote(router_id)
+ self.mobile_address_engine.purge_remote(router_id)
self.router_adapter.del_remote_router(router_bit)
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/link.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/link.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/link.py (original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/link.py Wed Dec 17
21:44:29 2014
@@ -63,6 +63,8 @@ class LinkStateEngine(object):
ls.last_seen = now
if ls.ls_seq < msg.ls_seq:
self.needed_lsrs[(msg.area, msg.id)] = None
+ if self.container.touch_node(msg.id, msg.instance):
+ self.needed_lsrs[(msg.area, msg.id)] = None
else:
self.needed_lsrs[(msg.area, msg.id)] = None
@@ -82,12 +84,12 @@ class LinkStateEngine(object):
self.collection[msg.id] = ls
self.collection_changed = True
ls.last_seen = now
- self.container.new_node(msg.id)
+ self.container.new_node(msg.id, msg.instance)
self.container.log(LOG_INFO, "Learned link-state from new router:
%s" % msg.id)
# Schedule LSRs for any routers referenced in this LS that we don't
know about
for _id in msg.ls.peers:
if _id not in self.collection:
- self.container.new_node(_id)
+ self.container.new_node(_id, None)
self.needed_lsrs[(msg.area, _id)] = None
@@ -95,9 +97,15 @@ class LinkStateEngine(object):
if msg.id == self.id:
return
if self.id not in self.collection:
+ self.needed_lsrs[(msg.area, msg.id)] = None
return
my_ls = self.collection[self.id]
- self.container.send('amqp:/_topo/%s/%s/qdrouter' % (msg.area, msg.id),
MessageLSU(None, self.id, self.area, my_ls.ls_seq, my_ls))
+ self.container.send('amqp:/_topo/%s/%s/qdrouter' % (msg.area, msg.id),
+ MessageLSU(None, self.id, self.area, my_ls.ls_seq,
my_ls, self.container.instance))
+
+
+ def new_neighbor(self, _id):
+ self.needed_lsrs[(self.area, _id)] = None
def new_local_link_state(self, link_state):
@@ -114,6 +122,14 @@ class LinkStateEngine(object):
return self.collection
+ def purge_remote(self, _id):
+ try:
+ ls = self.collection[_id]
+ ls.del_all_peers()
+ except:
+ pass
+
+
def _expire_ls(self, now):
for key, ls in self.collection.items():
if key != self.id and ls.has_peers() and now - ls.last_seen >
self.remote_ls_max_age:
@@ -132,4 +148,5 @@ class LinkStateEngine(object):
ls_seq = 0
if self.id in self.collection:
ls_seq = self.collection[self.id].ls_seq
- self.container.send('amqp:/_topo/%s/all/qdrouter' % self.area,
MessageRA(None, self.id, self.area, ls_seq, self.mobile_seq))
+ self.container.send('amqp:/_topo/%s/all/qdrouter' % self.area,
+ MessageRA(None, self.id, self.area, ls_seq,
self.mobile_seq, self.container.instance))
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/mobile.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/mobile.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/mobile.py
(original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/mobile.py Wed Dec
17 21:44:29 2014
@@ -38,7 +38,7 @@ class MobileAddressEngine(object):
self.added_addrs = []
self.deleted_addrs = []
self.remote_lists = {} # map router_id => (sequence, list of
addrs)
- self.remote_last_seen = {} # map router_id => time of last seen
advertizement/update
+ self.remote_last_seen = {} # map router_id => time of last seen
advertisement/update
self.needed_mars = {}
@@ -160,12 +160,22 @@ class MobileAddressEngine(object):
MessageMAU(None, self.id, self.area,
self.mobile_seq, None, None, self.local_addrs))
+ def purge_remote(self, _id):
+ try:
+ (add_list, del_list) = self.node_tracker.overwrite_addresses(_id,
[])
+ self._activate_remotes(_id, add_list, del_list)
+ self.remote_lists.pop(_id)
+ self.remote_last_seen.pop(_id)
+ self.container.log(LOG_DEBUG, "Purged remote records for node: %s"
% _id)
+ except:
+ pass
+
+
def _expire_remotes(self, now):
for _id, t in self.remote_last_seen.items():
if now - t > self.mobile_addr_max_age:
self.remote_lists.pop(_id)
self.remote_last_seen.pop(_id)
- self.remote_changed = True
self.container.log(LOG_DEBUG, "Expired remote mobile addresses
on node: %s" % _id)
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/neighbor.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/neighbor.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/neighbor.py
(original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/neighbor.py Wed
Dec 17 21:44:29 2014
@@ -43,7 +43,8 @@ class NeighborEngine(object):
if now - self.last_hello_time >= self.hello_interval:
self.last_hello_time = now
- self.container.send('amqp:/_local/qdhello', MessageHELLO(None,
self.id, self.area, self.hellos.keys()))
+ self.container.send('amqp:/_local/qdhello',
+ MessageHELLO(None, self.id, self.area,
self.hellos.keys(), self.container.instance))
if self.link_state_changed:
self.link_state_changed = False
@@ -58,7 +59,7 @@ class NeighborEngine(object):
if msg.is_seen(self.id):
if self.link_state.add_peer(msg.id):
self.link_state_changed = True
- self.container.new_neighbor(msg.id, link_id)
+ self.container.new_neighbor(msg.id, link_id, msg.instance)
self.container.log(LOG_INFO, "New neighbor established: %s on
link: %d" % (msg.id, link_id))
def linkLost(self, link_id):
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/node.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/node.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/node.py (original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/node.py Wed Dec 17
21:44:29 2014
@@ -41,7 +41,7 @@ class NodeTracker(object):
pass
- def new_neighbor(self, node_id, link_maskbit):
+ def new_neighbor(self, node_id, link_maskbit, instance):
"""
A node, designated by node_id, has been discovered as a neighbor over
a link with
a maskbit of link_maskbit.
@@ -50,25 +50,29 @@ class NodeTracker(object):
if node_id in self.nodes:
node = self.nodes[node_id]
if node.neighbor:
- return
- self.container.del_remote_router(node.maskbit)
- node.neighbor = True
- node.link_id = link_maskbit
+ if node.update_instance(instance):
+ self.container.del_neighbor_router(node.id, node.maskbit)
+ else:
+ return
+ else:
+ self.container.del_remote_router(node.id, node.maskbit)
+ node.neighbor = True
+ node.link_id = link_maskbit
else:
- node = RemoteNode(node_id, self._allocate_maskbit(), True,
link_maskbit)
+ node = RemoteNode(node_id, self._allocate_maskbit(), True,
link_maskbit, instance)
self.nodes[node_id] = node
self.container.add_neighbor_router(self._address(node_id),
node.maskbit, link_maskbit)
def lost_neighbor(self, node_id):
"""
- We have lost contact with a neighboring node node_id.
+ We have lost contact with a neighboring node.
"""
node = self.nodes[node_id]
node.neighbor = False
self.nodes_by_link_id.pop(node.link_id)
node.link_id = None
- self.container.del_neighbor_router(node.maskbit)
+ self.container.del_neighbor_router(node.id, node.maskbit)
if node.remote:
self.container.add_remote_router(self._address(node.id),
node.maskbit)
else:
@@ -76,18 +80,21 @@ class NodeTracker(object):
self.nodes.pop(node_id)
- def new_node(self, node_id):
+ def new_node(self, node_id, instance):
"""
A node, designated by node_id, has been discovered through the an
advertisement from a
remote peer.
"""
if node_id not in self.nodes:
- node = RemoteNode(node_id, self._allocate_maskbit(), False, None)
+ node = RemoteNode(node_id, self._allocate_maskbit(), False, None,
instance)
self.nodes[node_id] = node
self.container.add_remote_router(self._address(node.id),
node.maskbit)
else:
node = self.nodes[node_id]
node.remote = True
+ if node.update_instance(instance):
+ self.container.del_remote_router(node.id, node.maskbit)
+ self.container.add_remote_router(self._address(node.id),
node.maskbit)
def lost_node(self, node_id):
@@ -98,11 +105,31 @@ class NodeTracker(object):
if node.remote:
node.remote = False
if not node.neighbor:
- self.container.del_remote_router(node.maskbit)
+ self.container.del_remote_router(node.id, node.maskbit)
self._free_maskbit(node.maskbit)
self.nodes.pop(node_id)
+ def touch_node(self, node_id, instance):
+ """
+ We've received an advertisement or hello from a node. If the instance
has changed,
+ we need to treat the node as though it was lost and regained.
+ """
+ try:
+ node = self.nodes[node_id]
+ if node.update_instance(instance):
+ if node.neighbor:
+ self.container.del_neighbor_router(node.id, node.maskbit)
+ self.container.add_neighbor_router(self._address(node_id),
node.maskbit, node.link_id)
+ elif node.remote:
+ self.container.del_remote_router(node.id, node.maskbit)
+ self.container.add_remote_router(self._address(node.id),
node.maskbit)
+ return True
+ except:
+ pass
+ return False
+
+
def maskbit_for_node(self, node_id):
"""
"""
@@ -134,6 +161,7 @@ class NodeTracker(object):
for a in node.addrs.keys():
if a not in addrs:
deleted.append(a)
+ node.addrs = {}
for a in addrs:
node.addrs[a] = 1
return (added, deleted)
@@ -170,10 +198,23 @@ class NodeTracker(object):
class RemoteNode(object):
- def __init__(self, node_id, maskbit, neighbor, link_id):
+ def __init__(self, node_id, maskbit, neighbor, link_id, instance):
self.id = node_id
self.maskbit = maskbit
self.neighbor = neighbor
self.remote = not neighbor
self.link_id = link_id
+ self.instance = instance
self.addrs = {} # Address => Count at Node (1 only for the present)
+
+
+ def update_instance(self, instance):
+ if instance == None:
+ return False
+ if self.instance == None:
+ self.instance = instance
+ return False
+ if self.instance == instance:
+ return False
+ self.instance = instance
+ return True
Modified: qpid/dispatch/trunk/python/qpid_dispatch_internal/router/routing.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/python/qpid_dispatch_internal/router/routing.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/python/qpid_dispatch_internal/router/routing.py
(original)
+++ qpid/dispatch/trunk/python/qpid_dispatch_internal/router/routing.py Wed Dec
17 21:44:29 2014
@@ -47,12 +47,13 @@ class RoutingTableEngine(object):
def valid_origins_changed(self, valid_origins):
for _id, vo in valid_origins.items():
mb_id = self.node_tracker.maskbit_for_node(_id)
- mb_vo = []
- for o in vo:
- mb = self.node_tracker.maskbit_for_node(o)
- if mb != None:
- mb_vo.append(mb)
- self.container.router_adapter.set_valid_origins(mb_id, mb_vo)
+ if mb_id != None:
+ mb_vo = []
+ for o in vo:
+ mb = self.node_tracker.maskbit_for_node(o)
+ if mb != None:
+ mb_vo.append(mb)
+ self.container.router_adapter.set_valid_origins(mb_id, mb_vo)
def get_next_hops(self):
Modified: qpid/dispatch/trunk/src/router_agent.c
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/src/router_agent.c?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/src/router_agent.c (original)
+++ qpid/dispatch/trunk/src/router_agent.c Wed Dec 17 21:44:29 2014
@@ -86,13 +86,13 @@ qd_error_t qd_entity_refresh_router_node
}
CHECK(qd_entity_set_string(entity, "addr",
address_text(rnode->owning_addr)));
long next_hop = rnode->next_hop ? rnode->next_hop->mask_bit : 0;
- CHECK(qd_entity_set_longp(entity, "nextHop", rnode->next_hop ? &next_hop :
0));
+ CHECK(qd_entity_set_stringf(entity, "nextHop", "%ld", rnode->next_hop ?
next_hop : 0));
long router_link = rnode->peer_link ? rnode->peer_link->mask_bit : 0;
- CHECK(qd_entity_set_longp(entity, "routerLink", rnode->peer_link ?
&router_link : 0));
+ CHECK(qd_entity_set_stringf(entity, "routerLink", "%ld", rnode->peer_link
? router_link : 0));
CHECK(qd_entity_set_list(entity, "validOrigins"));
for (uint32_t bit = 1; bit < qd_bitmask_width(); bit++) {
if (qd_bitmask_value(rnode->valid_origins, bit)) {
- CHECK(qd_entity_set_long(entity, "validOrigins", bit));
+ CHECK(qd_entity_set_stringf(entity, "validOrigins", "%d", bit));
}
}
return QD_ERROR_NONE;
Modified: qpid/dispatch/trunk/tests/router_engine_test.py
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/tests/router_engine_test.py?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/tests/router_engine_test.py (original)
+++ qpid/dispatch/trunk/tests/router_engine_test.py Wed Dec 17 21:44:29 2014
@@ -111,7 +111,7 @@ class NodeTrackerTest(unittest.TestCase)
self.link_bit = link_bit
self.calls += 1
- def del_neighbor_router(self, router_bit):
+ def del_neighbor_router(self, router_id, router_bit):
self.address = None
self.router_bit = router_bit
self.link_bit = None
@@ -123,7 +123,7 @@ class NodeTrackerTest(unittest.TestCase)
self.link_bit = None
self.calls += 1
- def del_remote_router(self, router_bit):
+ def del_remote_router(self, router_id, router_bit):
self.address = None
self.router_bit = router_bit
self.link_bit = None
@@ -140,28 +140,28 @@ class NodeTrackerTest(unittest.TestCase)
tracker = NodeTracker(self, 5)
self.reset()
- tracker.new_neighbor('A', 1)
+ tracker.new_neighbor('A', 1, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 1)
self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('B', 5)
+ tracker.new_neighbor('B', 5, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/B')
self.assertEqual(self.link_bit, 5)
self.assertEqual(self.router_bit, 2)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('C', 6)
+ tracker.new_neighbor('C', 6, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/C')
self.assertEqual(self.link_bit, 6)
self.assertEqual(self.router_bit, 3)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('D', 7)
+ tracker.new_neighbor('D', 7, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/D')
self.assertEqual(self.link_bit, 7)
self.assertEqual(self.router_bit, 4)
@@ -169,7 +169,7 @@ class NodeTrackerTest(unittest.TestCase)
self.reset()
try:
- tracker.new_neighbor('E', 9)
+ tracker.new_neighbor('E', 9, 0)
self.fail("We shouldn't be here")
except:
pass
@@ -180,7 +180,7 @@ class NodeTrackerTest(unittest.TestCase)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('E', 9)
+ tracker.new_neighbor('E', 9, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/E')
self.assertEqual(self.link_bit, 9)
self.assertEqual(self.router_bit, 3)
@@ -191,14 +191,14 @@ class NodeTrackerTest(unittest.TestCase)
tracker = NodeTracker(self, 5)
self.reset()
- tracker.new_node('A')
+ tracker.new_node('A', 0)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertFalse(self.link_bit)
self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_neighbor('A', 3)
+ tracker.new_neighbor('A', 3, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 3)
self.assertEqual(self.router_bit, 1)
@@ -221,14 +221,14 @@ class NodeTrackerTest(unittest.TestCase)
tracker = NodeTracker(self, 5)
self.reset()
- tracker.new_neighbor('A', 3)
+ tracker.new_neighbor('A', 3, 0)
self.assertEqual(self.address, 'amqp:/_topo/area/A')
self.assertEqual(self.link_bit, 3)
self.assertEqual(self.router_bit, 1)
self.assertEqual(self.calls, 1)
self.reset()
- tracker.new_node('A')
+ tracker.new_node('A', 0)
self.assertFalse(self.address)
self.assertFalse(self.link_bit)
self.assertFalse(self.router_bit)
@@ -256,17 +256,21 @@ class NeighborTest(unittest.TestCase):
def local_link_state_changed(self, link_state):
self.local_link_state = link_state
- def new_neighbor(self, rid, lbit):
+ def new_neighbor(self, rid, lbit, instance):
self.neighbors[rid] = None
def lost_neighbor(self, rid):
self.neighbors.pop(rid)
+ def touch_node(self, rid, instance):
+ pass
+
def setUp(self):
self.sent = []
self.local_link_state = None
self.id = "R1"
self.area = "area"
+ self.instance = 0
# Fake configuration
self.config = EntityBase({
'helloInterval' : 1.0,
Modified: qpid/dispatch/trunk/tools/qdstat
URL:
http://svn.apache.org/viewvc/qpid/dispatch/trunk/tools/qdstat?rev=1646339&r1=1646338&r2=1646339&view=diff
==============================================================================
--- qpid/dispatch/trunk/tools/qdstat (original)
+++ qpid/dispatch/trunk/tools/qdstat Wed Dec 17 21:44:29 2014
@@ -220,14 +220,13 @@ class BusManager(Node):
for node in objects:
row = []
row.append(node.addr)
- if node.nextHop != None:
+ if node.nextHop != None and node.nextHop in nodes:
row.append(nodes[node.nextHop].addr)
- else:
row.append('-')
- if node.routerLink != None:
- row.append(node.routerLink)
else:
row.append('-')
+ row.append(node.routerLink)
+
vo = None
for i in node.validOrigins:
if not vo:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]