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 2017/11/09 13:18:58 UTC

[1/4] qpid-dispatch git commit: DISPATCH-865 - Don't account for delivery linkage when there is no link.

Repository: qpid-dispatch
Updated Branches:
  refs/heads/1.0.x 74cecc7d1 -> 21fcf9808
  refs/heads/master a512c0833 -> 2046a259f


DISPATCH-865 - Don't account for delivery linkage when there is no link.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/ba3a6862
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/ba3a6862
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/ba3a6862

Branch: refs/heads/1.0.x
Commit: ba3a6862c1e54282384832fd1e1486a07534b3d8
Parents: 74cecc7
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Nov 8 17:07:40 2017 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 9 07:49:09 2017 -0500

----------------------------------------------------------------------
 src/router_node.c | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ba3a6862/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index 7a165b2..d62365f 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -69,6 +69,9 @@ static void qdr_node_connect_deliveries(qd_link_t *link, qdr_delivery_t *qdlv, p
 
 static void qdr_node_disconnect_deliveries(qdr_core_t *core, qd_link_t *link, qdr_delivery_t *qdlv, pn_delivery_t *pdlv)
 {
+    if (!link)
+        return;
+
     qd_link_ref_t      *ref  = (qd_link_ref_t*) pn_delivery_get_context(pdlv);
     qd_link_ref_list_t *list = qd_link_get_ref_list(link);
 
@@ -104,8 +107,10 @@ static void qdr_node_reap_abandoned_deliveries(qdr_core_t *core, qd_link_t *link
     while (ref) {
         DEQ_REMOVE_HEAD(*list);
         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");
+        free_qd_link_ref_t(ref);
         ref = DEQ_HEAD(*list);
     }
 }


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


[3/4] qpid-dispatch git commit: DISPATCH-870 - Fix ref-counting on server connections so deleted connectors result in closed connections.

Posted by tr...@apache.org.
DISPATCH-870 - Fix ref-counting on server connections so deleted connectors result in closed connections.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/2046a259
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/2046a259
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/2046a259

Branch: refs/heads/master
Commit: 2046a259f330ea1db217aaf3563f29fbc4db98d2
Parents: a512c08
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Nov 9 08:07:00 2017 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 9 08:07:00 2017 -0500

----------------------------------------------------------------------
 src/server.c         | 26 ++++++++++++++++++--------
 src/server_private.h |  3 +--
 2 files changed, 19 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2046a259/src/server.c
----------------------------------------------------------------------
diff --git a/src/server.c b/src/server.c
index 2cc32cf..3c2a97f 100644
--- a/src/server.c
+++ b/src/server.c
@@ -734,7 +734,7 @@ bool qd_connector_has_failover_info(qd_connector_t* ct)
 }
 
 
-void qd_connection_free(qd_connection_t *ctx)
+static void qd_connection_free(qd_connection_t *ctx)
 {
     qd_server_t *qd_server = ctx->server;
 
@@ -742,6 +742,7 @@ void qd_connection_free(qd_connection_t *ctx)
 
     // If this is a dispatch connector, schedule the re-connect timer
     if (ctx->connector) {
+        long delay = ctx->connector->delay;
         sys_mutex_lock(ctx->connector->lock);
         ctx->connector->ctx = 0;
         // Increment the connection index by so that we can try connecting to the failover url (if any).
@@ -756,13 +757,17 @@ void qd_connection_free(qd_connection_t *ctx)
             // Go thru the failover list round robin.
             // IMPORTANT: Note here that we set the re-try timer to 1 second.
             // We want to quickly keep cycling thru the failover urls every second.
-            qd_timer_schedule(ctx->connector->timer, 1000);
+            delay = 1000;
         }
 
         ctx->connector->state = CXTR_STATE_CONNECTING;
         sys_mutex_unlock(ctx->connector->lock);
-        if (!has_failover)
-            qd_timer_schedule(ctx->connector->timer, ctx->connector->delay);
+
+        //
+        // Increment the ref-count to account for the timer's reference to the connector.
+        //
+        sys_atomic_inc(&ctx->connector->ref_count);
+        qd_timer_schedule(ctx->connector->timer, delay);
     }
 
     sys_mutex_lock(qd_server->lock);
@@ -962,6 +967,7 @@ static void try_open_lh(qd_connector_t *ct)
         qd_log(ct->server->log_source, QD_LOG_CRITICAL, "Allocation failure connecting to %s",
                ct->config.host_port);
         ct->delay = 10000;
+        sys_atomic_inc(&ct->ref_count);
         qd_timer_schedule(ct->timer, ct->delay);
         return;
     }
@@ -1086,9 +1092,11 @@ static void setup_ssl_sasl_and_open(qd_connection_t *ctx)
 
 static void try_open_cb(void *context) {
     qd_connector_t *ct = (qd_connector_t*) context;
-    sys_mutex_lock(ct->lock);   /* TODO aconway 2017-05-09: this lock looks too big */
-    try_open_lh(ct);
-    sys_mutex_unlock(ct->lock);
+    if (!qd_connector_decref(ct)) {
+        sys_mutex_lock(ct->lock);   /* TODO aconway 2017-05-09: this lock looks too big */
+        try_open_lh(ct);
+        sys_mutex_unlock(ct->lock);
+    }
 }
 
 
@@ -1362,7 +1370,7 @@ bool qd_connector_connect(qd_connector_t *ct)
 }
 
 
-void qd_connector_decref(qd_connector_t* ct)
+bool qd_connector_decref(qd_connector_t* ct)
 {
     if (ct && sys_atomic_dec(&ct->ref_count) == 1) {
         sys_mutex_lock(ct->lock);
@@ -1385,7 +1393,9 @@ void qd_connector_decref(qd_connector_t* ct)
             item = DEQ_HEAD(ct->conn_info_list);
         }
         free_qd_connector_t(ct);
+        return true;
     }
+    return false;
 }
 
 void qd_server_timeout(qd_server_t *server, qd_duration_t duration) {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2046a259/src/server_private.h
----------------------------------------------------------------------
diff --git a/src/server_private.h b/src/server_private.h
index e0fc386..a8fa009 100644
--- a/src/server_private.h
+++ b/src/server_private.h
@@ -40,7 +40,6 @@ qd_dispatch_t* qd_server_dispatch(qd_server_t *server);
 void qd_server_timeout(qd_server_t *server, qd_duration_t delay);
 
 qd_connection_t *qd_server_connection(qd_server_t *server, qd_server_config_t* config);
-void qd_connection_free(qd_connection_t* conn);
 
 qd_connector_t* qd_connection_connector(const qd_connection_t *c);
 
@@ -52,7 +51,7 @@ const qd_server_config_t *qd_connector_config(const qd_connector_t *c);
 qd_listener_t *qd_server_listener(qd_server_t *server);
 qd_connector_t *qd_server_connector(qd_server_t *server);
 
-void qd_connector_decref(qd_connector_t* ct);
+bool qd_connector_decref(qd_connector_t* ct);
 void qd_listener_decref(qd_listener_t* ct);
 void qd_server_config_free(qd_server_config_t *cf);
 


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


[2/4] qpid-dispatch git commit: DISPATCH-867 - Added missing linkage from drained output buffer to restarting a stalled link. This closes #215

Posted by tr...@apache.org.
DISPATCH-867 - Added missing linkage from drained output buffer to restarting a stalled link.
This closes #215


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/7f2b9862
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/7f2b9862
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/7f2b9862

Branch: refs/heads/1.0.x
Commit: 7f2b98620bb44879cce6ecc139059bec5949a954
Parents: ba3a686
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Nov 8 17:12:03 2017 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 9 07:49:23 2017 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/message.h       |  3 +-
 include/qpid/dispatch/router_core.h   |  8 +++++
 src/message.c                         |  9 ++++--
 src/router_core/connections.c         |  6 ++++
 src/router_core/router_core_private.h |  7 +++--
 src/router_core/transfer.c            | 50 +++++++++++++++++-------------
 src/router_node.c                     |  6 +++-
 7 files changed, 60 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/include/qpid/dispatch/message.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/message.h b/include/qpid/dispatch/message.h
index b06b4bd..78c0b95 100644
--- a/include/qpid/dispatch/message.h
+++ b/include/qpid/dispatch/message.h
@@ -227,8 +227,9 @@ qd_message_t *qd_message_receive(pn_delivery_t *delivery);
  * @param link The outgoing link on which to send the message.
  * @param strip_outbound_annotations [in] annotation control flag
  * @param restart_rx [out] indication to wake up receive process
+ * @param q3_stalled [out] indicates that the link is stalled due to proton-buffer-full
  */
-void qd_message_send(qd_message_t *msg, qd_link_t *link, bool strip_outbound_annotations, bool *restart_rx);
+void qd_message_send(qd_message_t *msg, qd_link_t *link, bool strip_outbound_annotations, bool *restart_rx, bool *q3_stalled);
 
 /**
  * Check that the message is well-formed up to a certain depth.  Any part of the message that is

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 9c2992c..81e0dd3 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -474,6 +474,14 @@ bool qdr_link_strip_annotations_in(const qdr_link_t *link);
 bool qdr_link_strip_annotations_out(const qdr_link_t *link);
 
 /**
+ * qdr_link_stalled_outbound
+ *
+ * Tell the link that it has been stalled outbound due to back-pressure from the
+ * transport buffers.  Stalling is undone during link-flow processing.
+ */
+void qdr_link_stalled_outbound(qdr_link_t *link);
+
+/**
  * qdr_link_name
  *
  * Retrieve the name of the link.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/src/message.c
----------------------------------------------------------------------
diff --git a/src/message.c b/src/message.c
index 4af7619..03f475b 100644
--- a/src/message.c
+++ b/src/message.c
@@ -1398,7 +1398,8 @@ static void compose_message_annotations(qd_message_pvt_t *msg, qd_buffer_list_t
 void qd_message_send(qd_message_t *in_msg,
                      qd_link_t    *link,
                      bool          strip_annotations,
-                     bool         *restart_rx)
+                     bool         *restart_rx,
+                     bool         *q3_stalled)
 {
     qd_message_pvt_t     *msg     = (qd_message_pvt_t*) in_msg;
     qd_message_content_t *content = msg->content;
@@ -1407,6 +1408,7 @@ void qd_message_send(qd_message_t *in_msg,
 
     int                  fanout   = qd_message_fanout(in_msg);
     *restart_rx                   = false;
+    *q3_stalled                   = false;
 
     if (msg->sent_depth < QD_DEPTH_MESSAGE_ANNOTATIONS) {
 
@@ -1515,8 +1517,7 @@ void qd_message_send(qd_message_t *in_msg,
 
     pn_session_t     *pns  = pn_link_session(pnl);
 
-    while (buf && pn_session_outgoing_bytes(pns) < QD_QLIMIT_Q3_UPPER) {
-
+    while (buf && pn_session_outgoing_bytes(pns) <= QD_QLIMIT_Q3_UPPER) {
         if (msg->content->aborted) {
             if (pn_link_current(pnl)) {
                 msg->send_complete = true;
@@ -1596,6 +1597,8 @@ void qd_message_send(qd_message_t *in_msg,
 
         buf = next_buf;
     }
+
+    *q3_stalled = (pn_session_outgoing_bytes(pns) > QD_QLIMIT_Q3_UPPER);
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 9d10fa4..5b2a8c8 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -384,6 +384,12 @@ bool qdr_link_strip_annotations_out(const qdr_link_t *link)
 }
 
 
+void qdr_link_stalled_outbound(qdr_link_t *link)
+{
+    link->stalled_outbound = true;
+}
+
+
 const char *qdr_link_name(const qdr_link_t *link)
 {
     return link->name;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/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 f5e5618..b1f49d8 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -391,14 +391,15 @@ struct qdr_link_t {
     qdr_delivery_list_t      unsettled;          ///< Unsettled deliveries
     qdr_delivery_list_t      settled;            ///< Settled deliveries
     qdr_delivery_ref_list_t  updated_deliveries; ///< References to deliveries (in the unsettled list) with updates.
-    bool                     admin_enabled;
     qdr_link_oper_status_t   oper_status;
+    int                      capacity;
+    int                      credit_to_core; ///< Number of the available credits incrementally given to the core
+    bool                     admin_enabled;
     bool                     strip_annotations_in;
     bool                     strip_annotations_out;
-    int                      capacity;
     bool                     flow_started;   ///< for incoming, true iff initial credit has been granted
     bool                     drain_mode;
-    int                      credit_to_core; ///< Number of the available credits incrementally given to the core
+    bool                     stalled_outbound;  ///< Indicates that this link is stalled on outbound buffer backpressure
 
     uint64_t total_deliveries;
     uint64_t presettled_deliveries;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/src/router_core/transfer.c
----------------------------------------------------------------------
diff --git a/src/router_core/transfer.c b/src/router_core/transfer.c
index f600545..d15b7bc 100644
--- a/src/router_core/transfer.c
+++ b/src/router_core/transfer.c
@@ -687,6 +687,16 @@ static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discar
     link->drain_mode = drain;
 
     //
+    // If the link was stalled due to internal backpressure from the transport, put it
+    // on the links-with-work list and activate the connection to resume sending.
+    //
+    if (link->stalled_outbound) {
+        link->stalled_outbound = false;
+        qdr_add_link_ref(&link->conn->links_with_work, link, QDR_LINK_LIST_CLASS_WORK);
+        activate = true;
+    }
+
+    //
     // If this is an attach-routed link, propagate the flow data downrange.
     // Note that the credit value is incremental.
     //
@@ -704,29 +714,27 @@ static void qdr_link_flow_CT(qdr_core_t *core, qdr_action_t *action, bool discar
                 work->drain_action = QDR_LINK_WORK_DRAIN_ACTION_DRAINED;
             qdr_link_enqueue_work_CT(core, clink, work);
         }
+    } else {
+        //
+        // Handle the replenishing of credit outbound
+        //
+        if (link->link_direction == QD_OUTGOING && (credit > 0 || drain_was_set)) {
+            if (drain_was_set) {
+                work = new_qdr_link_work_t();
+                ZERO(work);
+                work->work_type    = QDR_LINK_WORK_FLOW;
+                work->drain_action = QDR_LINK_WORK_DRAIN_ACTION_DRAINED;
+            }
 
-        return;
-    }
-
-    //
-    // Handle the replenishing of credit outbound
-    //
-    if (link->link_direction == QD_OUTGOING && (credit > 0 || drain_was_set)) {
-        if (drain_was_set) {
-            work = new_qdr_link_work_t();
-            ZERO(work);
-            work->work_type    = QDR_LINK_WORK_FLOW;
-            work->drain_action = QDR_LINK_WORK_DRAIN_ACTION_DRAINED;
-        }
-
-        sys_mutex_lock(link->conn->work_lock);
-        if (work)
-            DEQ_INSERT_TAIL(link->work_list, work);
-        if (DEQ_SIZE(link->undelivered) > 0 || drain_was_set) {
-            qdr_add_link_ref(&link->conn->links_with_work, link, QDR_LINK_LIST_CLASS_WORK);
-            activate = true;
+            sys_mutex_lock(link->conn->work_lock);
+            if (work)
+                DEQ_INSERT_TAIL(link->work_list, work);
+            if (DEQ_SIZE(link->undelivered) > 0 || drain_was_set) {
+                qdr_add_link_ref(&link->conn->links_with_work, link, QDR_LINK_LIST_CLASS_WORK);
+                activate = true;
+            }
+            sys_mutex_unlock(link->conn->work_lock);
         }
-        sys_mutex_unlock(link->conn->work_lock);
     }
 
     //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/7f2b9862/src/router_node.c
----------------------------------------------------------------------
diff --git a/src/router_node.c b/src/router_node.c
index d62365f..c447783 100644
--- a/src/router_node.c
+++ b/src/router_node.c
@@ -1345,10 +1345,14 @@ static void CORE_link_deliver(void *context, qdr_link_t *link, qdr_delivery_t *d
     }
 
     bool restart_rx = false;
+    bool q3_stalled = false;
 
     qd_message_t *msg_out = qdr_delivery_message(dlv);
 
-    qd_message_send(msg_out, qlink, qdr_link_strip_annotations_out(link), &restart_rx);
+    qd_message_send(msg_out, qlink, qdr_link_strip_annotations_out(link), &restart_rx, &q3_stalled);
+
+    if (q3_stalled)
+        qdr_link_stalled_outbound(link);
 
     if (restart_rx) {
         qd_link_t *qdl_in = qd_message_get_receiving_link(msg_out);


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


[4/4] qpid-dispatch git commit: DISPATCH-870 - Fix ref-counting on server connections so deleted connectors result in closed connections.

Posted by tr...@apache.org.
DISPATCH-870 - Fix ref-counting on server connections so deleted connectors result in closed connections.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/21fcf980
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/21fcf980
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/21fcf980

Branch: refs/heads/1.0.x
Commit: 21fcf9808da77fc8ea1858c2280a2ad05947e9c8
Parents: 7f2b986
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Nov 9 08:07:00 2017 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Thu Nov 9 08:08:30 2017 -0500

----------------------------------------------------------------------
 src/server.c         | 26 ++++++++++++++++++--------
 src/server_private.h |  3 +--
 2 files changed, 19 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/21fcf980/src/server.c
----------------------------------------------------------------------
diff --git a/src/server.c b/src/server.c
index 2cc32cf..3c2a97f 100644
--- a/src/server.c
+++ b/src/server.c
@@ -734,7 +734,7 @@ bool qd_connector_has_failover_info(qd_connector_t* ct)
 }
 
 
-void qd_connection_free(qd_connection_t *ctx)
+static void qd_connection_free(qd_connection_t *ctx)
 {
     qd_server_t *qd_server = ctx->server;
 
@@ -742,6 +742,7 @@ void qd_connection_free(qd_connection_t *ctx)
 
     // If this is a dispatch connector, schedule the re-connect timer
     if (ctx->connector) {
+        long delay = ctx->connector->delay;
         sys_mutex_lock(ctx->connector->lock);
         ctx->connector->ctx = 0;
         // Increment the connection index by so that we can try connecting to the failover url (if any).
@@ -756,13 +757,17 @@ void qd_connection_free(qd_connection_t *ctx)
             // Go thru the failover list round robin.
             // IMPORTANT: Note here that we set the re-try timer to 1 second.
             // We want to quickly keep cycling thru the failover urls every second.
-            qd_timer_schedule(ctx->connector->timer, 1000);
+            delay = 1000;
         }
 
         ctx->connector->state = CXTR_STATE_CONNECTING;
         sys_mutex_unlock(ctx->connector->lock);
-        if (!has_failover)
-            qd_timer_schedule(ctx->connector->timer, ctx->connector->delay);
+
+        //
+        // Increment the ref-count to account for the timer's reference to the connector.
+        //
+        sys_atomic_inc(&ctx->connector->ref_count);
+        qd_timer_schedule(ctx->connector->timer, delay);
     }
 
     sys_mutex_lock(qd_server->lock);
@@ -962,6 +967,7 @@ static void try_open_lh(qd_connector_t *ct)
         qd_log(ct->server->log_source, QD_LOG_CRITICAL, "Allocation failure connecting to %s",
                ct->config.host_port);
         ct->delay = 10000;
+        sys_atomic_inc(&ct->ref_count);
         qd_timer_schedule(ct->timer, ct->delay);
         return;
     }
@@ -1086,9 +1092,11 @@ static void setup_ssl_sasl_and_open(qd_connection_t *ctx)
 
 static void try_open_cb(void *context) {
     qd_connector_t *ct = (qd_connector_t*) context;
-    sys_mutex_lock(ct->lock);   /* TODO aconway 2017-05-09: this lock looks too big */
-    try_open_lh(ct);
-    sys_mutex_unlock(ct->lock);
+    if (!qd_connector_decref(ct)) {
+        sys_mutex_lock(ct->lock);   /* TODO aconway 2017-05-09: this lock looks too big */
+        try_open_lh(ct);
+        sys_mutex_unlock(ct->lock);
+    }
 }
 
 
@@ -1362,7 +1370,7 @@ bool qd_connector_connect(qd_connector_t *ct)
 }
 
 
-void qd_connector_decref(qd_connector_t* ct)
+bool qd_connector_decref(qd_connector_t* ct)
 {
     if (ct && sys_atomic_dec(&ct->ref_count) == 1) {
         sys_mutex_lock(ct->lock);
@@ -1385,7 +1393,9 @@ void qd_connector_decref(qd_connector_t* ct)
             item = DEQ_HEAD(ct->conn_info_list);
         }
         free_qd_connector_t(ct);
+        return true;
     }
+    return false;
 }
 
 void qd_server_timeout(qd_server_t *server, qd_duration_t duration) {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/21fcf980/src/server_private.h
----------------------------------------------------------------------
diff --git a/src/server_private.h b/src/server_private.h
index e0fc386..a8fa009 100644
--- a/src/server_private.h
+++ b/src/server_private.h
@@ -40,7 +40,6 @@ qd_dispatch_t* qd_server_dispatch(qd_server_t *server);
 void qd_server_timeout(qd_server_t *server, qd_duration_t delay);
 
 qd_connection_t *qd_server_connection(qd_server_t *server, qd_server_config_t* config);
-void qd_connection_free(qd_connection_t* conn);
 
 qd_connector_t* qd_connection_connector(const qd_connection_t *c);
 
@@ -52,7 +51,7 @@ const qd_server_config_t *qd_connector_config(const qd_connector_t *c);
 qd_listener_t *qd_server_listener(qd_server_t *server);
 qd_connector_t *qd_server_connector(qd_server_t *server);
 
-void qd_connector_decref(qd_connector_t* ct);
+bool qd_connector_decref(qd_connector_t* ct);
 void qd_listener_decref(qd_listener_t* ct);
 void qd_server_config_free(qd_server_config_t *cf);
 


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