[sheepdog] [PATCH] dog: add 'vdi object map' command

Liu Yuan namei.unix at gmail.com
Sun Jan 26 04:35:19 CET 2014


On Thu, Jan 23, 2014 at 04:43:02PM +0800, Liu Yuan wrote:
> This command will show inode internal 'vdi' array states, is useful to check if
> cloned VDI's inode is sane or not.
> 
> usage:
> yliu at ubuntu-precise:~/sheepdog$ dog/dog vdi object map clone1
> Index       VID
> 00000000   c8f989
> 00000001   c8f989
> 00000002   c8f989
> 00000003   7c2b25
> 00000004   7c2b25
> 00000005   7c2b25
> ...
> 
> yliu at ubuntu-precise:~/sheepdog$ dog/dog vdi object map -i 4 clone1
> Index       VID
> 00000004   7c2b25
> 
> With this patch, original 'dog vdi object' becomes 'dog vdi object location'
> 
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
>  dog/vdi.c            | 62 ++++++++++++++++++++++++++++++++++++++++++++++------
>  tests/functional/028 |  4 ++--
>  tests/functional/029 |  2 +-
>  tests/functional/035 |  2 +-
>  tests/functional/058 |  2 +-
>  5 files changed, 60 insertions(+), 12 deletions(-)
> 
> diff --git a/dog/vdi.c b/dog/vdi.c
> index f26a6c3..1e175b3 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -37,7 +37,7 @@ static struct sd_option vdi_options[] = {
>  };
>  
>  static struct vdi_cmd_data {
> -	unsigned int index;
> +	uint64_t index;
>  	int snapshot_id;
>  	char snapshot_tag[SD_MAX_VDI_TAG_LEN];
>  	bool exclusive;
> @@ -959,10 +959,43 @@ static int vdi_rollback(int argc, char **argv)
>  	return ret;
>  }
>  
> -static int vdi_object(int argc, char **argv)
> +
> +static int vdi_object_map(int argc, char **argv)
>  {
>  	const char *vdiname = argv[optind];
> -	unsigned idx = vdi_cmd_data.index;
> +	uint64_t idx = vdi_cmd_data.index;
> +	struct sd_inode *inode = xmalloc(sizeof(*inode));
> +	uint32_t vid;
> +	int ret;
> +
> +	ret = read_vdi_obj(vdiname, vdi_cmd_data.snapshot_id,
> +			   vdi_cmd_data.snapshot_tag, NULL, inode,
> +			   SD_INODE_SIZE);
> +	if (ret != EXIT_SUCCESS) {
> +		sd_err("FATAL: %s not found", vdiname);
> +		return ret;
> +	}
> +
> +	printf("Index       VID\n");
> +	if (idx != ~0) {
> +		vid = INODE_GET_VID(inode, idx);
> +		printf("%08"PRIu64" %8"PRIx32"\n", idx, vid);
> +	} else {
> +		uint32_t max_idx = count_data_objs(inode);
> +
> +		for (idx = 0; idx < max_idx; idx++) {
> +			vid = INODE_GET_VID(inode, idx);
> +			if (vid)
> +				printf("%08"PRIu64" %8"PRIx32"\n", idx, vid);
> +		}
> +	}
> +	return EXIT_SUCCESS;
> +}
> +
> +static int vdi_object_location(int argc, char **argv)
> +{
> +	const char *vdiname = argv[optind];
> +	uint64_t idx = vdi_cmd_data.index;
>  	struct get_vdi_info info;
>  	uint32_t vid;
>  	size_t size;
> @@ -1006,15 +1039,16 @@ static int vdi_object(int argc, char **argv)
>  		if (oid_info.success) {
>  			if (oid_info.data_oid) {
>  				printf("Looking for the object 0x%" PRIx64
> -				       " (vid 0x%" PRIx32 " idx %u, %u copies) "
> -				       "with %d nodes\n\n",
> +				       " (vid 0x%" PRIx32 " idx %"PRIu64
> +				       ", %u copies) with %d nodes\n\n",
>  				       oid_info.data_oid, vid, idx,
>  				       info.nr_copies, sd_nodes_nr);
>  
>  				parse_objs(oid_info.data_oid, do_print_obj,
>  					   NULL, size);
>  			} else
> -				printf("The inode object 0x%" PRIx32 " idx %u is not allocated\n",
> +				printf("The inode object 0x%" PRIx32 " idx"
> +				       "%"PRIu64" is not allocated\n",
>  				       vid, idx);
>  		} else
>  			sd_err("Failed to read the inode object 0x%" PRIx32,
> @@ -2432,6 +2466,20 @@ out:
>  	return ret;
>  }
>  
> +static struct subcommand vdi_object_cmd[] = {
> +	{"location", NULL, NULL, "show object location information",
> +	 NULL, CMD_NEED_NODELIST|CMD_NEED_ARG, vdi_object_location},
> +	{"map", NULL, NULL, "show object map information",
> +	 NULL, CMD_NEED_ARG, vdi_object_map},
> +	{NULL},
> +};
> +
> +static int vdi_object(int argc, char **argv)
> +{
> +	return do_generic_subcommand(vdi_object_cmd, argc, argv);
> +}
> +
> +
>  static struct subcommand vdi_cache_cmd[] = {
>  	{"flush", NULL, NULL, "flush the cache of the vdi specified.",
>  	 NULL, CMD_NEED_ARG, vdi_cache_flush},
> @@ -2475,7 +2523,7 @@ static struct subcommand vdi_cmd[] = {
>  	{"graph", NULL, "aph", "show images in Graphviz dot format",
>  	 NULL, 0, vdi_graph, vdi_options},
>  	{"object", "<vdiname>", "isaph", "show object information in the image",
> -	 NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
> +	 vdi_object_cmd, CMD_NEED_ARG,
>  	 vdi_object, vdi_options},
>  	{"track", "<vdiname>", "isapho",
>  	 "show the object epoch trace in the image",
> diff --git a/tests/functional/028 b/tests/functional/028
> index ff813c5..a0e80ae 100755
> --- a/tests/functional/028
> +++ b/tests/functional/028
> @@ -42,8 +42,8 @@ done
>  $DOG vdi read test | md5sum
>  $DOG vdi read test -p 7001 | md5sum
>  
> -$DOG vdi object test
> +$DOG vdi object location test
>  
>  for i in `seq 0 24`; do
> -    $DOG vdi object -i $i test
> +    $DOG vdi object location -i $i test
>  done
> diff --git a/tests/functional/029 b/tests/functional/029
> index 935abf4..2f3cfaa 100755
> --- a/tests/functional/029
> +++ b/tests/functional/029
> @@ -41,6 +41,6 @@ $DOG vdi delete -s 1 test2
>  _vdi_list
>  
>  for i in `seq 2 9`; do
> -	$DOG vdi object test$i -i 1;
> +	$DOG vdi object location test$i -i 1;
>  done
>  
> diff --git a/tests/functional/035 b/tests/functional/035
> index ae14da8..59261b6 100755
> --- a/tests/functional/035
> +++ b/tests/functional/035
> @@ -38,7 +38,7 @@ _wait_for_sheep_recovery 0
>  $DOG vdi read test | md5sum > $STORE/csum.1
>  
>  for i in `seq 0 9`; do
> -	$DOG vdi object -i $i test
> +	$DOG vdi object location -i $i test
>  done
>  
>  for i in 10 11 12; do
> diff --git a/tests/functional/058 b/tests/functional/058
> index 57cb524..d895648 100755
> --- a/tests/functional/058
> +++ b/tests/functional/058
> @@ -13,6 +13,6 @@ dd if=/dev/zero | $DOG vdi write -w test
>  $QEMU_IO -c "discard 0 100m" sheepdog:test | _filter_qemu_io
>  $DOG vdi check test
>  for i in `seq 0 24`; do
> -	$DOG vdi object test -i $i;
> +	$DOG vdi object location test -i $i;
>  done
>  _node_info
> -- 
> 1.8.1.2
> 

Ping?



More information about the sheepdog mailing list