You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gm...@apache.org on 2020/05/18 14:37:33 UTC
[qpid-dispatch] branch master updated: DISPATCH-1614 - Raised and
handled QDRC_EVENT_LINK_IN_DETACHED and QDRC_EVENT_LINK_OUT_DETACHED events
where the addr's edge_inlink and edge_outlink can be zeroed out. This
closes #738.
This is an automated email from the ASF dual-hosted git repository.
gmurthy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/master by this push:
new fdbe7c9 DISPATCH-1614 - Raised and handled QDRC_EVENT_LINK_IN_DETACHED and QDRC_EVENT_LINK_OUT_DETACHED events where the addr's edge_inlink and edge_outlink can be zeroed out. This closes #738.
fdbe7c9 is described below
commit fdbe7c9ab68492c6902b60959f31371c42258aa8
Author: Ganesh Murthy <gm...@apache.org>
AuthorDate: Thu May 14 16:27:17 2020 -0400
DISPATCH-1614 - Raised and handled QDRC_EVENT_LINK_IN_DETACHED and QDRC_EVENT_LINK_OUT_DETACHED events where the addr's edge_inlink and edge_outlink can be zeroed out. This closes #738.
---
src/router_core/connections.c | 2 +
src/router_core/core_events.h | 4 +-
src/router_core/modules/edge_router/addr_proxy.c | 55 +++++++++++++++++++++---
src/router_core/router_core.c | 6 ---
4 files changed, 52 insertions(+), 15 deletions(-)
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 20fc2f9..2d05061 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -1924,6 +1924,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
}
if (link->link_direction == QD_INCOMING) {
+ qdrc_event_link_raise(core, QDRC_EVENT_LINK_IN_DETACHED, link);
//
// Handle incoming link cases
//
@@ -1963,6 +1964,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, qdr_action_t *action, b
//
// Handle outgoing link cases
//
+ qdrc_event_link_raise(core, QDRC_EVENT_LINK_OUT_DETACHED, link);
switch (link->link_type) {
case QD_LINK_ENDPOINT:
case QD_LINK_EDGE_DOWNLINK:
diff --git a/src/router_core/core_events.h b/src/router_core/core_events.h
index 7b351c0..b9d7834 100644
--- a/src/router_core/core_events.h
+++ b/src/router_core/core_events.h
@@ -42,9 +42,9 @@ typedef uint32_t qdrc_event_t;
* QDRC_EVENT_CONN_IR_LOST (not implemented)
*
* QDRC_EVENT_LINK_IN_ATTACHED (not implemented)
- * QDRC_EVENT_LINK_IN_DETACHED (not implemented)
+ * QDRC_EVENT_LINK_IN_DETACHED An inlink has been detached
* QDRC_EVENT_LINK_OUT_ATTACHED (not implemented)
- * QDRC_EVENT_LINK_OUT_DETACHED (not implemented)
+ * QDRC_EVENT_LINK_OUT_DETACHED An outlink has been detached
* QDRC_EVENT_LINK_EDGE_DATA_ATTACHED An edge-data link has been attached (incoming only)
* QDRC_EVENT_LINK_EDGE_DATA_DETACHED An edge-data link has been detached (incoming only)
*
diff --git a/src/router_core/modules/edge_router/addr_proxy.c b/src/router_core/modules/edge_router/addr_proxy.c
index a9c9989..cd42128 100644
--- a/src/router_core/modules/edge_router/addr_proxy.c
+++ b/src/router_core/modules/edge_router/addr_proxy.c
@@ -215,6 +215,50 @@ static void del_outlink(qcm_edge_addr_proxy_t *ap, qdr_address_t *addr)
}
}
+static void on_link_event(void *context, qdrc_event_t event, qdr_link_t *link)
+{
+ if (!link || !link->conn)
+ return;
+
+ //
+ // We only care if the link event is on an edge connection.
+ //
+ if (link->conn->role != QDR_ROLE_EDGE_CONNECTION)
+ return;
+
+ switch (event) {
+ case QDRC_EVENT_LINK_OUT_DETACHED: {
+ qdr_address_t *addr = link->owning_addr;
+ if (addr && link == addr->edge_outlink) {
+ //
+ // The link is being detached. If the detaching link is the same as the link's owning_addr's edge_outlink,
+ // set the edge_outlink on the address to be zero. We do this because this link is going to be freed
+ // and we don't want anyone dereferencing the addr->edge_outlink
+ //
+ addr->edge_outlink = 0;
+ }
+ break;
+ }
+
+ case QDRC_EVENT_LINK_IN_DETACHED: {
+ qdr_address_t *addr = link->owning_addr;
+ if (addr && link == addr->edge_inlink) {
+ //
+ // The link is being detached. If the detaching link is the same as the link's owning_addr's edge_inlink,
+ // set the edge_inlink on the address to be zero. We do this because this link is going to be freed
+ // and we don't want anyone dereferencing the addr->edge_inlink
+ //
+ addr->edge_inlink = 0;
+ }
+ break;
+ }
+
+ default:
+ assert(false);
+ break;
+ }
+}
+
static void on_conn_event(void *context, qdrc_event_t event, qdr_connection_t *conn)
{
@@ -325,11 +369,6 @@ static void on_conn_event(void *context, qdrc_event_t event, qdr_connection_t *c
}
case QDRC_EVENT_CONN_EDGE_LOST :
- for (qdr_address_t *addr = DEQ_HEAD(ap->core->addrs); addr; addr = DEQ_NEXT(addr)) {
- addr->edge_inlink = 0;
- addr->edge_outlink = 0;
- }
-
ap->edge_conn_established = false;
ap->edge_conn = 0;
break;
@@ -531,9 +570,11 @@ qcm_edge_addr_proxy_t *qcm_edge_addr_proxy(qdr_core_t *core)
| QDRC_EVENT_ADDR_BECAME_SOURCE
| QDRC_EVENT_ADDR_NO_LONGER_SOURCE
| QDRC_EVENT_ADDR_TWO_SOURCE
- | QDRC_EVENT_ADDR_ONE_SOURCE,
+ | QDRC_EVENT_ADDR_ONE_SOURCE
+ | QDRC_EVENT_LINK_IN_DETACHED
+ | QDRC_EVENT_LINK_OUT_DETACHED,
on_conn_event,
- 0,
+ on_link_event,
on_addr_event,
0,
ap);
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 91169ec..c4ceae1 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -598,9 +598,6 @@ void qdr_core_unbind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, qdr_
qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST, addr);
} else if (DEQ_SIZE(addr->rlinks) == 1 && qd_bitmask_cardinality(addr->rnodes) == 0)
qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_LOCAL_DEST, addr);
- if (addr->edge_outlink == link) {
- addr->edge_outlink = 0;
- }
} else {
bool removed = qdr_del_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
if (removed) {
@@ -614,9 +611,6 @@ void qdr_core_unbind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, qdr_
qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_ONE_SOURCE, addr->fallback);
}
}
- if (addr->edge_inlink == link) {
- addr->edge_inlink = 0;
- }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org