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 2016/04/22 23:55:25 UTC

[4/7] qpid-dispatch git commit: DISPATCH-10 Communicate the router node costs to the router core.

DISPATCH-10 Communicate the router node costs to the router core.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/2cb107b9
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/2cb107b9
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/2cb107b9

Branch: refs/heads/master
Commit: 2cb107b93002a1e0d24309f915d45cf41ca2ee0a
Parents: faf0eef
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Apr 21 13:42:38 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Apr 22 17:50:56 2016 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h          |  1 +
 python/qpid_dispatch_internal/router/node.py | 15 ++++++++++--
 src/router_core/route_tables.c               | 30 +++++++++++++++++++++++
 src/router_core/router_core_private.h        |  2 ++
 src/router_pynode.c                          | 18 ++++++++++++++
 5 files changed, 64 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 81dd2f9..951bb21 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -69,6 +69,7 @@ void qdr_core_set_link(qdr_core_t *core, int router_maskbit, int link_maskbit);
 void qdr_core_remove_link(qdr_core_t *core, int router_maskbit);
 void qdr_core_set_next_hop(qdr_core_t *core, int router_maskbit, int nh_router_maskbit);
 void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_cost(qdr_core_t *core, int router_maskbit, int cost);
 void qdr_core_set_valid_origins(qdr_core_t *core, int router_maskbit, qd_bitmask_t *routers);
 void qdr_core_map_destination(qdr_core_t *core, int router_maskbit, const char *address_hash);
 void qdr_core_unmap_destination(qdr_core_t *core, int router_maskbit, const char *address_hash);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/python/qpid_dispatch_internal/router/node.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/router/node.py b/python/qpid_dispatch_internal/router/node.py
index 2dfcbcf..5c53adf 100644
--- a/python/qpid_dispatch_internal/router/node.py
+++ b/python/qpid_dispatch_internal/router/node.py
@@ -146,9 +146,9 @@ class NodeTracker(object):
             collection = {self.my_id : self.link_state}
             for node_id, node in self.nodes.items():
                 collection[node_id] = node.link_state
-            next_hops, cost, valid_origins = self.container.path_engine.calculate_routes(collection)
+            next_hops, costs, valid_origins = self.container.path_engine.calculate_routes(collection)
             self.container.log_ls(LOG_TRACE, "Computed next hops: %r" % next_hops)
-            self.container.log_ls(LOG_TRACE, "Computed costs: %r" % cost)
+            self.container.log_ls(LOG_TRACE, "Computed costs: %r" % costs)
             self.container.log_ls(LOG_TRACE, "Computed valid origins: %r" % valid_origins)
 
             ##
@@ -158,8 +158,10 @@ class NodeTracker(object):
                 node     = self.nodes[node_id]
                 next_hop = self.nodes[next_hop_id]
                 vo       = valid_origins[node_id]
+                cost     = costs[node_id]
                 node.set_next_hop(next_hop)
                 node.set_valid_origins(vo)
+                node.set_cost(cost)
 
         ##
         ## Send link-state requests and mobile-address requests to the nodes
@@ -367,6 +369,7 @@ class RouterNode(object):
         self.peer_link_id            = None
         self.link_state              = LinkState(None, self.id, 0, {})
         self.next_hop_router         = None
+        self.cost                    = None
         self.valid_origins           = None
         self.mobile_addresses        = []
         self.mobile_address_sequence = 0
@@ -443,6 +446,14 @@ class RouterNode(object):
         self.log(LOG_TRACE, "Node %s valid origins: %r" % (self.id, valid_origins))
 
 
+    def set_cost(self, cost):
+        if self.cost == cost:
+            return
+        self.cost = cost
+        self.adapter.set_cost(self.maskbit, cost)
+        self.log(LOG_TRACE, "Node %s cost: %d" % (self.id, cost))
+
+
     def remove_next_hop(self):
         if self.next_hop_router:
             self.next_hop_router = None

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index 0e27408..02c2c65 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -26,6 +26,7 @@ static void qdr_set_link_CT          (qdr_core_t *core, qdr_action_t *action, bo
 static void qdr_remove_link_CT       (qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_set_next_hop_CT      (qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_remove_next_hop_CT   (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdr_set_cost_CT          (qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_set_valid_origins_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_map_destination_CT   (qdr_core_t *core, qdr_action_t *action, bool discard);
 static void qdr_unmap_destination_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
@@ -88,6 +89,15 @@ void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit)
 }
 
 
+void qdr_core_set_cost(qdr_core_t *core, int router_maskbit, int cost)
+{
+    qdr_action_t *action = qdr_action(qdr_set_cost_CT, "set_cost");
+    action->args.route_table.router_maskbit = router_maskbit;
+    action->args.route_table.cost           = cost;
+    qdr_action_enqueue(core, action);
+}
+
+
 void qdr_core_set_valid_origins(qdr_core_t *core, int router_maskbit, qd_bitmask_t *routers)
 {
     qdr_action_t *action = qdr_action(qdr_set_valid_origins_CT, "set_valid_origins");
@@ -438,6 +448,26 @@ static void qdr_remove_next_hop_CT(qdr_core_t *core, qdr_action_t *action, bool
 }
 
 
+static void qdr_set_cost_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
+{
+    int router_maskbit = action->args.route_table.router_maskbit;
+    int cost           = action->args.route_table.cost;
+
+    if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
+        qd_log(core->log, QD_LOG_CRITICAL, "set_cost: Router maskbit out of range: %d", router_maskbit);
+        return;
+    }
+
+    if (cost < 1) {
+        qd_log(core->log, QD_LOG_CRITICAL, "set_cost: Invalid cost %d for maskbit: %d", cost, router_maskbit);
+        return;
+    }
+
+    qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
+    rnode->cost = cost;
+}
+
+
 static void qdr_set_valid_origins_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
 {
     int           router_maskbit = action->args.route_table.router_maskbit;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 8abfba8..49f7257 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -81,6 +81,7 @@ struct qdr_action_t {
             int           link_maskbit;
             int           router_maskbit;
             int           nh_router_maskbit;
+            int           cost;
             qd_bitmask_t *router_set;
             qdr_field_t  *address;
         } route_table;
@@ -174,6 +175,7 @@ struct qdr_node_t {
     qdr_link_t       *peer_data_link;     ///< Outgoing data link _if_ this is a neighbor node
     uint32_t          ref_count;
     qd_bitmask_t     *valid_origins;
+    int               cost;
 };
 
 ALLOC_DECLARE(qdr_node_t);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_pynode.c
----------------------------------------------------------------------
diff --git a/src/router_pynode.c b/src/router_pynode.c
index 6b0cda8..3984f74 100644
--- a/src/router_pynode.c
+++ b/src/router_pynode.c
@@ -143,6 +143,23 @@ static PyObject* qd_remove_next_hop(PyObject *self, PyObject *args)
 }
 
 
+static PyObject* qd_set_cost(PyObject *self, PyObject *args)
+{
+    RouterAdapter *adapter = (RouterAdapter*) self;
+    qd_router_t   *router  = adapter->router;
+    int            router_maskbit;
+    int            cost;
+
+    if (!PyArg_ParseTuple(args, "ii", &router_maskbit, &cost))
+        return 0;
+
+    qdr_core_set_cost(router->router_core, router_maskbit, cost);
+
+    Py_INCREF(Py_None);
+    return Py_None;
+}
+
+
 static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
 {
     RouterAdapter *adapter = (RouterAdapter*) self;
@@ -262,6 +279,7 @@ static PyMethodDef RouterAdapter_methods[] = {
     {"remove_link",         qd_remove_link,       METH_VARARGS, "Remove the link for a neighbor router"},
     {"set_next_hop",        qd_set_next_hop,      METH_VARARGS, "Set the next hop for a remote router"},
     {"remove_next_hop",     qd_remove_next_hop,   METH_VARARGS, "Remove the next hop for a remote router"},
+    {"set_cost",            qd_set_cost,          METH_VARARGS, "Set the cost to reach a remote router"},
     {"set_valid_origins",   qd_set_valid_origins, METH_VARARGS, "Set the valid origins for a remote router"},
     {"map_destination",     qd_map_destination,   METH_VARARGS, "Add a newly discovered destination mapping"},
     {"unmap_destination",   qd_unmap_destination, METH_VARARGS, "Delete a destination mapping"},


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