DISPATCH-550 - Remove closed links from the routing tables immediately upon 
link/connection closure.


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

Branch: refs/heads/0.7.x
Commit: a139fd0fb0a1fec64c73255ab7552b671ff2e7c0
Parents: 00c4568
Author: Ted Ross <[email protected]>
Authored: Fri Oct 28 12:58:38 2016 -0400
Committer: Ted Ross <[email protected]>
Committed: Thu Nov 3 10:55:49 2016 -0400

----------------------------------------------------------------------
 src/router_core/connections.c         |  9 +++++++++
 src/router_core/forwarder.c           | 10 +++++-----
 src/router_core/route_tables.c        |  9 +++------
 src/router_core/router_core_private.h |  6 ++++--
 4 files changed, 21 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index a114e1f..4dabeeb 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -452,6 +452,15 @@ static void qdr_link_cleanup_CT(qdr_core_t *core, 
qdr_connection_t *conn, qdr_li
     }
 
     //
+    // If this link is involved in inter-router communication, remove its 
reference
+    // from the core mask-bit tables
+    //
+    if (link->link_type == QD_LINK_CONTROL)
+        core->control_links_by_mask_bit[conn->mask_bit] = 0;
+    if (link->link_type == QD_LINK_ROUTER)
+        core->data_links_by_mask_bit[conn->mask_bit] = 0;
+
+    //
     // Clean up the lists of deliveries on this link
     //
     qdr_delivery_ref_list_t updated_deliveries;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index ca1acb1..cfbb319 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -284,7 +284,7 @@ int qdr_forward_multicast_CT(qdr_core_t      *core,
             else
                 next_node = rnode;
 
-            dest_link = control ? next_node->peer_control_link : 
next_node->peer_data_link;
+            dest_link = control ? PEER_CONTROL_LINK(core, next_node) : 
PEER_DATA_LINK(core, next_node);
             if (dest_link && qd_bitmask_value(rnode->valid_origins, origin))
                 qd_bitmask_set_bit(link_set, dest_link->conn->mask_bit);
         }
@@ -430,7 +430,7 @@ int qdr_forward_closest_CT(qdr_core_t      *core,
             else
                 next_node = rnode;
 
-            out_link = control ? next_node->peer_control_link : 
next_node->peer_data_link;
+            out_link = control ? PEER_CONTROL_LINK(core, next_node) : 
PEER_DATA_LINK(core, next_node);
             if (out_link) {
                 out_delivery = qdr_forward_new_delivery_CT(core, in_delivery, 
out_link, msg);
                 qdr_forward_deliver_CT(core, out_link, out_delivery);
@@ -532,7 +532,7 @@ int qdr_forward_balanced_CT(qdr_core_t      *core,
         for (QD_BITMASK_EACH(addr->rnodes, node_bit, c)) {
             qdr_node_t *rnode     = core->routers_by_mask_bit[node_bit];
             qdr_node_t *next_node = rnode->next_hop ? rnode->next_hop : rnode;
-            qdr_link_t *link      = next_node->peer_data_link;
+            qdr_link_t *link      = PEER_DATA_LINK(core, next_node);
             if (!link) continue;
             int         link_bit  = link->conn->mask_bit;
             int         value     = addr->outstanding_deliveries[link_bit];
@@ -659,8 +659,8 @@ bool qdr_forward_link_balanced_CT(qdr_core_t     *core,
                 else
                     next_node = rnode;
 
-                if (next_node && next_node->peer_data_link)
-                    conn = next_node->peer_data_link->conn;
+                if (next_node && PEER_DATA_LINK(core, next_node))
+                    conn = PEER_DATA_LINK(core, next_node)->conn;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index d80930b..6f44e5c 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -295,8 +295,7 @@ static void qdr_add_router_CT(qdr_core_t *core, 
qdr_action_t *action, bool disca
         rnode->owning_addr       = addr;
         rnode->mask_bit          = router_maskbit;
         rnode->next_hop          = 0;
-        rnode->peer_control_link = 0;
-        rnode->peer_data_link    = 0;
+        rnode->link_mask_bit     = -1;
         rnode->ref_count         = 0;
         rnode->valid_origins     = qd_bitmask(0);
         rnode->cost              = 0;
@@ -423,8 +422,7 @@ static void qdr_set_link_CT(qdr_core_t *core, qdr_action_t 
*action, bool discard
     // Add the peer_link reference to the router record.
     //
     qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
-    rnode->peer_control_link = core->control_links_by_mask_bit[link_maskbit];
-    rnode->peer_data_link    = core->data_links_by_mask_bit[link_maskbit];
+    rnode->link_mask_bit = link_maskbit;
 }
 
 
@@ -443,8 +441,7 @@ static void qdr_remove_link_CT(qdr_core_t *core, 
qdr_action_t *action, bool disc
     }
 
     qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
-    rnode->peer_control_link = 0;
-    rnode->peer_data_link    = 0;
+    rnode->link_mask_bit = -1;
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/a139fd0f/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 9fa86e9..32c112a 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -174,8 +174,7 @@ struct qdr_node_t {
     qdr_address_t    *owning_addr;
     int               mask_bit;
     qdr_node_t       *next_hop;           ///< Next hop node _if_ this is not 
a neighbor node
-    qdr_link_t       *peer_control_link;  ///< Outgoing control link _if_ this 
is a neighbor node
-    qdr_link_t       *peer_data_link;     ///< Outgoing data link _if_ this is 
a neighbor node
+    int               link_mask_bit;      ///< Mask bit of inter-router 
connection if this is a neighbor node
     uint32_t          ref_count;
     qd_bitmask_t     *valid_origins;
     int               cost;
@@ -184,6 +183,9 @@ struct qdr_node_t {
 ALLOC_DECLARE(qdr_node_t);
 DEQ_DECLARE(qdr_node_t, qdr_node_list_t);
 
+#define PEER_CONTROL_LINK(c,n) ((n->link_mask_bit >= 0) ? 
(c)->control_links_by_mask_bit[n->link_mask_bit] : 0)
+#define PEER_DATA_LINK(c,n)    ((n->link_mask_bit >= 0) ? 
(c)->data_links_by_mask_bit[n->link_mask_bit] : 0)
+
 
 struct qdr_router_ref_t {
     DEQ_LINKS(qdr_router_ref_t);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to