2f3c8edfdf
Resolves: bz#1390151 bz#1410145 bz#1429190 bz#1510752 bz#1511779 Resolves: bz#1570958 bz#1574490 bz#1595246 bz#1618669 bz#1661393 Resolves: bz#1668989 bz#1669020 Signed-off-by: Milind Changire <mchangir@redhat.com>
115 lines
4.7 KiB
Diff
115 lines
4.7 KiB
Diff
From 61d178c25468adfac4cbdfcef43a0d002c635466 Mon Sep 17 00:00:00 2001
|
|
From: Mohit Agrawal <moagrawa@redhat.com>
|
|
Date: Tue, 5 Feb 2019 12:49:10 +0530
|
|
Subject: [PATCH 513/529] 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
|
|
> (Cherry pick from commit b41cdeb638f9f9ec2fef13ec95c216faf52a9df9)
|
|
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22108/)
|
|
|
|
Change-Id: Ic810095ea1ce418836d240d411168df8be0e4a41
|
|
BUG: 1669020
|
|
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
|
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/162251
|
|
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
|
|
---
|
|
libglusterfs/src/client_t.c | 1 +
|
|
libglusterfs/src/client_t.h | 2 ++
|
|
libglusterfs/src/xlator.c | 1 -
|
|
libglusterfs/src/xlator.h | 3 ---
|
|
xlators/protocol/server/src/server-helpers.c | 4 ++--
|
|
5 files changed, 5 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/libglusterfs/src/client_t.c b/libglusterfs/src/client_t.c
|
|
index a9ae62c..7d92e0d 100644
|
|
--- a/libglusterfs/src/client_t.c
|
|
+++ b/libglusterfs/src/client_t.c
|
|
@@ -232,6 +232,7 @@ gf_client_get (xlator_t *this, struct rpcsvc_auth_data *cred, char *client_uid,
|
|
|
|
GF_ATOMIC_INIT (client->bind, 1);
|
|
GF_ATOMIC_INIT (client->count, 1);
|
|
+ GF_ATOMIC_INIT(client->fd_cnt, 0);
|
|
|
|
client->auth.flavour = cred->flavour;
|
|
if (cred->flavour != AUTH_NONE) {
|
|
diff --git a/libglusterfs/src/client_t.h b/libglusterfs/src/client_t.h
|
|
index 088508e..403c488 100644
|
|
--- a/libglusterfs/src/client_t.h
|
|
+++ b/libglusterfs/src/client_t.h
|
|
@@ -46,6 +46,8 @@ typedef struct _client {
|
|
inode_t *subdir_inode;
|
|
uuid_t subdir_gfid;
|
|
int32_t opversion;
|
|
+ /* Variable to save fd_count for detach brick */
|
|
+ gf_atomic_t fd_cnt;
|
|
} client_t;
|
|
|
|
#define GF_CLIENTCTX_INITIAL_SIZE 8
|
|
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
|
|
index 340d83d..7d90baa 100644
|
|
--- a/libglusterfs/src/xlator.c
|
|
+++ b/libglusterfs/src/xlator.c
|
|
@@ -490,7 +490,6 @@ xlator_init (xlator_t *xl)
|
|
|
|
xl->instance_name = NULL;
|
|
GF_ATOMIC_INIT(xl->xprtrefcnt, 0);
|
|
- GF_ATOMIC_INIT(xl->fd_cnt, 0);
|
|
if (!xl->init) {
|
|
gf_msg (xl->name, GF_LOG_WARNING, 0, LG_MSG_INIT_FAILED,
|
|
"No init() found");
|
|
diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h
|
|
index f8f2630..202bdca 100644
|
|
--- a/libglusterfs/src/xlator.h
|
|
+++ b/libglusterfs/src/xlator.h
|
|
@@ -965,9 +965,6 @@ struct _xlator {
|
|
/* flag to avoid recall of xlator_mem_cleanup for xame xlator */
|
|
uint32_t call_cleanup;
|
|
|
|
- /* Variable to save fd_count for detach brick */
|
|
- gf_atomic_t fd_cnt;
|
|
-
|
|
/* Variable to save xprt associated for detach brick */
|
|
gf_atomic_t xprtrefcnt;
|
|
|
|
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c
|
|
index 99256bf..30045ef 100644
|
|
--- a/xlators/protocol/server/src/server-helpers.c
|
|
+++ b/xlators/protocol/server/src/server-helpers.c
|
|
@@ -266,7 +266,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);
|
|
{
|
|
@@ -413,7 +413,7 @@ server_connection_cleanup (xlator_t *this, client_t *client,
|
|
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);
|
|
}
|
|
}
|
|
|
|
--
|
|
1.8.3.1
|
|
|