From 1df4a89de17e44c8c1f9b4794a7b8c2741f2bc2e Mon Sep 17 00:00:00 2001 From: Avra Sengupta Date: Wed, 27 Jul 2016 16:28:44 +0530 Subject: snapshot: Display number of snapshots in volume info Display number of snapshots in a volume in volume info output. This number gets modified, with create, delete, and restore operations. Change-Id: Ic9b7c2b6950980f8ce75ca362998c097ea7c863d BUG: 1360693 Signed-off-by: Avra Sengupta Reviewed-on: http://review.gluster.org/15029 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Rajesh Joseph --- cli/src/cli-rpc-ops.c | 7 +++++++ cli/src/cli-xml-output.c | 12 ++++++++++++ tests/basic/volume-snapshot.t | 20 ++++++++++++++++++++ xlators/mgmt/glusterd/src/glusterd-handler.c | 5 +++++ 4 files changed, 44 insertions(+) diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 3ea918a8cba..0bf03bceaa2 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -780,6 +780,7 @@ gf_cli_get_volume_cbk (struct rpc_req *req, struct iovec *iov, int32_t disperse_count = 0; int32_t redundancy_count = 0; int32_t arbiter_count = 0; + int32_t snap_count = 0; int32_t vol_type = 0; int32_t transport = 0; char *volume_id_str = NULL; @@ -967,6 +968,11 @@ xml_output: if (ret) goto out; + snprintf (key, 256, "volume%d.snap_count", i); + ret = dict_get_int32 (dict, key, &snap_count); + if (ret) + goto out; + vol_type = type; // Distributed (stripe/replicate/stripe-replica) setups @@ -978,6 +984,7 @@ xml_output: cli_out ("Type: %s", cli_vol_type_str[vol_type]); cli_out ("Volume ID: %s", volume_id_str); cli_out ("Status: %s", cli_vol_status_str[status]); + cli_out ("Snapshot Count: %d", snap_count); #ifdef HAVE_BD_XLATOR k = 0; diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 8ef12b9a3c9..35b739c0f62 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2551,6 +2551,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) int stripe_count = 0; int replica_count = 0; int arbiter_count = 0; + int snap_count = 0; int isArbiter = 0; int disperse_count = 0; int redundancy_count = 0; @@ -2630,6 +2631,17 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) cli_vol_status_str[status]); XML_RET_CHECK_AND_GOTO (ret, out); + memset (key, 0, sizeof (key)); + snprintf (key, sizeof (key), "volume%d.snap_count", i); + ret = dict_get_int32 (dict, key, &snap_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement (local->writer, + (xmlChar *)"snapshotCount", + "%d", snap_count); + XML_RET_CHECK_AND_GOTO (ret, out); + + memset (key, 0, sizeof (key)); snprintf (key, sizeof (key), "volume%d.brick_count", i); ret = dict_get_int32 (dict, key, &brick_count); diff --git a/tests/basic/volume-snapshot.t b/tests/basic/volume-snapshot.t index 794ab4944b0..dd938b4064a 100755 --- a/tests/basic/volume-snapshot.t +++ b/tests/basic/volume-snapshot.t @@ -104,6 +104,11 @@ create_snapshots EXPECT 'Started' snapshot_status ${V0}_snap; EXPECT 'Started' snapshot_status ${V1}_snap; +EXPECT '1' volinfo_field $V0 'Snapshot Count'; +EXPECT '1' volinfo_field $V1 'Snapshot Count'; +EXPECT "1" get-cmd-field-xml "volume info $V0" "snapshotCount" +EXPECT "1" get-cmd-field-xml "volume info $V1" "snapshotCount" + deactivate_snapshots EXPECT 'Stopped' snapshot_status ${V0}_snap; @@ -132,10 +137,20 @@ create_snapshots_with_timestamp; new_name1=`$CLI_1 snapshot list ${V0} | grep ${V0}_snap1`; new_name2=`$CLI_1 snapshot list ${V1} | grep ${V1}_snap1`; +EXPECT '2' volinfo_field $V0 'Snapshot Count'; +EXPECT '2' volinfo_field $V1 'Snapshot Count'; +EXPECT "2" get-cmd-field-xml "volume info $V0" "snapshotCount" +EXPECT "2" get-cmd-field-xml "volume info $V1" "snapshotCount" + EXPECT_NOT "{V0}_snap1" echo $new_name1; EXPECT_NOT "{V1}_snap1" echo $new_name1; delete_snapshots $new_name1 $new_name2; +EXPECT '1' volinfo_field $V0 'Snapshot Count'; +EXPECT '1' volinfo_field $V1 'Snapshot Count'; +EXPECT "1" get-cmd-field-xml "volume info $V0" "snapshotCount" +EXPECT "1" get-cmd-field-xml "volume info $V1" "snapshotCount" + #Clean up stop_force_volumes 2 EXPECT 'Stopped' volinfo_field $V0 'Status'; @@ -145,6 +160,11 @@ restore_snapshots TEST ! snapshot_exists 1 ${V0}_snap TEST ! snapshot_exists 1 ${V1}_snap +EXPECT '0' volinfo_field $V0 'Snapshot Count'; +EXPECT '0' volinfo_field $V1 'Snapshot Count'; +EXPECT "0" get-cmd-field-xml "volume info $V0" "snapshotCount" +EXPECT "0" get-cmd-field-xml "volume info $V1" "snapshotCount" + delete_volumes 2 EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V0 EXPECT_WITHIN $CONFIG_UPDATE_TIMEOUT "N" volume_exists $V1 diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 0085dce5d4c..2c03c28168d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -558,6 +558,11 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo, if (ret) goto out; + snprintf (key, 256, "volume%d.snap_count", count); + ret = dict_set_int32 (volumes, key, volinfo->snap_count); + if (ret) + goto out; + #ifdef HAVE_BD_XLATOR if (volinfo->caps) { caps = 0; -- cgit