summaryrefslogtreecommitdiff
path: root/0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch
diff options
context:
space:
mode:
Diffstat (limited to '0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch')
-rw-r--r--0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch250
1 files changed, 250 insertions, 0 deletions
diff --git a/0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch b/0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch
new file mode 100644
index 0000000..158b4b7
--- /dev/null
+++ b/0533-glusterd-Rebalance-cli-is-not-showing-correct-status.patch
@@ -0,0 +1,250 @@
+From 854ab79dbef449c39adf66e3faebb4681359fce4 Mon Sep 17 00:00:00 2001
+From: mohit84 <moagrawa@redhat.com>
+Date: Thu, 18 Feb 2021 09:40:44 +0530
+Subject: [PATCH 533/538] glusterd: Rebalance cli is not showing correct status
+ after reboot (#2172)
+
+Rebalance cli is not showing correct status after reboot.
+
+The CLI is not correct status because defrag object is not
+valid at the time of creating a rpc connection to show the status.
+The defrag object is not valid because at the time of start a glusterd
+glusterd_restart_rebalance can be call almost at the same time by two
+different synctask and glusterd got a disconnect on rpc object and it
+cleanup the defrag object.
+
+Solution: To avoid the defrag object populate a reference count before
+ create a defrag rpc object.
+>Fixes: #1339
+>Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
+>Change-Id: Ia284015d79beaa3d703ebabb92f26870a5aaafba
+Upstream Patch : https://github.com/gluster/glusterfs/pull/2172
+
+BUG: 1832306
+Change-Id: Ia284015d79beaa3d703ebabb92f26870a5aaafba
+Signed-off-by: srijan-sivakumar <ssivakum@redhat.com>
+Reviewed-on: https://code.engineering.redhat.com/gerrit/228249
+Tested-by: RHGS Build Bot <nigelb@redhat.com>
+Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
+---
+ xlators/mgmt/glusterd/src/glusterd-rebalance.c | 35 ++++++++++-----
+ xlators/mgmt/glusterd/src/glusterd-syncop.c | 1 +
+ xlators/mgmt/glusterd/src/glusterd-utils.c | 59 +++++++++++++++++++++++++-
+ xlators/mgmt/glusterd/src/glusterd-utils.h | 5 +++
+ xlators/mgmt/glusterd/src/glusterd.h | 1 +
+ 5 files changed, 90 insertions(+), 11 deletions(-)
+
+diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c
+index b419a89..fcd5318 100644
+--- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c
++++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c
+@@ -86,6 +86,7 @@ __glusterd_defrag_notify(struct rpc_clnt *rpc, void *mydata,
+ glusterd_conf_t *priv = NULL;
+ xlator_t *this = NULL;
+ int pid = -1;
++ int refcnt = 0;
+
+ this = THIS;
+ if (!this)
+@@ -125,11 +126,12 @@ __glusterd_defrag_notify(struct rpc_clnt *rpc, void *mydata,
+ }
+
+ case RPC_CLNT_DISCONNECT: {
+- if (!defrag->connected)
+- return 0;
+-
+ LOCK(&defrag->lock);
+ {
++ if (!defrag->connected) {
++ UNLOCK(&defrag->lock);
++ return 0;
++ }
+ defrag->connected = 0;
+ }
+ UNLOCK(&defrag->lock);
+@@ -146,11 +148,11 @@ __glusterd_defrag_notify(struct rpc_clnt *rpc, void *mydata,
+ glusterd_defrag_rpc_put(defrag);
+ if (defrag->cbk_fn)
+ defrag->cbk_fn(volinfo, volinfo->rebal.defrag_status);
+-
+- GF_FREE(defrag);
++ refcnt = glusterd_defrag_unref(defrag);
+ gf_msg(this->name, GF_LOG_INFO, 0, GD_MSG_REBALANCE_DISCONNECTED,
+- "Rebalance process for volume %s has disconnected.",
+- volinfo->volname);
++ "Rebalance process for volume %s has disconnected"
++ " and defrag refcnt is %d.",
++ volinfo->volname, refcnt);
+ break;
+ }
+ case RPC_CLNT_DESTROY:
+@@ -309,7 +311,11 @@ glusterd_handle_defrag_start(glusterd_volinfo_t *volinfo, char *op_errstr,
+ gf_msg_debug("glusterd", 0, "rebalance command failed");
+ goto out;
+ }
+-
++ /* Take reference before sleep to save defrag object cleanup while
++ glusterd_restart_rebalance call for other bricks by syncktask
++ at the time of restart a glusterd.
++ */
++ glusterd_defrag_ref(defrag);
+ sleep(5);
+
+ ret = glusterd_rebalance_rpc_create(volinfo);
+@@ -372,6 +378,7 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo)
+ GF_ASSERT(this);
+ priv = this->private;
+ GF_ASSERT(priv);
++ struct rpc_clnt *rpc = NULL;
+
+ // rebalance process is not started
+ if (!defrag)
+@@ -396,13 +403,21 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo)
+ }
+
+ glusterd_volinfo_ref(volinfo);
+- ret = glusterd_rpc_create(&defrag->rpc, options, glusterd_defrag_notify,
+- volinfo, _gf_true);
++ ret = glusterd_rpc_create(&rpc, options, glusterd_defrag_notify, volinfo,
++ _gf_false);
+ if (ret) {
+ gf_msg(THIS->name, GF_LOG_ERROR, 0, GD_MSG_RPC_CREATE_FAIL,
+ "Glusterd RPC creation failed");
+ goto out;
+ }
++ LOCK(&defrag->lock);
++ {
++ if (!defrag->rpc)
++ defrag->rpc = rpc;
++ else
++ rpc_clnt_unref(rpc);
++ }
++ UNLOCK(&defrag->lock);
+ ret = 0;
+ out:
+ if (options)
+diff --git a/xlators/mgmt/glusterd/src/glusterd-syncop.c b/xlators/mgmt/glusterd/src/glusterd-syncop.c
+index df78fef..05c9e11 100644
+--- a/xlators/mgmt/glusterd/src/glusterd-syncop.c
++++ b/xlators/mgmt/glusterd/src/glusterd-syncop.c
+@@ -1732,6 +1732,7 @@ gd_brick_op_phase(glusterd_op_t op, dict_t *op_ctx, dict_t *req_dict,
+ if (!rpc) {
+ if (pending_node->type == GD_NODE_REBALANCE && pending_node->node) {
+ volinfo = pending_node->node;
++ glusterd_defrag_ref(volinfo->rebal.defrag);
+ ret = glusterd_rebalance_rpc_create(volinfo);
+ if (ret) {
+ ret = 0;
+diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
+index bc188a2..9fb8eab 100644
+--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
++++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
+@@ -93,6 +93,44 @@
+ #define NLMV4_VERSION 4
+ #define NLMV1_VERSION 1
+
++int
++glusterd_defrag_ref(glusterd_defrag_info_t *defrag)
++{
++ int refcnt = 0;
++
++ if (!defrag)
++ goto out;
++
++ LOCK(&defrag->lock);
++ {
++ refcnt = ++defrag->refcnt;
++ }
++ UNLOCK(&defrag->lock);
++
++out:
++ return refcnt;
++}
++
++int
++glusterd_defrag_unref(glusterd_defrag_info_t *defrag)
++{
++ int refcnt = -1;
++
++ if (!defrag)
++ goto out;
++
++ LOCK(&defrag->lock);
++ {
++ refcnt = --defrag->refcnt;
++ if (refcnt <= 0)
++ GF_FREE(defrag);
++ }
++ UNLOCK(&defrag->lock);
++
++out:
++ return refcnt;
++}
++
+ gf_boolean_t
+ is_brick_mx_enabled(void)
+ {
+@@ -9370,6 +9408,7 @@ glusterd_volume_defrag_restart(glusterd_volinfo_t *volinfo, char *op_errstr,
+ char pidfile[PATH_MAX] = "";
+ int ret = -1;
+ pid_t pid = 0;
++ int refcnt = 0;
+
+ this = THIS;
+ GF_ASSERT(this);
+@@ -9410,7 +9449,25 @@ glusterd_volume_defrag_restart(glusterd_volinfo_t *volinfo, char *op_errstr,
+ volinfo->volname);
+ goto out;
+ }
+- ret = glusterd_rebalance_rpc_create(volinfo);
++ refcnt = glusterd_defrag_ref(volinfo->rebal.defrag);
++ /* If refcnt value is 1 it means either defrag object is
++ poulated by glusterd_rebalance_defrag_init or previous
++ rpc creation was failed.If it is not 1 it means it(defrag)
++ was populated at the time of start a rebalance daemon.
++ We need to create a rpc object only while a previous
++ rpc connection was not established successfully at the
++ time of restart a rebalance daemon by
++ glusterd_handle_defrag_start otherwise rebalance cli
++ does not show correct status after just reboot a node and try
++ to print the rebalance status because defrag object has been
++ destroyed during handling of rpc disconnect.
++ */
++ if (refcnt == 1) {
++ ret = glusterd_rebalance_rpc_create(volinfo);
++ } else {
++ ret = 0;
++ glusterd_defrag_unref(volinfo->rebal.defrag);
++ }
+ break;
+ }
+ case GF_DEFRAG_STATUS_NOT_STARTED:
+diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h
+index 02d85d2..4541471 100644
+--- a/xlators/mgmt/glusterd/src/glusterd-utils.h
++++ b/xlators/mgmt/glusterd/src/glusterd-utils.h
+@@ -886,4 +886,9 @@ int32_t
+ glusterd_check_brick_order(dict_t *dict, char *err_str, int32_t type,
+ int32_t sub_count);
+
++int
++glusterd_defrag_ref(glusterd_defrag_info_t *defrag);
++
++int
++glusterd_defrag_unref(glusterd_defrag_info_t *defrag);
+ #endif
+diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
+index efe4d0e..9de3f28 100644
+--- a/xlators/mgmt/glusterd/src/glusterd.h
++++ b/xlators/mgmt/glusterd/src/glusterd.h
+@@ -321,6 +321,7 @@ struct glusterd_defrag_info_ {
+ uint64_t total_data;
+ uint64_t num_files_lookedup;
+ uint64_t total_failures;
++ int refcnt;
+ gf_lock_t lock;
+ int cmd;
+ pthread_t th;
+--
+1.8.3.1
+