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/11/02 17:36:23 UTC
[1/2] qpid-dispatch git commit: DISPATCH-535 - Removed pn_incref and
pn_decref and used pn_session_free and pn_link_free. Also fixed qdr_field
leak (from Ganesh Murthy). This closes #107
Repository: qpid-dispatch
Updated Branches:
refs/heads/master 17b0f10ae -> 3b73b03c0
DISPATCH-535 - Removed pn_incref and pn_decref and used pn_session_free and pn_link_free. Also fixed qdr_field leak (from Ganesh Murthy).
This closes #107
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/31660485
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/31660485
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/31660485
Branch: refs/heads/master
Commit: 31660485d1ff6cf3053aceae40b7f7fa72570b69
Parents: 17b0f10
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Nov 2 13:24:02 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Nov 2 13:24:02 2016 -0400
----------------------------------------------------------------------
src/container.c | 54 +++++++++++++++++++-------------------
src/router_core/connections.c | 4 +++
2 files changed, 31 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/31660485/src/container.c
----------------------------------------------------------------------
diff --git a/src/container.c b/src/container.c
index e3f181a..fd61418 100644
--- a/src/container.c
+++ b/src/container.c
@@ -129,12 +129,6 @@ static void setup_outgoing_link(qd_container_t *container, pn_link_t *pn_link)
link->drain_mode = pn_link_get_drain(pn_link);
link->close_sess_with_link = false;
- //
- // Keep the borrowed references
- //
- pn_incref(pn_link);
- pn_incref(link->pn_sess);
-
pn_link_set_context(pn_link, link);
node->ntype->outgoing_handler(node->context, link);
}
@@ -184,12 +178,6 @@ static void setup_incoming_link(qd_container_t *container, pn_link_t *pn_link)
link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(pn_link);
link->close_sess_with_link = false;
- //
- // Keep the borrowed references
- //
- pn_incref(pn_link);
- pn_incref(link->pn_sess);
-
pn_link_set_context(pn_link, link);
node->ntype->incoming_handler(node->context, link);
}
@@ -398,7 +386,12 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
}
}
break;
-
+ case PN_SESSION_LOCAL_CLOSE :
+ ssn = pn_event_session(event);
+ if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+ pn_session_free(ssn);
+ }
+ break;
case PN_SESSION_REMOTE_CLOSE :
if (!(pn_connection_state(conn) & PN_LOCAL_CLOSED)) {
ssn = pn_event_session(event);
@@ -435,6 +428,9 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
}
pn_session_close(ssn);
}
+ else if (pn_session_state(ssn) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+ pn_session_free(ssn);
+ }
}
break;
@@ -470,6 +466,7 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
pn_link = pn_event_link(event);
qd_link = (qd_link_t*) pn_link_get_context(pn_link);
if (qd_link) {
+ pn_session_t *sess = qd_link->pn_sess;
qd_node_t *node = qd_link->node;
qd_detach_type_t dt = pn_event_type(event) == PN_LINK_REMOTE_CLOSE ? QD_CLOSED : QD_DETACHED;
if (node)
@@ -492,13 +489,26 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
assert (qd_conn->n_senders >= 0);
}
}
- if (qd_link->close_sess_with_link && qd_link->pn_sess &&
- pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED))
- pn_session_close(qd_link->pn_sess);
+
+ if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+ if (qd_link->close_sess_with_link && sess) {
+ pn_session_close(sess);
+ }
+ pn_link_free(pn_link);
+ }
}
}
break;
+ case PN_LINK_LOCAL_DETACH:
+ case PN_LINK_LOCAL_CLOSE:
+ pn_link = pn_event_link(event);
+ if (pn_link_state(pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
+ pn_link_free(pn_link);
+ }
+ break;
+
+
case PN_LINK_FLOW :
pn_link = pn_event_link(event);
qd_link = (qd_link_t*) pn_link_get_context(pn_link);
@@ -530,12 +540,9 @@ int pn_event_handler(void *handler_context, void *conn_context, pn_event_t *even
case PN_CONNECTION_FINAL :
case PN_SESSION_INIT :
case PN_SESSION_LOCAL_OPEN :
- case PN_SESSION_LOCAL_CLOSE :
case PN_SESSION_FINAL :
case PN_LINK_INIT :
case PN_LINK_LOCAL_OPEN :
- case PN_LINK_LOCAL_CLOSE :
- case PN_LINK_LOCAL_DETACH :
case PN_LINK_FINAL :
case PN_TRANSPORT :
case PN_TRANSPORT_ERROR :
@@ -780,12 +787,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c
link->remote_snd_settle_mode = pn_link_remote_snd_settle_mode(link->pn_link);
link->close_sess_with_link = true;
- //
- // Keep the borrowed references
- //
- pn_incref(link->pn_link);
- pn_incref(link->pn_sess);
-
pn_link_set_context(link->pn_link, link);
pn_session_open(link->pn_sess);
@@ -797,8 +798,6 @@ qd_link_t *qd_link(qd_node_t *node, qd_connection_t *conn, qd_direction_t dir, c
void qd_link_free(qd_link_t *link)
{
if (!link) return;
- if (link->pn_link) pn_decref(link->pn_link);
- if (link->pn_sess) pn_decref(link->pn_sess);
link->pn_link = 0;
link->pn_sess = 0;
free_qd_link_t(link);
@@ -943,6 +942,7 @@ void qd_link_close(qd_link_t *link)
if (link->pn_link)
pn_link_close(link->pn_link);
+
if (link->close_sess_with_link && link->pn_sess &&
pn_link_state(link->pn_link) == (PN_LOCAL_CLOSED | PN_REMOTE_CLOSED)) {
pn_session_close(link->pn_sess);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/31660485/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 1cd054b..a114e1f 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -884,6 +884,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
//
// No action needed for NORMAL connections
//
+ qdr_field_free(action->args.connection.connection_label);
+ qdr_field_free(action->args.connection.container_id);
return;
}
@@ -897,6 +899,8 @@ static void qdr_connection_opened_CT(qdr_core_t *core, qdr_action_t *action, boo
else {
qd_log(core->log, QD_LOG_CRITICAL, "Exceeded maximum inter-router connection count");
conn->role = QDR_ROLE_NORMAL;
+ qdr_field_free(action->args.connection.connection_label);
+ qdr_field_free(action->args.connection.container_id);
return;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[2/2] qpid-dispatch git commit: DISPATCH-550 - Remove closed links
from the routing tables immediately upon link/connection closure.
Posted by tr...@apache.org.
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/3b73b03c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/3b73b03c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/3b73b03c
Branch: refs/heads/master
Commit: 3b73b03c0e02db00885ccb9e58ed938fcdc8237f
Parents: 3166048
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Oct 28 12:58:38 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Nov 2 13:27:23 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/3b73b03c/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/3b73b03c/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/3b73b03c/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/3b73b03c/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 f44b6b5..f8e702f 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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org