From 4cfb15d1a705cdba2ad80fb163a838940f3f5b42 Mon Sep 17 00:00:00 2001 From: Gluster Jenkins Date: Wed, 25 Nov 2020 13:37:17 +0000 Subject: [PATCH] autobuild v6.0-49 Resolves: bz#1286171 Signed-off-by: Gluster Jenkins --- ...sure-Rebalance-reports-status-only-o.patch | 255 ++++++++++++++++++ glusterfs.spec | 6 +- 2 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 0480-DHT-Rebalance-Ensure-Rebalance-reports-status-only-o.patch diff --git a/0480-DHT-Rebalance-Ensure-Rebalance-reports-status-only-o.patch b/0480-DHT-Rebalance-Ensure-Rebalance-reports-status-only-o.patch new file mode 100644 index 0000000..31c404f --- /dev/null +++ b/0480-DHT-Rebalance-Ensure-Rebalance-reports-status-only-o.patch @@ -0,0 +1,255 @@ +From 759c12fc016a6399bb179aa0f930602c87d1e0f8 Mon Sep 17 00:00:00 2001 +From: Barak Sason Rofman +Date: Tue, 24 Nov 2020 12:56:10 +0200 +Subject: [PATCH 480/480] DHT/Rebalance - Ensure Rebalance reports status only + once upon stopping + +Upon issuing rebalance stop command, the status of rebalance is being +logged twice to the log file, which can sometime result in an +inconsistent reports (one report states status stopped, while the other +may report something else). + +This fix ensures rebalance reports it's status only once and that the +correct status is being reported. + +Upstream: +> Reviewed-on: https://github.com/gluster/glusterfs/pull/1783 +> fixes: #1782 +> Change-Id: Id3206edfad33b3db60e9df8e95a519928dc7cb37 +> Signed-off-by: Barak Sason Rofman bsasonro@redhat.com + +BUG: 1286171 +Change-Id: Id3206edfad33b3db60e9df8e95a519928dc7cb37 +Signed-off-by: Barak Sason Rofman +Reviewed-on: https://code.engineering.redhat.com/gerrit/218953 +Tested-by: RHGS Build Bot +Reviewed-by: Csaba Henk +Reviewed-by: Sunil Kumar Heggodu Gopala Acharya +--- + tests/bugs/distribute/bug-1286171.t | 75 +++++++++++++++++++++++++++++++++ + xlators/cluster/dht/src/dht-common.c | 2 +- + xlators/cluster/dht/src/dht-common.h | 2 +- + xlators/cluster/dht/src/dht-rebalance.c | 63 ++++++++++++++------------- + 4 files changed, 108 insertions(+), 34 deletions(-) + create mode 100644 tests/bugs/distribute/bug-1286171.t + +diff --git a/tests/bugs/distribute/bug-1286171.t b/tests/bugs/distribute/bug-1286171.t +new file mode 100644 +index 0000000..a2ca36f +--- /dev/null ++++ b/tests/bugs/distribute/bug-1286171.t +@@ -0,0 +1,75 @@ ++#!/bin/bash ++ ++. $(dirname $0)/../../include.rc ++. $(dirname $0)/../../cluster.rc ++. $(dirname $0)/../../volume.rc ++ ++# Initialize ++#------------------------------------------------------------ ++cleanup; ++ ++volname=bug-1286171 ++ ++# Start glusterd ++TEST glusterd; ++TEST pidof glusterd; ++TEST $CLI volume info; ++ ++# Create a volume ++TEST $CLI volume create $volname $H0:$B0/${volname}{1,2} ++ ++# Verify volume creation ++EXPECT "$volname" volinfo_field $volname 'Volume Name'; ++EXPECT 'Created' volinfo_field $volname 'Status'; ++ ++# Start volume and verify successful start ++TEST $CLI volume start $volname; ++EXPECT 'Started' volinfo_field $volname 'Status'; ++TEST glusterfs --volfile-id=$volname --volfile-server=$H0 --entry-timeout=0 $M0; ++#------------------------------------------------------------ ++ ++# Create a nested dir structure and some file under MP ++cd $M0; ++for i in {1..5} ++do ++ mkdir dir$i ++ cd dir$i ++ for j in {1..5} ++ do ++ mkdir dir$i$j ++ cd dir$i$j ++ for k in {1..5} ++ do ++ mkdir dir$i$j$k ++ cd dir$i$j$k ++ touch {1..300} ++ cd .. ++ done ++ touch {1..300} ++ cd .. ++ done ++ touch {1..300} ++ cd .. ++done ++touch {1..300} ++ ++# Add-brick and start rebalance ++TEST $CLI volume add-brick $volname $H0:$B0/${volname}4; ++TEST $CLI volume rebalance $volname start; ++ ++# Let rebalance run for a while ++sleep 5 ++ ++# Stop rebalance ++TEST $CLI volume rebalance $volname stop; ++ ++# Allow rebalance to stop ++sleep 5 ++ ++# Examine the logfile for errors ++cd /var/log/glusterfs; ++failures=`grep "failures:" ${volname}-rebalance.log | tail -1 | sed 's/.*failures: //; s/,.*//'`; ++ ++TEST [ $failures == 0 ]; ++ ++cleanup; +diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c +index 23cc80c..4db89df 100644 +--- a/xlators/cluster/dht/src/dht-common.c ++++ b/xlators/cluster/dht/src/dht-common.c +@@ -10969,7 +10969,7 @@ dht_notify(xlator_t *this, int event, void *data, ...) + if ((cmd == GF_DEFRAG_CMD_STATUS) || + (cmd == GF_DEFRAG_CMD_STATUS_TIER) || + (cmd == GF_DEFRAG_CMD_DETACH_STATUS)) +- gf_defrag_status_get(conf, output); ++ gf_defrag_status_get(conf, output, _gf_false); + else if (cmd == GF_DEFRAG_CMD_START_DETACH_TIER) + gf_defrag_start_detach_tier(defrag); + else if (cmd == GF_DEFRAG_CMD_DETACH_START) +diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h +index 9ec5b51..92f1b89 100644 +--- a/xlators/cluster/dht/src/dht-common.h ++++ b/xlators/cluster/dht/src/dht-common.h +@@ -1252,7 +1252,7 @@ dht_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata); + + int +-gf_defrag_status_get(dht_conf_t *conf, dict_t *dict); ++gf_defrag_status_get(dht_conf_t *conf, dict_t *dict, gf_boolean_t log_status); + + void + gf_defrag_set_pause_state(gf_tier_conf_t *tier_conf, tier_pause_state_t state); +diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c +index d49a719..16ac16c 100644 +--- a/xlators/cluster/dht/src/dht-rebalance.c ++++ b/xlators/cluster/dht/src/dht-rebalance.c +@@ -2720,7 +2720,6 @@ gf_defrag_migrate_single_file(void *opaque) + iatt_ptr = &entry->d_stat; + + if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) { +- ret = -1; + goto out; + } + +@@ -3833,7 +3832,6 @@ gf_defrag_fix_layout(xlator_t *this, gf_defrag_info_t *defrag, loc_t *loc, + list_for_each_entry_safe(entry, tmp, &entries.list, list) + { + if (defrag->defrag_status != GF_DEFRAG_STATUS_STARTED) { +- ret = 1; + goto out; + } + +@@ -4863,7 +4861,7 @@ out: + LOCK(&defrag->lock); + { + status = dict_new(); +- gf_defrag_status_get(conf, status); ++ gf_defrag_status_get(conf, status, _gf_true); + if (ctx && ctx->notify) + ctx->notify(GF_EN_DEFRAG_STATUS, status); + if (status) +@@ -4998,7 +4996,7 @@ out: + } + + int +-gf_defrag_status_get(dht_conf_t *conf, dict_t *dict) ++gf_defrag_status_get(dht_conf_t *conf, dict_t *dict, gf_boolean_t log_status) + { + int ret = 0; + uint64_t files = 0; +@@ -5095,34 +5093,35 @@ gf_defrag_status_get(dht_conf_t *conf, dict_t *dict) + gf_log(THIS->name, GF_LOG_WARNING, "failed to set time-left"); + + log: +- switch (defrag->defrag_status) { +- case GF_DEFRAG_STATUS_NOT_STARTED: +- status = "not started"; +- break; +- case GF_DEFRAG_STATUS_STARTED: +- status = "in progress"; +- break; +- case GF_DEFRAG_STATUS_STOPPED: +- status = "stopped"; +- break; +- case GF_DEFRAG_STATUS_COMPLETE: +- status = "completed"; +- break; +- case GF_DEFRAG_STATUS_FAILED: +- status = "failed"; +- break; +- default: +- break; +- } ++ if (log_status) { ++ switch (defrag->defrag_status) { ++ case GF_DEFRAG_STATUS_NOT_STARTED: ++ status = "not started"; ++ break; ++ case GF_DEFRAG_STATUS_STARTED: ++ status = "in progress"; ++ break; ++ case GF_DEFRAG_STATUS_STOPPED: ++ status = "stopped"; ++ break; ++ case GF_DEFRAG_STATUS_COMPLETE: ++ status = "completed"; ++ break; ++ case GF_DEFRAG_STATUS_FAILED: ++ status = "failed"; ++ break; ++ default: ++ break; ++ } + +- gf_msg(THIS->name, GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STATUS, +- "Rebalance is %s. Time taken is %.2f secs", status, elapsed); +- gf_msg(THIS->name, GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STATUS, +- "Files migrated: %" PRIu64 ", size: %" PRIu64 ", lookups: %" PRIu64 +- ", failures: %" PRIu64 +- ", skipped: " +- "%" PRIu64, +- files, size, lookup, failures, skipped); ++ gf_msg("DHT", GF_LOG_INFO, 0, DHT_MSG_REBALANCE_STATUS, ++ "Rebalance is %s. Time taken is %.2f secs " ++ "Files migrated: %" PRIu64 ", size: %" PRIu64 ++ ", lookups: %" PRIu64 ", failures: %" PRIu64 ++ ", skipped: " ++ "%" PRIu64, ++ status, elapsed, files, size, lookup, failures, skipped); ++ } + out: + return 0; + } +@@ -5299,7 +5298,7 @@ gf_defrag_stop(dht_conf_t *conf, gf_defrag_status_t status, dict_t *output) + defrag->defrag_status = status; + + if (output) +- gf_defrag_status_get(conf, output); ++ gf_defrag_status_get(conf, output, _gf_false); + ret = 0; + out: + gf_msg_debug("", 0, "Returning %d", ret); +-- +1.8.3.1 + diff --git a/glusterfs.spec b/glusterfs.spec index 403fa85..b0fb242 100644 --- a/glusterfs.spec +++ b/glusterfs.spec @@ -237,7 +237,7 @@ Release: 0.1%{?prereltag:.%{prereltag}}%{?dist} %else Name: glusterfs Version: 6.0 -Release: 48%{?dist} +Release: 49%{?dist} ExcludeArch: i686 %endif License: GPLv2 or LGPLv3+ @@ -794,6 +794,7 @@ Patch0476: 0476-mount-fuse-use-cookies-to-get-fuse-interrupt-record-.patch Patch0477: 0477-glusterd-snapshot-Snapshot-prevalidation-failure-not.patch Patch0478: 0478-DHT-Fixing-rebalance-failure-on-issuing-stop-command.patch Patch0479: 0479-ganesha-ha-revised-regex-exprs-for-status.patch +Patch0480: 0480-DHT-Rebalance-Ensure-Rebalance-reports-status-only-o.patch %description GlusterFS is a distributed file-system capable of scaling to several @@ -2537,6 +2538,9 @@ fi %endif %changelog +* Wed Nov 25 2020 Gluster Jenkins - 6.0-49 +- fixes bugs bz#1286171 + * Tue Nov 10 2020 Gluster Jenkins - 6.0-48 - fixes bugs bz#1895301