3604df
From 0801dda0347556d6a933c44016ef789a370b8586 Mon Sep 17 00:00:00 2001
3604df
From: N Balachandran <nbalacha@redhat.com>
3604df
Date: Wed, 26 Oct 2016 09:25:47 +0530
3604df
Subject: [PATCH 143/157] cluster/dht: Incorrect volname in rebalance events
3604df
3604df
The rebalance event code was using strtok to parse the
3604df
volume name which is incorrect.
3604df
Reworked the code to get the correct volume name using
3604df
strstr.
3604df
3604df
Upstream patches:
3604df
master: http://review.gluster.org/15712
3604df
release-3.9: http://review.gluster.org/#/c/15725/
3604df
3604df
Change-Id: I7c00445bafe08034f77c422d2f60ac3252c7afd6
3604df
BUG: 1386472
3604df
Signed-off-by: N Balachandran <nbalacha@redhat.com>
3604df
Reviewed-on: https://code.engineering.redhat.com/gerrit/88228
3604df
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
3604df
Tested-by: Atin Mukherjee <amukherj@redhat.com>
3604df
---
3604df
 xlators/cluster/dht/src/dht-rebalance.c |   56 +++++++++++++++++++++++++++---
3604df
 1 files changed, 50 insertions(+), 6 deletions(-)
3604df
3604df
diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c
3604df
index 194fbb0..5d28e0a 100644
3604df
--- a/xlators/cluster/dht/src/dht-rebalance.c
3604df
+++ b/xlators/cluster/dht/src/dht-rebalance.c
3604df
@@ -73,12 +73,40 @@ dht_set_global_defrag_error (gf_defrag_info_t *defrag, int ret)
3604df
         return;
3604df
 }
3604df
 
3604df
+
3604df
+static gf_boolean_t
3604df
+dht_is_tier_command (int cmd) {
3604df
+
3604df
+        gf_boolean_t is_tier = _gf_false;
3604df
+
3604df
+        switch (cmd) {
3604df
+        case GF_DEFRAG_CMD_START_TIER:
3604df
+        case GF_DEFRAG_CMD_STATUS_TIER:
3604df
+        case GF_DEFRAG_CMD_START_DETACH_TIER:
3604df
+        case GF_DEFRAG_CMD_STOP_DETACH_TIER:
3604df
+        case GF_DEFRAG_CMD_PAUSE_TIER:
3604df
+        case GF_DEFRAG_CMD_RESUME_TIER:
3604df
+                is_tier = _gf_true;
3604df
+                break;
3604df
+        default:
3604df
+                break;
3604df
+        }
3604df
+        return is_tier;
3604df
+
3604df
+}
3604df
+
3604df
+
3604df
 static int
3604df
-dht_send_rebalance_event (xlator_t *this, gf_defrag_status_t status)
3604df
+dht_send_rebalance_event (xlator_t *this, int cmd, gf_defrag_status_t status)
3604df
 {
3604df
         int ret = -1;
3604df
         char *volname = NULL;
3604df
         char *tmpstr  = NULL;
3604df
+        char *ptr = NULL;
3604df
+        char *suffix = "-dht";
3604df
+        dht_conf_t   *conf = NULL;
3604df
+        gf_defrag_info_t *defrag = NULL;
3604df
+        int len = 0;
3604df
 
3604df
         eventtypes_t event = EVENT_LAST;
3604df
 
3604df
@@ -97,17 +125,33 @@ dht_send_rebalance_event (xlator_t *this, gf_defrag_status_t status)
3604df
 
3604df
         }
3604df
 
3604df
-        tmpstr = gf_strdup (this->name);
3604df
-        if (tmpstr) {
3604df
-                volname = strtok(tmpstr, "-dht");
3604df
+        if (dht_is_tier_command (cmd)) {
3604df
+                /* We should have the tier volume name*/
3604df
+                conf = this->private;
3604df
+                defrag = conf->defrag;
3604df
+                volname = defrag->tier_conf.volname;
3604df
+        } else {
3604df
+                /* DHT volume */
3604df
+                len = strlen (this->name);
3604df
+                tmpstr = gf_strdup (this->name);
3604df
+                if (tmpstr) {
3604df
+                        ptr = tmpstr + (len - strlen (suffix));
3604df
+                        if (!strcmp (ptr, suffix)) {
3604df
+                                tmpstr[len - strlen (suffix)] = '\0';
3604df
+                                volname = tmpstr;
3604df
+                        }
3604df
+                }
3604df
         }
3604df
 
3604df
-        if (!volname)
3604df
+        if (!volname) {
3604df
+                /* Better than nothing */
3604df
                 volname = this->name;
3604df
+        }
3604df
 
3604df
         if (event != EVENT_LAST) {
3604df
                 ret = gf_event (event, "volume=%s", volname);
3604df
         }
3604df
+
3604df
         GF_FREE (tmpstr);
3604df
         return ret;
3604df
 }
3604df
@@ -3866,7 +3910,7 @@ out:
3604df
                 defrag->defrag_status = GF_DEFRAG_STATUS_COMPLETE;
3604df
         }
3604df
 
3604df
-        dht_send_rebalance_event (this, defrag->defrag_status);
3604df
+        dht_send_rebalance_event (this, defrag->cmd, defrag->defrag_status);
3604df
 
3604df
         LOCK (&defrag->lock);
3604df
         {
3604df
-- 
3604df
1.7.1
3604df