diff options
-rw-r--r-- | cli/src/cli-cmd-parser.c | 12 | ||||
-rw-r--r-- | cli/src/cli-rpc-ops.c | 8 | ||||
-rw-r--r-- | rpc/xdr/src/cli1-xdr.h | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 127 |
4 files changed, 107 insertions, 47 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index adfb85e9e..2ad5d430c 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2780,7 +2780,7 @@ cli_snap_create_desc_parse (dict_t *dict, const char **words, desc[desc_len] = '\0'; /* Calculating the size of the description as given by the user */ - ret = dict_set_dynstr (dict, "snap-description", desc); + ret = dict_set_dynstr (dict, "description", desc); if (ret) { gf_log ("cli", GF_LOG_ERROR, "Unable to save snap " "description"); @@ -3008,6 +3008,7 @@ cli_snap_info_parse (dict_t *dict, const char **words, int wordcount, unsigned int cmdi) { int ret = -1; + int32_t cmd = GF_SNAP_INFO_TYPE_ALL; GF_ASSERT (words); GF_ASSERT (dict); @@ -3044,6 +3045,7 @@ cli_snap_info_parse (dict_t *dict, const char **words, int wordcount, goto out; } + cmd = GF_SNAP_INFO_TYPE_SNAP; ret = 0; goto out; /* No need to continue the parsing once we @@ -3067,7 +3069,15 @@ cli_snap_info_parse (dict_t *dict, const char **words, int wordcount, "volume name %s", words[wordcount - 1]); goto out; } + cmd = GF_SNAP_INFO_TYPE_VOL; out : + if (ret == 0) { + ret = dict_set_int32 (dict, "cmd", cmd); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "Could not save " + "type of snapshot info"); + } + } return ret; } diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 0447e5baf..60abfc1bf 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -8147,6 +8147,14 @@ gf_cli_snapshot_cbk (struct rpc_req *req, struct iovec *iov, break; case GF_SNAP_OPTION_TYPE_LIST: + if (rsp.op_ret) { + cli_err ("Snapshot list : failed: %s", + rsp.op_errstr ? rsp.op_errstr : + "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } + ret = cli_snapshot_list (dict); if (ret) { gf_log ("cli", GF_LOG_ERROR, "Failed to display " diff --git a/rpc/xdr/src/cli1-xdr.h b/rpc/xdr/src/cli1-xdr.h index 598ddbded..0cfa6de37 100644 --- a/rpc/xdr/src/cli1-xdr.h +++ b/rpc/xdr/src/cli1-xdr.h @@ -183,6 +183,13 @@ enum gf1_cli_snapshot { }; typedef enum gf1_cli_snapshot gf1_cli_snapshot; +enum gf1_cli_snapshot_info { + GF_SNAP_INFO_TYPE_ALL = 0, + GF_SNAP_INFO_TYPE_SNAP = 1, + GF_SNAP_INFO_TYPE_VOL = 2, +}; +typedef enum gf1_cli_snapshot_info gf1_cli_snapshot_info; + enum gf1_cli_snapshot_config { GF_SNAP_CONFIG_TYPE_NONE = 0, GF_SNAP_CONFIG_TYPE_SET = 0 + 1, diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 66fdf4178..e9b887745 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -595,8 +595,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr, ret = glusterd_volinfo_find (volname, &volinfo); if (ret) { snprintf (err_str, sizeof (err_str), - "failed to get the volinfo for the volume " - "%s", volname); + "Volume (%s) does not exist ", volname); goto out; } @@ -1670,7 +1669,8 @@ out: } int -glusterd_snapshot_get_info_by_volume (dict_t *dict, char *volname) +glusterd_snapshot_get_info_by_volume (dict_t *dict, char *volname, + char *err_str, size_t len) { int ret = -1; int snapcount = 0; @@ -1692,8 +1692,8 @@ glusterd_snapshot_get_info_by_volume (dict_t *dict, char *volname) ret = glusterd_volinfo_find (volname, &volinfo); if (ret) { - gf_log (this->name, GF_LOG_ERROR, "failed to get the volinfo " - "for the volume %s", volname); + snprintf (err_str, len, "Volume (%s) does not exist", volname); + gf_log (this->name, GF_LOG_ERROR, "%s", err_str); goto out; } @@ -1778,11 +1778,12 @@ glusterd_handle_snapshot_info (rpcsvc_request_t *req, glusterd_op_t op, dict_t *dict, char *err_str, size_t len) { int ret = -1; - int8_t snap_driven = 0; + int8_t snap_driven = 1; char *volname = NULL; char *snapname = NULL; glusterd_snap_t *snap = NULL; xlator_t *this = NULL; + int32_t cmd = GF_SNAP_INFO_TYPE_ALL; this = THIS; GF_ASSERT (this); @@ -1790,55 +1791,86 @@ glusterd_handle_snapshot_info (rpcsvc_request_t *req, glusterd_op_t op, GF_VALIDATE_OR_GOTO (this->name, req, out); GF_VALIDATE_OR_GOTO (this->name, dict, out); - /* Get the request key-pair from the dictionary */ - - /* All these options are optonal. Therefore ignore - * error returned by following dictionary operations - */ - ret = dict_get_str (dict, "snapname", &snapname); - ret = dict_get_str (dict, "volname", &volname); - if (snapname && volname) { - gf_log (this->name, GF_LOG_ERROR, "Option volname and snapname " - "are mutually exclusive"); - ret = -1; + ret = dict_get_int32 (dict, "cmd", &cmd); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to get type " + "of snapshot info"); goto out; } - if (!volname) - snap_driven = 1; + switch (cmd) { + case GF_SNAP_INFO_TYPE_ALL : + { + ret = glusterd_snapshot_get_all_snap_info (dict); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to get info of all snaps"); + goto out; + } + break; + } - ret = dict_set_int8 (dict, "snap-driven", snap_driven); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to set snap-driven"); - goto out; - } + case GF_SNAP_INFO_TYPE_SNAP : + { + ret = dict_get_str (dict, "snapname", &snapname); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to get snap name"); + goto out; + } - if (snapname) { - ret = dict_set_int32 (dict, "snap-count", 1); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set snapcount"); - goto out; + ret = dict_set_int32 (dict, "snap-count", 1); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to set snapcount"); + goto out; + } + + snap = glusterd_find_snap_by_name (snapname); + if (!snap) { + snprintf (err_str, len, + "Snap (%s) does not exist", snapname); + gf_log (this->name, GF_LOG_ERROR, + "%s", err_str); + ret = -1; + goto out; + } + ret = glusterd_snapshot_get_snap_detail (dict, snap, + "snap1", NULL); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to get snap detail of snap " + "%s", snap->snapname); + goto out; + } + break; } - snap = glusterd_find_snap_by_name (snapname); - if (!snap) { - gf_log (this->name, GF_LOG_ERROR, "Snap %s doen't " - "exist", snapname); - ret = -1; - goto out; + case GF_SNAP_INFO_TYPE_VOL : + { + ret = dict_get_str (dict, "volname", &volname); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to get volname"); + goto out; + } + ret = glusterd_snapshot_get_info_by_volume (dict, + volname, err_str, len); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to get volume info of volume " + "%s", volname); + goto out; + } + snap_driven = 0; + break; } - ret = glusterd_snapshot_get_snap_detail (dict, snap, "snap1", - NULL); - } else if (volname) { - ret = glusterd_snapshot_get_info_by_volume (dict, volname); - } else { - ret = glusterd_snapshot_get_all_snap_info (dict); } + ret = dict_set_int8 (dict, "snap-driven", snap_driven); if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to get snap info"); + gf_log (this->name, GF_LOG_ERROR, "Failed to set snap-driven"); goto out; } @@ -1982,8 +2014,10 @@ glusterd_handle_snapshot_list (rpcsvc_request_t *req, glusterd_op_t op, } else { ret = glusterd_volinfo_find (volname, &volinfo); if (ret) { + snprintf (err_str, len, + "Volume (%s) does not exist", volname); gf_log (this->name, GF_LOG_ERROR, - "Volume %s doesn't exists", volname); + "%s", err_str); goto out; } @@ -3053,8 +3087,9 @@ glusterd_handle_snapshot_remove (rpcsvc_request_t *req, glusterd_op_t op, snap = glusterd_find_snap_by_name (snapname); if (!snap){ - gf_log (this->name, GF_LOG_ERROR, "Snap %s does not exist", - snapname); + snprintf (err_str, len, "Snap (%s) does not exist", snapname); + gf_log (this->name, GF_LOG_ERROR, + "%s", err_str); ret = -1; goto out; } |