From e5838eeea0ccc4ff6af6457be6d7ac8736ee748e Mon Sep 17 00:00:00 2001 From: Sachin Pandit Date: Fri, 22 Nov 2013 12:18:48 +0530 Subject: mgmt/glusterd : snapshot list, minor fixes. This patch fixes the below mentioned issue. Snapshot list : Listing number of snaps available. Display proper message if snapshot not present. Change-Id: Iabfc47430a9c89fb5114e33e9feb7ef21973fc6a Signed-off-by: Sachin Pandit --- xlators/mgmt/glusterd/src/glusterd-snapshot.c | 99 ++++++++++++++++++++------- 1 file changed, 75 insertions(+), 24 deletions(-) (limited to 'xlators') diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 82335e892..afe2251d4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -657,7 +657,7 @@ glusterd_new_snap_object() glusterd_snap_cg_t* glusterd_new_snap_cg_object(int64_t volume_count) { - glusterd_snap_cg_t *cg = NULL; + glusterd_snap_cg_t *cg = NULL; glusterd_volinfo_t *volinfo = NULL; if (volume_count < 0) { @@ -1279,13 +1279,16 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, glusterd_volinfo_t *volinfo, char *snapname, int8_t detail) { - int ret = -1; - ssize_t index = -1; - glusterd_snap_t *entry = NULL; - glusterd_snap_t *tmp = NULL; - xlator_t *this = NULL; - char *value = NULL; + int ret = -1; + uint64_t index = 0; + glusterd_snap_t *entry = NULL; + glusterd_snap_t *tmp = NULL; + xlator_t *this = NULL; + char *value = NULL; char key[256]; + glusterd_conf_t *conf = NULL; + uint64_t snap_limit = 0; + char err_str[PATH_MAX]; this = THIS; @@ -1295,6 +1298,9 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, GF_ASSERT (keyprefix); GF_ASSERT (volinfo); + conf = this->private; + GF_ASSERT (conf); + value = gf_strdup (volinfo->volname); if (NULL == value) { goto out; @@ -1319,7 +1325,36 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, ret = dict_set_int64 (dict, key, volinfo->snap_count); if (ret) { - gf_log (this->name, GF_LOG_ERROR, "Failed to set total snap count"); + gf_log (this->name, GF_LOG_ERROR, "Failed to set total" + " snap count"); + goto out; + } + ret = snprintf (key, sizeof (key), "%s.snap-available", keyprefix); + if (ret < 0) { + goto out; + } + + if (conf->snap_max_limit < volinfo->snap_max_limit) { + snap_limit = conf->snap_max_limit; + gf_log(this->name, GF_LOG_DEBUG, "system snap_limit is " + "lesser than volume snap_limit, snap_limit value " + "is set to %ld",snap_limit); + } + else { + snap_limit = volinfo->snap_max_limit ; + gf_log(this->name, GF_LOG_DEBUG, "volume snap_limit is " + "lesser than system snap_limit, snap_limit value " + "is set to %ld",snap_limit); + } + + if (snap_limit > volinfo->snap_count) + ret = dict_set_int64 (dict, key, + snap_limit - volinfo->snap_count); + else + ret = dict_set_int64 (dict, key, 0); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, + "Failed to set available snaps"); goto out; } /* Ownership of value transferred to dict. Therefore we must initalize @@ -1329,12 +1364,12 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, /* snapshot taken first should be displayed first */ list_for_each_entry_safe (entry, tmp, &volinfo->snaps, snap_list) { - ++index; - ret = snprintf (key, sizeof (key), "%s.snap-%ld", keyprefix, index); + ret = snprintf (key, sizeof (key), "%s.snap-%ld", keyprefix, + index); if (ret < 0) { /* Only negative value is error */ goto out; } - + ++index; /* If snapname is NULL then get all the snaps * for the given volume */ if (NULL == snapname) { @@ -1376,14 +1411,13 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, * added to the dictionary. If snapshot name is passed * as argument then we would send only one snap object. * Therefore index should be reset to 0. */ - index = 0; + index = 1; break; /* Found the snap */ } /* If all the snap is written into the dictionary then write the * snap count into the dictionary */ if (0 == ret) { - ++index; /* To get count increment index by 1*/ ret = snprintf (key, sizeof (key), "%s.snap-count", keyprefix); if (ret < 0) { /* Only negative value is error */ goto out; @@ -1399,6 +1433,22 @@ glusterd_snapshot_vol_get_snaplist_lk (dict_t *dict, char *keyprefix, } else if (NULL != snapname) { gf_log (this->name, GF_LOG_ERROR, "Snap (%s) not found", snapname); + ret = snprintf (key, sizeof (key), "%s.err_str", + keyprefix); + if (ret < 0) { + goto out; + } + ret = snprintf (err_str, sizeof (err_str), "Snapshot %s" + " not found", snapname); + if (ret < 0) { + goto out; + } + ret = dict_set_str (dict, key, err_str); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Failed to" + "set error string"); + goto out; + } } out: @@ -1600,7 +1650,6 @@ glusterd_snapshot_cg_get_snaplist_lk (dict_t *dict, glusterd_snap_cg_t *cg, if (ret < 0) { /* Only negative value is error */ goto out; } - ret = glusterd_snapshot_vol_get_snaplist (dict, key, &(cg->volumes[i]), NULL, detail); if (ret) { @@ -1699,7 +1748,8 @@ out: */ static int glusterd_snapshot_cg_get_snaplist (dict_t *dict, char *keyprefix, - char *cgname, int8_t detail) + char *cgname, int8_t detail, + char *err_str, size_t len) { int ret = -1; /* Failure */ glusterd_conf_t *conf = NULL; @@ -1721,8 +1771,9 @@ glusterd_snapshot_cg_get_snaplist (dict_t *dict, char *keyprefix, cg = glusterd_find_snap_cg_by_name (conf, cgname); if (NULL == cg) { - gf_log (this->name, GF_LOG_ERROR, "Failed to get " - "%s CG", cgname); + snprintf (err_str, len, "CG %s not found", cgname); + gf_log (this->name, GF_LOG_WARNING, "%s", err_str); + ret = -1; goto out; } @@ -1868,7 +1919,7 @@ out: */ int glusterd_handle_snapshot_list (rpcsvc_request_t *req, glusterd_op_t op, - dict_t *dict) + dict_t *dict, char *err_str, size_t len) { int ret = -1; int64_t volcount = 0; @@ -1877,7 +1928,6 @@ glusterd_handle_snapshot_list (rpcsvc_request_t *req, glusterd_op_t op, char *keyprefix = "snaplist"; char *cgname = NULL; char *snapname = NULL; - char *err_str = "Operation failed"; dict_t *voldict = NULL; xlator_t *this = NULL; char key[256] = {0,}; @@ -1928,8 +1978,8 @@ glusterd_handle_snapshot_list (rpcsvc_request_t *req, glusterd_op_t op, goto out; } - ret = glusterd_snapshot_cg_get_snaplist (dict, key, - cgname, detail); + ret = glusterd_snapshot_cg_get_snaplist (dict, key, cgname, + detail, err_str, len); if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to get " "snapshot list for %s CG", cgname); @@ -2945,11 +2995,12 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr, glusterd_volinfo_t *volinfo = NULL; glusterd_snap_cg_t *cg = NULL; glusterd_conf_t *priv = NULL; - uuid_t cg_id; + uuid_t cg_id; glusterd_snap_t *snap = NULL; char err_str[PATH_MAX] = {0, }; this = THIS; + priv = this->private; ret = dict_get_int64 (dict, "volcount", &volume_count); if (ret) { @@ -3041,7 +3092,6 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr, "consistency group %s", name); goto out; } - uuid_copy (cg->cg_id, cg_id); strncpy (cg->cg_name, name, sizeof (cg->cg_name)); ret = glusterd_add_snap_cg (priv, cg); @@ -3362,7 +3412,8 @@ glusterd_handle_snapshot_fn (rpcsvc_request_t *req) break; case GF_SNAP_OPTION_TYPE_LIST: - ret = glusterd_handle_snapshot_list (req, cli_op, dict); + ret = glusterd_handle_snapshot_list (req, cli_op, dict, + err_str, sizeof (err_str)); if (ret) { gf_log (this->name, GF_LOG_WARNING, "Snapshot list " "failed"); -- cgit