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]
