summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorN Balachandran <nbalacha@redhat.com>2016-10-28 15:21:52 +0530
committerAtin Mukherjee <amukherj@redhat.com>2016-11-17 02:14:15 -0800
commit35b085ba345cafb2b0ee978a4c4475ab0dcba5a6 (patch)
treee766097b684a6b534e553be4fa1a5fe5de258633
parent35e8ecabd7db36431ea93f523095bc21078ecef8 (diff)
cli/rebalance: remove brick status is incorrect
If a remove brick operation is preceded by a fix-layout, running remove-brick status on a node which does not contain any of the bricks that were removed displays fix-layout status. The defrag_cmd variable was not updated in glusterd for the nodes not hosting removed bricks causing the status parsing to go wrong. This is now updated. Also made minor modifications to the spacing in the fix-layout status output. Change-Id: Ib735ce26be7434cd71b76e4c33d9b0648d0530db BUG: 1389697 Signed-off-by: N Balachandran <nbalacha@redhat.com> Reviewed-on: http://review.gluster.org/15749 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
-rw-r--r--cli/src/cli-rpc-ops.c21
-rw-r--r--tests/bugs/distribute/bug-1389697.t42
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-brick-ops.c3
3 files changed, 61 insertions, 5 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c
index f217e13abdd..1f641f4a2fd 100644
--- a/cli/src/cli-rpc-ops.c
+++ b/cli/src/cli-rpc-ops.c
@@ -1609,6 +1609,7 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,
int min = 0;
int sec = 0;
gf_boolean_t down = _gf_false;
+ gf_boolean_t fix_layout = _gf_false;
ret = dict_get_int32 (dict, "count", &count);
if (ret) {
@@ -1626,10 +1627,20 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,
goto out;
}
- if (status_rcd >= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED) {
- cli_out ("%10s %40s %18s", "Node", "status",
+ /* Fix layout will be sent to all nodes for the volume
+ so every status should be of type
+ GF_DEFRAG_STATUS_LAYOUT_FIX*
+ */
+
+ if ((task_type == GF_TASK_TYPE_REBALANCE)
+ && (status_rcd >= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED)) {
+ fix_layout = _gf_true;
+ }
+
+ if (fix_layout) {
+ cli_out ("%20s %40s %18s", "Node", "status",
"run time in h:m:s");
- cli_out ("%10s %40s %18s", "---------", "-----------",
+ cli_out ("%20s %40s %18s", "---------", "-----------",
"------------");
} else {
cli_out ("%40s %16s %13s %13s %13s %13s %20s %18s",
@@ -1738,8 +1749,8 @@ gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type,
min = ((int) elapsed % 3600) / 60;
sec = ((int) elapsed % 3600) % 60;
- if (status_rcd >= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED) {
- cli_out ("%10s %40s %8d:%d:%d", node_name, status_str,
+ if (fix_layout) {
+ cli_out ("%20s %40s %8d:%d:%d", node_name, status_str,
hrs, min, sec);
} else {
if (size_str) {
diff --git a/tests/bugs/distribute/bug-1389697.t b/tests/bugs/distribute/bug-1389697.t
new file mode 100644
index 00000000000..0d428b8d9d2
--- /dev/null
+++ b/tests/bugs/distribute/bug-1389697.t
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../cluster.rc
+
+
+cleanup
+
+TEST launch_cluster 2;
+TEST $CLI_1 peer probe $H2;
+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count
+
+TEST $CLI_1 volume create $V0 $H1:$B1/b1 $H1:$B1/b2 $H2:$B2/b3
+TEST $CLI_1 volume start $V0
+
+#Start a fix-layout
+TEST $CLI_1 volume rebalance $V0 fix-layout start
+
+#volume rebalance status should work
+TEST $CLI_1 volume rebalance $V0 status
+$CLI_1 volume rebalance $V0 status
+
+val=$($CLI_1 volume rebalance $V0 status |grep "fix-layout" 2>&1)
+val=$?
+TEST [ $val -eq 0 ];
+
+#Start a remove brick for the brick on H2
+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 start
+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 status
+
+#Check remove brick status from H1
+$CLI_1 volume remove-brick $V0 $H2:$B2/b3 status |grep "fix-layout" 2>&1
+val=$?
+TEST [ $val -eq 1 ];
+
+$CLI_1 volume remove-brick $V0 $H2:$B2/b3 status
+$CLI_2 volume remove-brick $V0 $H2:$B2/b3 status
+
+
+TEST $CLI_1 volume remove-brick $V0 $H2:$B2/b3 stop
+
+cleanup
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
index 276c6df0aee..7bed110dce9 100644
--- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
@@ -2652,7 +2652,10 @@ glusterd_op_remove_brick (dict_t *dict, char **op_errstr)
/* Reset defrag status to 'NOT STARTED' whenever a
* remove-brick/rebalance command is issued to remove
* stale information from previous run.
+ * Update defrag_cmd as well or it will only be done
+ * for nodes on which the brick to be removed exists.
*/
+ volinfo->rebal.defrag_cmd = cmd;
volinfo->rebal.defrag_status = GF_DEFRAG_STATUS_NOT_STARTED;
ret = dict_get_str (dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str);
if (ret) {