diff options
| author | Krishnan Parthasarathi <kp@gluster.com> | 2011-12-24 13:49:52 +0530 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2012-02-17 04:50:55 -0800 | 
| commit | acb691f8908049e651fc12ff1cf01e9cf4ddde65 (patch) | |
| tree | 71c9f8a0ee84ddafdcc15607bae473a73d966c32 /cli | |
| parent | b016fe67b6c8957eebc9736b9af9406326800b6d (diff) | |
cli, glusterd : Added support for clear-locks command.
Change-Id: I8e7cd51d6e3dd968cced1ec4115b6811f2ab5c1b
BUG: 789858
Signed-off-by: Krishnan Parthasarathi <kp@gluster.com>
Reviewed-on: http://review.gluster.com/2552
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 64 | ||||
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 60 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 113 | ||||
| -rw-r--r-- | cli/src/cli.h | 3 | 
4 files changed, 240 insertions, 0 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 090a7246913..b4c86bf1abd 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2032,3 +2032,67 @@ out:                  gf_log ("cli", GF_LOG_ERROR, "Error parsing dumpoptions");          return ret;  } + +int +cli_cmd_volume_clrlks_opts_parse (const char **words, int wordcount, +                                  dict_t **options) +{ +        int     ret = -1; +        int     i = 0; +        dict_t  *dict = NULL; +        char    *kind_opts[4] = {"blocked", "granted", "all", NULL}; +        char    *types[4] = {"inode", "entry", "posix", NULL}; +        char    *free_ptr = NULL; + +        dict = dict_new (); +        if (!dict) +                goto out; + +        if (strcmp (words[4], "kind")) +                goto out; + +        for (i = 0; kind_opts[i]; i++) { +               if (!strcmp (words[5], kind_opts[i])) { +                       free_ptr = gf_strdup (words[5]); +                       ret = dict_set_dynstr (dict, "kind", free_ptr); +                       if (ret) +                               goto out; +                       free_ptr = NULL; +                       break; +               } +        } +        if (i == 3) +                goto out; + +        ret = -1; +        for (i = 0; types[i]; i++) { +               if (!strcmp (words[6], types[i])) { +                       free_ptr = gf_strdup (words[6]); +                       ret = dict_set_dynstr (dict, "type", free_ptr); +                       if (ret) +                               goto out; +                       free_ptr = NULL; +                       break; +               } +        } +        if (i == 3) +                goto out; + +        if (wordcount == 8) { +                free_ptr = gf_strdup (words[7]); +                ret = dict_set_dynstr (dict, "opts", free_ptr); +                if (ret) +                        goto out; +                free_ptr = NULL; +        } + +        ret = 0; +        *options = dict; +out: +       if (ret) { +               GF_FREE (free_ptr); +               dict_unref (dict); +       } + +       return ret; +} diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 9c7a43b9f85..41007cb7b2d 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -1681,6 +1681,60 @@ out:          return ret;  } +int +cli_cmd_volume_clearlocks_cbk (struct cli_state *state, +                               struct cli_cmd_word *word, +                               const char **words, int wordcount) +{ +        int                             ret = -1; +        rpc_clnt_procedure_t            *proc = NULL; +        call_frame_t                    *frame = NULL; +        dict_t                          *options = NULL; +        int                             sent = 0; +        int                             parse_error = 0; + +        frame = create_frame (THIS, THIS->ctx->pool); +        if (!frame) +                goto out; + +        if (wordcount < 7 || wordcount > 8) { +                cli_usage_out (word->pattern); +                parse_error = 1; +                goto out; +        } + +       ret = cli_cmd_volume_clrlks_opts_parse (words, wordcount, &options); +       if (ret) { +               parse_error = 1; +               gf_log ("cli", GF_LOG_ERROR, "Error parsing " +                       "clear-locks options"); +               cli_out ("Error parsing options"); +               cli_usage_out (word->pattern); +       } + +        ret = dict_set_str (options, "volname", (char *)words[2]); +        if (ret) +                goto out; + +        ret = dict_set_str (options, "path", (char *)words[3]); +        if (ret) +                goto out; + +        proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CLRLOCKS_VOLUME]; +        if (proc->fn) { +                ret = proc->fn (frame, THIS, options); +        } + +out: +        if (ret) { +                cli_cmd_sent_status_get (&sent); +                if ((sent == 0) && (parse_error = 0)) +                        cli_out ("Volume clear-locks failed"); +        } + +        return ret; +} +  struct cli_cmd volume_cmds[] = {          { "volume info [all|<VOLNAME>]",            cli_cmd_volume_info_cbk, @@ -1785,6 +1839,12 @@ struct cli_cmd volume_cmds[] = {           cli_cmd_volume_list_cbk,           "list all volumes in cluster"}, +        {"volume clear-locks <VOLNAME> <path> kind {blocked|granted|all}" +          "{inode [range]|entry [basename]|posix [range]}", +          cli_cmd_volume_clearlocks_cbk, +          "Clear locks held on path" +        }, +          { NULL, NULL, NULL }  }; diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 8d22f1b1d58..07a2f9fc7be 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -5640,6 +5640,118 @@ out:          return ret;  } +int32_t +gf_cli3_1_clearlocks_volume_cbk (struct rpc_req *req, struct iovec *iov, +                                  int count, void *myframe) +{ +        gf_cli_rsp                      rsp = {0,}; +        int                             ret = -1; +        char                            *lk_summary = NULL; +        char                            *volname = NULL; +        dict_t                          *dict = NULL; + +        if (-1 == req->rpc_status) +                goto out; +        ret = xdr_to_generic (*iov, &rsp, +                              (xdrproc_t)xdr_gf_cli_rsp); +        if (ret < 0) { + +                gf_log ("cli", GF_LOG_ERROR, "XDR decoding failed"); +                goto out; +        } +        gf_log ("cli", GF_LOG_DEBUG, "Received response to clear-locks"); + +        if (rsp.op_ret) { +                cli_out ("Volume clear-locks unsuccessful"); +                cli_out ("%s", rsp.op_errstr); + +        } else { +                if (!rsp.dict.dict_len) { +                        cli_out ("Possibly no locks cleared"); +                        ret = 0; +                        goto out; +                } + +                dict = dict_new (); + +                if (!dict) { +                        ret = -1; +                        goto out; +                } + +                ret = dict_unserialize (rsp.dict.dict_val, +                                        rsp.dict.dict_len, +                                        &dict); + +                if (ret) { +                        gf_log ("cli", GF_LOG_ERROR, +                                "Unable to serialize response dictionary"); +                        goto out; +                } + +                ret = dict_get_str (dict, "volname", &volname); +                if (ret) { +                        gf_log ("cli", GF_LOG_ERROR, "Unable to get volname " +                                "from dictionary"); +                        goto out; +                } + +                ret = dict_get_str (dict, "lk-summary", &lk_summary); +                if (ret) { +                        gf_log ("cli", GF_LOG_ERROR, "Unable to get lock " +                                "summary from dictionary"); +                        goto out; +                } +                cli_out ("Volume clear-locks successful"); +                cli_out ("%s", lk_summary); + +        } + +        ret = rsp.op_ret; + +out: +        cli_cmd_broadcast_response (ret); +        return ret; +} + +int32_t +gf_cli3_1_clearlocks_volume (call_frame_t *frame, xlator_t *this, +                             void *data) +{ +        gf_cli_req                      req = {{0,}}; +        dict_t                          *options = NULL; +        int                             ret = -1; + +        if (!frame || !this || !data) +                goto out; + +        options = data; + +        ret = dict_allocate_and_serialize (options, +                                           &req.dict.dict_val, +                                           (size_t *)&req.dict.dict_len); +        if (ret < 0) { +                gf_log ("cli", GF_LOG_ERROR, +                        "failed to serialize the data"); + +                goto out; +        } + +        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, +                              GLUSTER_CLI_CLRLOCKS_VOLUME, NULL, +                              this, gf_cli3_1_clearlocks_volume_cbk, +                              (xdrproc_t)xdr_gf_cli_req); + +out: +        if (options) +                dict_destroy (options); +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + +        if (req.dict.dict_val) +                GF_FREE (req.dict.dict_val); +        return ret; +} +  struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_NULL]             = {"NULL", NULL },          [GLUSTER_CLI_PROBE]            = {"PROBE_QUERY", gf_cli3_1_probe}, @@ -5675,6 +5787,7 @@ struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = {          [GLUSTER_CLI_HEAL_VOLUME]      = {"HEAL_VOLUME", gf_cli3_1_heal_volume},          [GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME", gf_cli3_1_statedump_volume},          [GLUSTER_CLI_LIST_VOLUME]      = {"LIST_VOLUME", gf_cli3_1_list_volume}, +        [GLUSTER_CLI_CLRLOCKS_VOLUME]  = {"CLEARLOCKS_VOLUME", gf_cli3_1_clearlocks_volume},  };  struct rpc_clnt_program cli_prog = { diff --git a/cli/src/cli.h b/cli/src/cli.h index 0814065a0fd..25b17da4968 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -219,6 +219,9 @@ cli_cmd_log_filename_parse (const char **words, int wordcount, dict_t **options)  int32_t  cli_cmd_volume_statedump_options_parse (const char **words, int wordcount,                                          dict_t **options); +int32_t +cli_cmd_volume_clrlks_opts_parse (const char **words, int wordcount, +                                  dict_t **options);  cli_local_t * cli_local_get ();  | 
