diff options
| author | Amar Tumballi <amar@gluster.com> | 2011-09-09 09:42:51 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-09-13 02:10:12 -0700 | 
| commit | 25daa42911d2ff697880ee29c591cac5f2abebed (patch) | |
| tree | 9555284c052e1e205909e91f578a8b46b522ec56 /cli/src/cli-cmd-parser.c | |
| parent | 17e57f27c714c94dd5d9fa91650f83d069f2f4e4 (diff) | |
support for de-commissioning a node using 'remove-brick'
to achieve this, we now create volume-file with
'decommissioned-nodes' option in distribute volume, then just
perform the rebalance set of operations (with 'force' flag set).
now onwards, the 'remove-brick' (with 'start' option) operation tries
to migrate data from removed bricks to existing bricks.
'remove-brick' also supports similar options as of replace-brick.
* (no options) -> works as 'force', will have the current behavior
         of remove-brick, ie., no data-migration, volume changes.
* start  (starts remove-brick with data-migration/draining process,
          which takes care of migrating data and once complete, will
          commit the changes to volume file)
* pause  (stop data migration, but keep the volume file intact with
          extra options whatever is set)
* abort  (stop data-migration, and fall back to old configuration)
* commit (if volume is stopped, commits the changes to volumefile)
* force  (stops the data-migration and commits the changes to
          volume file)
Change-Id: I3952bcfbe604a0952e68b6accace7014d5e401d3
BUG: 1952
Reviewed-on: http://review.gluster.com/118
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'cli/src/cli-cmd-parser.c')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 51 | 
1 files changed, 44 insertions, 7 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 3e68b2cce8e..8ea6581aff8 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -753,7 +753,7 @@ out:  int32_t  cli_cmd_volume_remove_brick_parse (const char **words, int wordcount, -                                   dict_t **options) +                                   dict_t **options, int *question)  {          dict_t  *dict = NULL;          char    *volname = NULL; @@ -765,6 +765,10 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,          int32_t j = 0;          char    *tmp_brick = NULL;          char    *tmp_brick1 = NULL; +        char    *opwords[] = { "start", "commit", "pause", "abort", "status", +                               "force", NULL }; +        char    *w = NULL; +        int32_t  command = GF_OP_CMD_NONE;          GF_ASSERT (words);          GF_ASSERT (options); @@ -782,19 +786,53 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,          GF_ASSERT (volname);          ret = dict_set_str (dict, "volname", volname); -          if (ret)                  goto out; +        w = str_getunamb (words[wordcount - 1], opwords); +        if (!w) { +                /* Should be default 'force' */ +                command = GF_OP_CMD_COMMIT_FORCE; +                if (question) +                        *question = 1; +        } else { +                /* handled this option */ +                wordcount--; +                if (!strcmp ("start", w)) { +                        command = GF_OP_CMD_START; +                } else if (!strcmp ("commit", w)) { +                        command = GF_OP_CMD_COMMIT; +                        if (question) +                                *question = 1; +                } else if (!strcmp ("pause", w)) { +                        command = GF_OP_CMD_PAUSE; +                } else if (!strcmp ("abort", w)) { +                        command = GF_OP_CMD_ABORT; +                } else if (!strcmp ("status", w)) { +                        command = GF_OP_CMD_STATUS; +                } else if (!strcmp ("force", w)) { +                        command = GF_OP_CMD_COMMIT_FORCE; +                        if (question) +                                *question = 1; +                } else { +                        GF_ASSERT (!"opword mismatch"); +                        ret = -1; +                        goto out; +                } +        } +          if (wordcount < 4) {                  ret = -1;                  goto out;          } -        brick_index = 3; - +        ret = dict_set_int32 (dict, "command", command);          if (ret) -                goto out; +                gf_log ("cli", GF_LOG_INFO, "failed to set 'command' %d", +                        command); + + +        brick_index = 3;          tmp_index = brick_index;          tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char); @@ -805,7 +843,7 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,                  ret = -1;                  goto out;          } -  +          tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char);          if (!tmp_brick1) { @@ -850,7 +888,6 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount,          }          ret = dict_set_int32 (dict, "count", brick_count); -          if (ret)                  goto out;  | 
