From b41cdeb638f9f9ec2fef13ec95c216faf52a9df9 Mon Sep 17 00:00:00 2001 From: Mohit Agrawal Date: Mon, 28 Jan 2019 21:28:45 +0530 Subject: core: heketi-cli is throwing error "target is busy" Problem: When rpc-transport-disconnect happens, server_connection_cleanup_flush_cbk() is supposed to call rpc_transport_unref() after open-files on that transport are flushed per transport.But open-fd-count is maintained in bound_xl->fd_count, which can be incremented/decremented cumulatively in server_connection_cleanup() by all transport disconnect paths. So instead of rpc_transport_unref() happening per transport, it ends up doing it only once after all the files on all the transports for the brick are flushed leading to rpc-leaks. Solution: To avoid races maintain fd_cnt at client instead of maintaining on brick Credits: Pranith Kumar Karampuri Change-Id: I6e8ea37a61f82d9aefb227c5b3ab57a7a36850e6 fixes: bz#1668190 Signed-off-by: Mohit Agrawal --- xlators/protocol/server/src/server-helpers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'xlators') diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 8ad2d8492ed..1a34239d8b9 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -257,7 +257,7 @@ server_connection_cleanup_flush_cbk(call_frame_t *frame, void *cookie, victim = client->bound_xl; if (victim) { - fd_cnt = GF_ATOMIC_DEC(victim->fd_cnt); + fd_cnt = GF_ATOMIC_DEC(client->fd_cnt); if (!fd_cnt && conf && detach) { pthread_mutex_lock(&conf->mutex); { @@ -399,7 +399,7 @@ server_connection_cleanup(xlator_t *this, client_t *client, int32_t flags, if (fd_cnt) { if (fd_exist) (*fd_exist) = _gf_true; - GF_ATOMIC_ADD(bound_xl->fd_cnt, fd_cnt); + GF_ATOMIC_ADD(client->fd_cnt, fd_cnt); } } -- cgit