You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2021/07/23 18:00:48 UTC
[qpid-dispatch] branch main updated: DISPATCH-2195: Fix
SERVER-PYTHON lock inversion
This is an automated email from the ASF dual-hosted git repository.
chug pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git
The following commit(s) were added to refs/heads/main by this push:
new e90df06 DISPATCH-2195: Fix SERVER-PYTHON lock inversion
e90df06 is described below
commit e90df062b08fb572e5d865c69feb0f20dd202abe
Author: Chuck Rolke <ch...@apache.org>
AuthorDate: Fri Jul 23 13:55:34 2021 -0400
DISPATCH-2195: Fix SERVER-PYTHON lock inversion
* Release server lock before calling qd_policy_socket_close instead
of after.
* As a general rule the PYTHON lock must not be taken while holding
any other lock.
* Make a copy of the global while holding the lock and then log the
value of the copy.
This closes #1295
---
src/policy.c | 3 ++-
src/server.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/policy.c b/src/policy.c
index 07f4fae..2255806 100644
--- a/src/policy.c
+++ b/src/policy.c
@@ -289,6 +289,7 @@ void qd_policy_socket_close(qd_policy_t *policy, const qd_connection_t *conn)
{
sys_mutex_lock(stats_lock);
n_connections--;
+ uint64_t nc = n_connections;
assert (n_connections >= 0);
sys_mutex_unlock(stats_lock);
if (policy->enableVhostPolicy) {
@@ -319,7 +320,7 @@ void qd_policy_socket_close(qd_policy_t *policy, const qd_connection_t *conn)
"[C%"PRIu64"] Connection '%s' closed with resources n_sessions=%d, n_senders=%d, n_receivers=%d, "
"sessions_denied=%"PRIu64", senders_denied=%"PRIu64", receivers_denied=%"PRIu64", max_message_size_denied:%"PRIu64", nConnections= %"PRIu64".",
conn->connection_id, hostname, conn->n_sessions, conn->n_senders, conn->n_receivers,
- qpdc->sessionDenied, qpdc->senderDenied, qpdc->receiverDenied, qpdc->maxSizeMessagesDenied, n_connections);
+ qpdc->sessionDenied, qpdc->senderDenied, qpdc->receiverDenied, qpdc->maxSizeMessagesDenied, nc);
}
}
diff --git a/src/server.c b/src/server.c
index 82ad1f3..75527b2 100644
--- a/src/server.c
+++ b/src/server.c
@@ -931,12 +931,12 @@ static void qd_connection_free(qd_connection_t *qd_conn)
sys_mutex_lock(qd_server->lock);
DEQ_REMOVE(qd_server->conn_list, qd_conn);
+ sys_mutex_unlock(qd_server->lock);
// If counted for policy enforcement, notify it has closed
if (qd_conn->policy_counted) {
qd_policy_socket_close(qd_server->qd->policy, qd_conn);
}
- sys_mutex_unlock(qd_server->lock);
invoke_deferred_calls(qd_conn, true); // Discard any pending deferred calls
sys_mutex_free(qd_conn->deferred_call_lock);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org