[sheepdog] [PATCH v3 1/2] collie: confirm when rolling back to the snapshot

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Thu Apr 11 06:54:06 CEST 2013


'collie vdi rollback' discards any changes made since the previous
snapshot was taken, so it is safe to confirm it to users before doing
the operation.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 collie/cluster.c | 16 ++--------------
 collie/collie.h  |  1 +
 collie/common.c  | 11 +++++++++++
 collie/vdi.c     |  3 +++
 tests/039        | 14 +++++++-------
 tests/039.out    | 15 ++++++++++-----
 6 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/collie/cluster.c b/collie/cluster.c
index d7de019..083801c 100644
--- a/collie/cluster.c
+++ b/collie/cluster.c
@@ -109,20 +109,8 @@ static int cluster_format(int argc, char **argv)
 		if (test_bit(nr, vdi_inuse))
 			break;
 
-	if (nr != SD_NR_VDIS) {
-		int i, l;
-		char str[123] = {'\0'};
-
-		printf(FORMAT_PRINT);
-		ret = scanf("%s", str);
-		if (ret < 0)
-			return EXIT_SYSFAIL;
-		l = strlen(str);
-		for (i = 0; i < l; i++)
-			str[i] = tolower(str[i]);
-		if (strncmp(str, "yes", 3) != 0)
-			return EXIT_SUCCESS;
-	}
+	if (nr != SD_NR_VDIS)
+		confirm(FORMAT_PRINT);
 
 	gettimeofday(&tv, NULL);
 
diff --git a/collie/collie.h b/collie/collie.h
index 3546290..311ad97 100644
--- a/collie/collie.h
+++ b/collie/collie.h
@@ -73,6 +73,7 @@ int send_light_req_get_response(struct sd_req *hdr, const char *host, int port);
 int collie_exec_req(int sockfd, struct sd_req *hdr, void *data);
 int do_generic_subcommand(struct subcommand *sub, int argc, char **argv);
 int update_node_list(int max_nodes, uint32_t epoch);
+void confirm(const char *message);
 
 extern struct command vdi_command;
 extern struct command node_command;
diff --git a/collie/common.c b/collie/common.c
index 34ce624..3253de2 100644
--- a/collie/common.c
+++ b/collie/common.c
@@ -274,3 +274,14 @@ int do_generic_subcommand(struct subcommand *sub, int argc, char **argv)
 	subcommand_usage(argv[1], argv[2], EXIT_FAILURE);
 	return EXIT_FAILURE;
 }
+
+void confirm(const char *message)
+{
+	char input[8] = "";
+	char *ret;
+
+	printf("%s", message);
+	ret = fgets(input, sizeof(input), stdin);
+	if (ret == NULL || strncasecmp(input, "yes", 3) != 0)
+		exit(EXIT_SUCCESS);
+}
diff --git a/collie/vdi.c b/collie/vdi.c
index 67c96d1..0a0814f 100644
--- a/collie/vdi.c
+++ b/collie/vdi.c
@@ -801,6 +801,9 @@ static int vdi_rollback(int argc, char **argv)
 	if (ret != EXIT_SUCCESS)
 		return ret;
 
+	confirm("This operation dicards any changes made since the previous\n"
+		"snapshot was taken.  Continue? [yes/no]: ");
+
 	ret = do_vdi_delete(vdiname, 0, NULL);
 	if (ret != SD_RES_SUCCESS) {
 		fprintf(stderr, "Failed to delete the current state\n");
diff --git a/tests/039 b/tests/039
index 2d737f6..55bd65d 100755
--- a/tests/039
+++ b/tests/039
@@ -28,7 +28,7 @@ qemu-io -c "write 0 512 -P 1" sheepdog:test | _filter_qemu_io
 $COLLIE vdi snapshot test -s snap1
 qemu-io -c "write 0 512 -P 2" sheepdog:test | _filter_qemu_io
 
-$COLLIE vdi rollback test -s snap1
+echo yes | $COLLIE vdi rollback test -s snap1
 qemu-io -c "read 0 512 -P 1" sheepdog:test | _filter_qemu_io
 $COLLIE vdi tree | _filter_short_date
 $COLLIE vdi list | _filter_short_date
@@ -37,17 +37,17 @@ qemu-io -c "write 0 512 -P 2" sheepdog:test | _filter_qemu_io
 $COLLIE vdi snapshot test -s snap2
 qemu-io -c "write 0 512 -P 3" sheepdog:test | _filter_qemu_io
 
-$COLLIE vdi rollback test -s snap1
+echo yes | $COLLIE vdi rollback test -s snap1
 qemu-io -c "read 0 512 -P 1" sheepdog:test | _filter_qemu_io
 $COLLIE vdi tree | _filter_short_date
 $COLLIE vdi list | _filter_short_date
 
-$COLLIE vdi rollback test -s snap2
+echo yes | $COLLIE vdi rollback test -s snap2
 qemu-io -c "read 0 512 -P 2" sheepdog:test | _filter_qemu_io
 $COLLIE vdi tree | _filter_short_date
 $COLLIE vdi list | _filter_short_date
 
-$COLLIE vdi rollback test -s snap1
+echo yes | $COLLIE vdi rollback test -s snap1
 qemu-io -c "read 0 512 -P 1" sheepdog:test | _filter_qemu_io
 $COLLIE vdi tree | _filter_short_date
 $COLLIE vdi list | _filter_short_date
@@ -58,10 +58,10 @@ qemu-io -c "write 0 512 -P 4" sheepdog:test | _filter_qemu_io
 $COLLIE vdi snapshot test -s snap4
 
 # these fail since the snap ids don't belong to snapshots
-$COLLIE vdi rollback test -s 0
-$COLLIE vdi rollback test -s 5
+echo yes | $COLLIE vdi rollback test -s 0
+echo yes | $COLLIE vdi rollback test -s 5
 
-$COLLIE vdi rollback test -s snap3
+echo yes | $COLLIE vdi rollback test -s snap3
 qemu-io -c "read 0 512 -P 3" sheepdog:test | _filter_qemu_io
 $COLLIE vdi tree | _filter_short_date
 $COLLIE vdi list | _filter_short_date
diff --git a/tests/039.out b/tests/039.out
index e35881a..5207bb2 100644
--- a/tests/039.out
+++ b/tests/039.out
@@ -4,7 +4,8 @@ wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-read 512/512 bytes at offset 0
+This operation dicards any changes made since the previous
+snapshot was taken.  Continue? [yes/no]: read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 test---[DATE]---(you are here)
   Name        Id    Size    Used  Shared    Creation time   VDI id  Copies  Tag
@@ -14,7 +15,8 @@ wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 wrote 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-read 512/512 bytes at offset 0
+This operation dicards any changes made since the previous
+snapshot was taken.  Continue? [yes/no]: read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 test---[DATE]-+-[DATE]
                           `-(you are here)
@@ -22,14 +24,16 @@ test---[DATE]-+-[DATE]
 s test         1  4.0 GB  4.0 MB  0.0 MB DATE   7c2b25     3         snap1
 s test         2  4.0 GB  4.0 MB  0.0 MB DATE   7c2b26     3         snap2
   test         0  4.0 GB  0.0 MB  4.0 MB DATE   7c2b27     3              
-read 512/512 bytes at offset 0
+This operation dicards any changes made since the previous
+snapshot was taken.  Continue? [yes/no]: read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 test---[DATE]---[DATE]---(you are here)
   Name        Id    Size    Used  Shared    Creation time   VDI id  Copies  Tag
 s test         1  4.0 GB  4.0 MB  0.0 MB DATE   7c2b25     3         snap1
 s test         2  4.0 GB  4.0 MB  0.0 MB DATE   7c2b26     3         snap2
   test         0  4.0 GB  0.0 MB  4.0 MB DATE   7c2b27     3              
-read 512/512 bytes at offset 0
+This operation dicards any changes made since the previous
+snapshot was taken.  Continue? [yes/no]: read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 test---[DATE]-+-[DATE]
                           `-(you are here)
@@ -44,7 +48,8 @@ wrote 512/512 bytes at offset 0
 The snapshot id must be larger than zero
 Cannot get VDI info for test 5 : Invalid parameters
 Failed to open VDI test
-read 512/512 bytes at offset 0
+This operation dicards any changes made since the previous
+snapshot was taken.  Continue? [yes/no]: read 512/512 bytes at offset 0
 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 test---[DATE]-+-[DATE]
                           `-[DATE]-+-[DATE]
-- 
1.8.1.3.566.gaa39828




More information about the sheepdog mailing list