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]

Reply via email to