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