summaryrefslogtreecommitdiff
path: root/0099-client-fini-return-fini-after-rpc-cleanup.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-01 14:35:16 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-01 14:35:16 +0000
commit2453fd874197f84e11ae70053cff7f56a32988f4 (patch)
treed6ce5f0f1defa8b7a9b070ba870a8b7f916578dc /0099-client-fini-return-fini-after-rpc-cleanup.patch
parente47cbe682033e9df1530280ef7460c172c32961a (diff)
automatic import of glusterfsopeneuler24.03_LTS
Diffstat (limited to '0099-client-fini-return-fini-after-rpc-cleanup.patch')
-rw-r--r--0099-client-fini-return-fini-after-rpc-cleanup.patch119
1 files changed, 119 insertions, 0 deletions
diff --git a/0099-client-fini-return-fini-after-rpc-cleanup.patch b/0099-client-fini-return-fini-after-rpc-cleanup.patch
new file mode 100644
index 0000000..5cff104
--- /dev/null
+++ b/0099-client-fini-return-fini-after-rpc-cleanup.patch
@@ -0,0 +1,119 @@
+From d79cb2cdff6fe8d962c9ac095a7541ddf500302b Mon Sep 17 00:00:00 2001
+From: Mohammed Rafi KC <rkavunga@redhat.com>
+Date: Mon, 1 Apr 2019 14:44:20 +0530
+Subject: [PATCH 099/124] client/fini: return fini after rpc cleanup
+
+There is a race condition in rpc_transport later
+and client fini.
+
+Sequence of events to happen the race condition
+1) When we want to destroy a graph, we send a parent down
+ event first
+2) Once parent down received on a client xlator, we will
+ initiates a rpc disconnect
+3) This will in turn generates a child down event.
+4) When we process child down, we first do fini for
+ Every xlator
+5) On successful return of fini, we delete the graph
+
+Here after the step 5, there is a chance that the fini
+on client might not be finished. Because an rpc_tranpsort
+ref can race with the above sequence.
+
+So we have to wait till all rpc's are successfully freed
+before returning the fini from client
+
+Backport of: https://review.gluster.org/#/c/glusterfs/+/22468/
+
+>Change-Id: I20145662d71fb837e448a4d3210d1fcb2855f2d4
+>fixes: bz#1659708
+>Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
+
+Change-Id: I848bcfb9443467caed32bae0717244ab01b407fc
+BUG: 1471742
+Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/167831
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
+---
+ xlators/protocol/client/src/client.c | 25 ++++++++++++++++++++-----
+ xlators/protocol/client/src/client.h | 6 ++++++
+ 2 files changed, 26 insertions(+), 5 deletions(-)
+
+diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c
+index 19f5175..a372807 100644
+--- a/xlators/protocol/client/src/client.c
++++ b/xlators/protocol/client/src/client.c
+@@ -49,11 +49,12 @@ client_fini_complete(xlator_t *this)
+ if (!conf->destroy)
+ return 0;
+
+- this->private = NULL;
+-
+- pthread_spin_destroy(&conf->fd_lock);
+- pthread_mutex_destroy(&conf->lock);
+- GF_FREE(conf);
++ pthread_mutex_lock(&conf->lock);
++ {
++ conf->fini_completed = _gf_true;
++ pthread_cond_broadcast(&conf->fini_complete_cond);
++ }
++ pthread_mutex_unlock(&conf->lock);
+
+ out:
+ return 0;
+@@ -2721,6 +2722,7 @@ init(xlator_t *this)
+ goto out;
+
+ pthread_mutex_init(&conf->lock, NULL);
++ pthread_cond_init(&conf->fini_complete_cond, NULL);
+ pthread_spin_init(&conf->fd_lock, 0);
+ INIT_LIST_HEAD(&conf->saved_fds);
+
+@@ -2779,6 +2781,7 @@ fini(xlator_t *this)
+ if (!conf)
+ return;
+
++ conf->fini_completed = _gf_false;
+ conf->destroy = 1;
+ if (conf->rpc) {
+ /* cleanup the saved-frames before last unref */
+@@ -2786,6 +2789,18 @@ fini(xlator_t *this)
+ rpc_clnt_unref(conf->rpc);
+ }
+
++ pthread_mutex_lock(&conf->lock);
++ {
++ while (!conf->fini_completed)
++ pthread_cond_wait(&conf->fini_complete_cond, &conf->lock);
++ }
++ pthread_mutex_unlock(&conf->lock);
++
++ pthread_spin_destroy(&conf->fd_lock);
++ pthread_mutex_destroy(&conf->lock);
++ pthread_cond_destroy(&conf->fini_complete_cond);
++ GF_FREE(conf);
++
+ /* Saved Fds */
+ /* TODO: */
+
+diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h
+index f12fa61..8dcd72f 100644
+--- a/xlators/protocol/client/src/client.h
++++ b/xlators/protocol/client/src/client.h
+@@ -235,6 +235,12 @@ typedef struct clnt_conf {
+ * up, disconnects can be
+ * logged
+ */
++
++ gf_boolean_t old_protocol; /* used only for old-protocol testing */
++ pthread_cond_t fini_complete_cond; /* Used to wait till we finsh the fini
++ compltely, ie client_fini_complete
++ to return*/
++ gf_boolean_t fini_completed;
+ } clnt_conf_t;
+
+ typedef struct _client_fd_ctx {
+--
+1.8.3.1
+