diff options
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-snapshot.c | 127 |
1 files changed, 81 insertions, 46 deletions
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; } |