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 2019/09/30 14:59:03 UTC

[qpid-dispatch] branch master updated: DISPATCH-1426 - Added an abandoned deliveries handler so all abandoned deliveries are handled in a single place, right before the qd_link is freed. This closes #573.

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 17f20fb  DISPATCH-1426 - Added an abandoned deliveries handler so all abandoned deliveries are handled in a single place, right before the qd_link is freed. This closes #573.
17f20fb is described below

commit 17f20fb58b32d07bb1f95067c7210819e24b4b5d
Author: Ganesh Murthy <gm...@apache.org>
AuthorDate: Tue Sep 24 14:29:48 2019 -0400

    DISPATCH-1426 - Added an abandoned deliveries handler so all abandoned deliveries are handled in a single place, right before the qd_link is freed. This closes #573.
---
 include/qpid/dispatch/container.h | 15 +++++++++------
 src/container.c                   | 13 ++-----------
 src/router_node.c                 | 11 ++++-------
 3 files changed, 15 insertions(+), 24 deletions(-)

diff --git a/include/qpid/dispatch/container.h b/include/qpid/dispatch/container.h
index bfe1da4..04940e2 100644
--- a/include/qpid/dispatch/container.h
+++ b/include/qpid/dispatch/container.h
@@ -73,12 +73,13 @@ typedef struct qd_link_t     qd_link_t;
 
 ALLOC_DECLARE(qd_link_t);
 
-typedef bool (*qd_container_delivery_handler_t)    (void *node_context, qd_link_t *link);
-typedef void (*qd_container_disposition_handler_t) (void *node_context, qd_link_t *link, pn_delivery_t *pnd);
-typedef int  (*qd_container_link_handler_t)        (void *node_context, qd_link_t *link);
-typedef int  (*qd_container_link_detach_handler_t) (void *node_context, qd_link_t *link, qd_detach_type_t dt);
-typedef void (*qd_container_node_handler_t)        (void *type_context, qd_node_t *node);
-typedef int  (*qd_container_conn_handler_t)        (void *type_context, qd_connection_t *conn, void *context);
+typedef bool (*qd_container_delivery_handler_t)                  (void *node_context, qd_link_t *link);
+typedef void (*qd_container_disposition_handler_t)               (void *node_context, qd_link_t *link, pn_delivery_t *pnd);
+typedef int  (*qd_container_link_handler_t)                      (void *node_context, qd_link_t *link);
+typedef int  (*qd_container_link_detach_handler_t)               (void *node_context, qd_link_t *link, qd_detach_type_t dt);
+typedef void (*qd_container_node_handler_t)                      (void *type_context, qd_node_t *node);
+typedef int  (*qd_container_conn_handler_t)                      (void *type_context, qd_connection_t *conn, void *context);
+typedef void (*qd_container_link_abandoned_deliveries_handler_t) (void *node_context, qd_link_t *link);
 
 /**
  * A set  of Node handlers for deliveries, links and container events.
@@ -114,6 +115,8 @@ typedef struct {
     /** Invoked when a link we created was opened by the peer */
     qd_container_link_handler_t link_attach_handler;
 
+    qd_container_link_abandoned_deliveries_handler_t link_abandoned_deliveries_handler;
+
     /** Invoked when a link receives a flow event */
     qd_container_link_handler_t link_flow_handler;
 
diff --git a/src/container.c b/src/container.c
index 0404cf8..c5a7709 100644
--- a/src/container.c
+++ b/src/container.c
@@ -900,17 +900,8 @@ void qd_link_free(qd_link_t *link)
     DEQ_REMOVE(container->links, link);
     sys_mutex_unlock(container->lock);
 
-
-    qd_link_ref_list_t *list = qd_link_get_ref_list(link);
-
-    if (list) {
-        qd_link_ref_t *link_ref = DEQ_HEAD (*list);
-        while (link_ref) {
-            DEQ_REMOVE_HEAD(*list);
-            free_qd_link_ref_t(link_ref);
-            link_ref = DEQ_HEAD (*list);
-        }
-    }
+    qd_node_t *node = link->node;
+    node->ntype->link_abandoned_deliveries_handler(node->context, link);
 
     free_qd_link_t(link);
 }
diff --git a/src/router_node.c b/src/router_node.c
index ef1ce17..c302e20 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -102,8 +102,9 @@ static qdr_delivery_t *qdr_node_delivery_qdr_from_pn(pn_delivery_t *dlv)
 }
 
 
-static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link)
+void qd_link_abandoned_deliveries_handler(void *context, qd_link_t *link)
 {
+    qd_router_t    *router = (qd_router_t*) context;
     qd_link_ref_list_t *list = qd_link_get_ref_list(link);
     qd_link_ref_t      *ref  = DEQ_HEAD(*list);
 
@@ -112,7 +113,7 @@ static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link
         qdr_delivery_t *dlv = (qdr_delivery_t*) ref->ref;
         ref->ref = 0;
         qdr_delivery_set_context(dlv, 0);
-        qdr_delivery_decref(core, dlv, "qdr_node_reap_abandoned_deliveries");
+        qdr_delivery_decref(router->router_core, dlv, "qd_link_abandoned_deliveries_handler");
         free_qd_link_ref_t(ref);
         ref = DEQ_HEAD(*list);
     }
@@ -120,7 +121,6 @@ static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link
 
 
 
-
 /**
  * Determine the role of a connection
  */
@@ -826,7 +826,6 @@ static int AMQP_link_detach_handler(void* context, qd_link_t *link, qd_detach_ty
         }
     }
 
-    qd_router_t    *router = (qd_router_t*) context;
     qdr_link_t     *rlink  = (qdr_link_t*) qd_link_get_context(link);
     pn_condition_t *cond   = qd_link_pn(link) ? pn_link_remote_condition(qd_link_pn(link)) : 0;
 
@@ -844,7 +843,6 @@ static int AMQP_link_detach_handler(void* context, qd_link_t *link, qd_detach_ty
         //
         if (dt == QD_LOST || qdr_link_get_context(rlink) == 0) {
             qdr_link_set_context(rlink, 0);
-            qdr_node_reap_abandoned_deliveries(router->router_core, link);
             qd_link_free(link);
         }
 
@@ -1263,6 +1261,7 @@ static qd_node_type_t router_node = {"router", 0, 0,
                                      AMQP_writable_conn_handler,
                                      AMQP_link_detach_handler,
                                      AMQP_link_attach_handler,
+                                     qd_link_abandoned_deliveries_handler,
                                      AMQP_link_flow_handler,
                                      0,   // node_created_handler
                                      0,   // node_destroyed_handler
@@ -1429,7 +1428,6 @@ static void CORE_close_connection(void *context, qdr_connection_t *qdr_conn, qdr
 
 static void CORE_link_detach(void *context, qdr_link_t *link, qdr_error_t *error, bool first, bool close)
 {
-    qd_router_t *router = (qd_router_t*) context;
     qd_link_t   *qlink  = (qd_link_t*) qdr_link_get_context(link);
     if (!qlink)
         return;
@@ -1473,7 +1471,6 @@ static void CORE_link_detach(void *context, qdr_link_t *link, qdr_error_t *error
     // If this is the second detach, free the qd_link
     //
     if (!first) {
-        qdr_node_reap_abandoned_deliveries(router->router_core, qlink);
         qd_link_free(qlink);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org