From 3c27ddac02366c6e5b015c832d4656f520680ced Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Tue, 25 Oct 2016 22:02:16 +0530 Subject: cluster/dht: Incorrect volname in rebalance events The rebalance event code was using strtok to parse the volume name which is incorrect. Reworked the code to get the correct volume name using strstr. > Change-Id: Ib5f3305a34e6bf1ecfef677d87c5aff96bdeb0e6 > BUG: 1388010 > Signed-off-by: N Balachandran > Reviewed-on: http://review.gluster.org/15712 > NetBSD-regression: NetBSD Build System > Smoke: Gluster Build System > Reviewed-by: Raghavendra G > CentOS-regression: Gluster Build System (cherry picked from commit f4efbf0e3092bd2181f62be1e1f30f202678c866) Change-Id: Ia22d6a8ce23e9dcab8281b4995277cbb3a196fda BUG: 1388563 Signed-off-by: N Balachandran Reviewed-on: http://review.gluster.org/15725 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Pranith Kumar Karampuri --- xlators/cluster/dht/src/dht-rebalance.c | 56 +++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) (limited to 'xlators/cluster') diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 2fe786ec6ba..6b9f73cb388 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -73,12 +73,40 @@ dht_set_global_defrag_error (gf_defrag_info_t *defrag, int ret) return; } + +static gf_boolean_t +dht_is_tier_command (int cmd) { + + gf_boolean_t is_tier = _gf_false; + + switch (cmd) { + case GF_DEFRAG_CMD_START_TIER: + case GF_DEFRAG_CMD_STATUS_TIER: + case GF_DEFRAG_CMD_START_DETACH_TIER: + case GF_DEFRAG_CMD_STOP_DETACH_TIER: + case GF_DEFRAG_CMD_PAUSE_TIER: + case GF_DEFRAG_CMD_RESUME_TIER: + is_tier = _gf_true; + break; + default: + break; + } + return is_tier; + +} + + static int -dht_send_rebalance_event (xlator_t *this, gf_defrag_status_t status) +dht_send_rebalance_event (xlator_t *this, int cmd, gf_defrag_status_t status) { int ret = -1; char *volname = NULL; char *tmpstr = NULL; + char *ptr = NULL; + char *suffix = "-dht"; + dht_conf_t *conf = NULL; + gf_defrag_info_t *defrag = NULL; + int len = 0; eventtypes_t event = EVENT_LAST; @@ -97,17 +125,33 @@ dht_send_rebalance_event (xlator_t *this, gf_defrag_status_t status) } - tmpstr = gf_strdup (this->name); - if (tmpstr) { - volname = strtok(tmpstr, "-dht"); + if (dht_is_tier_command (cmd)) { + /* We should have the tier volume name*/ + conf = this->private; + defrag = conf->defrag; + volname = defrag->tier_conf.volname; + } else { + /* DHT volume */ + len = strlen (this->name); + tmpstr = gf_strdup (this->name); + if (tmpstr) { + ptr = tmpstr + (len - strlen (suffix)); + if (!strcmp (ptr, suffix)) { + tmpstr[len - strlen (suffix)] = '\0'; + volname = tmpstr; + } + } } - if (!volname) + if (!volname) { + /* Better than nothing */ volname = this->name; + } if (event != EVENT_LAST) { ret = gf_event (event, "volume=%s", volname); } + GF_FREE (tmpstr); return ret; } @@ -3873,7 +3917,7 @@ out: defrag->defrag_status = GF_DEFRAG_STATUS_COMPLETE; } - dht_send_rebalance_event (this, defrag->defrag_status); + dht_send_rebalance_event (this, defrag->cmd, defrag->defrag_status); LOCK (&defrag->lock); { -- cgit