diff options
-rw-r--r-- | cli/src/cli-rpc-ops.c | 21 | ||||
-rw-r--r-- | tests/bugs/distribute/bug-1389697.t | 42 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-brick-ops.c | 3 |
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) { |