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 2020/12/04 21:27:50 UTC

[qpid-dispatch] branch dev-protocol-adaptors-2 updated: DISPATCH-1872 - Fixed handling of closed server connections in the TCP adaptor.

This is an automated email from the ASF dual-hosted git repository.

tross pushed a commit to branch dev-protocol-adaptors-2
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/dev-protocol-adaptors-2 by this push:
     new 12c8121  DISPATCH-1872 - Fixed handling of closed server connections in the TCP adaptor.
12c8121 is described below

commit 12c8121d5afc4c4cafde44fa28cbfd2bbf9bc4d2
Author: Ted Ross <tr...@apache.org>
AuthorDate: Fri Dec 4 16:27:00 2020 -0500

    DISPATCH-1872 - Fixed handling of closed server connections in the TCP adaptor.
---
 src/adaptors/tcp_adaptor.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/adaptors/tcp_adaptor.c b/src/adaptors/tcp_adaptor.c
index a8d176a..4b47030 100644
--- a/src/adaptors/tcp_adaptor.c
+++ b/src/adaptors/tcp_adaptor.c
@@ -53,6 +53,7 @@ struct qdr_tcp_connection_t {
     bool                  flow_enabled;
     bool                  egress_dispatcher;
     bool                  connector_closed;//only used if egress_dispatcher=true
+    bool                  in_list;         // This connection is in the adaptor's connections list
     qdr_delivery_t       *initial_delivery;
     qd_timer_t           *activate_timer;
     qd_bridge_config_t    config;
@@ -254,8 +255,14 @@ static void handle_disconnected(qdr_tcp_connection_t* conn)
         qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"][L%"PRIu64"] handle_disconnected - detach outgoing", conn->conn_id, conn->outgoing_id);
         qdr_link_detach(conn->outgoing, QD_LOST, 0);
     }
-    qdr_connection_closed(conn->qdr_conn);
-    qdr_connection_set_context(conn->qdr_conn, 0);
+    if (conn->qdr_conn) {
+        qdr_connection_closed(conn->qdr_conn);
+        qdr_connection_set_context(conn->qdr_conn, 0);
+    }
+    if (conn->initial_delivery) {
+        qdr_delivery_remote_state_updated(tcp_adaptor->core, conn->initial_delivery, PN_RELEASED, true, 0, 0, false);
+    }
+
     //need to free on core thread to avoid deleting while in use by management agent
     qdr_action_t *action = qdr_action(qdr_del_tcp_connection_CT, "delete_tcp_connection");
     action->args.general.context_1 = conn;
@@ -1476,6 +1483,7 @@ static void qdr_add_tcp_connection_CT(qdr_core_t *core, qdr_action_t *action, bo
     if (!discard) {
         qdr_tcp_connection_t *conn = (qdr_tcp_connection_t*) action->args.general.context_1;
         DEQ_INSERT_TAIL(tcp_adaptor->connections, conn);
+        conn->in_list = true;
         qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_add_tcp_connection_CT %s (%zu)",
             conn->conn_id, conn->config.host_port, DEQ_SIZE(tcp_adaptor->connections));
     }
@@ -1485,9 +1493,11 @@ static void qdr_del_tcp_connection_CT(qdr_core_t *core, qdr_action_t *action, bo
 {
     if (!discard) {
         qdr_tcp_connection_t *conn = (qdr_tcp_connection_t*) action->args.general.context_1;
-        DEQ_REMOVE(tcp_adaptor->connections, conn);
-        qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_del_tcp_connection_CT %s (%zu)",
-            conn->conn_id, conn->config.host_port, DEQ_SIZE(tcp_adaptor->connections));
+        if (conn->in_list) {
+            DEQ_REMOVE(tcp_adaptor->connections, conn);
+            qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG, "[C%"PRIu64"] qdr_del_tcp_connection_CT %s (%zu)",
+                   conn->conn_id, conn->config.host_port, DEQ_SIZE(tcp_adaptor->connections));
+        }
         free_qdr_tcp_connection(conn);
     }
 }


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