[sheepdog] [PATCH] dog: add an option "-o" to vdi track for tracking object with oid

Liu Yuan namei.unix at gmail.com
Fri Dec 13 06:16:24 CET 2013


On Thu, Dec 12, 2013 at 11:22:22AM +0900, Hitoshi Mitake wrote:
> This patch adds a new option "-o" to vdi track. With this option,
> users can track objects with their object ids. This would be more
> friendly for users than existing "-i" option of vdi track. Because
> output of "vdi check" is based on object ids. Users can recover
> lost/corrupted objects manually based on this tracking information
> when there are no majority objects.
> 
> Example of output:
> $ dog vdi track test -o 0076680700000000
> Tracking the object 0x76680700000000 (the inode vid 0x766807) with 5 nodes
> 
> obj 76680700000000 locations at epoch 1, copies = 3
> ---------------------------------------------------
> 127.0.0.1:7001
> 127.0.0.1:7000
> 127.0.0.1:7002
> 
> obj 76680700000000 locations at epoch 2, copies = 3
> ---------------------------------------------------
> 127.0.0.1:7001
> 127.0.0.1:7000
> 127.0.0.1:7003
> 
> obj 76680700000000 locations at epoch 3, copies = 3
> ---------------------------------------------------
> 127.0.0.1:7001
> 127.0.0.1:7004
> 127.0.0.1:7000
> 
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
>  CHANGELOG.md |    1 +
>  dog/vdi.c    |   80 +++++++++++++++++++++++++++++++++++++---------------------
>  2 files changed, 52 insertions(+), 29 deletions(-)
> 
> diff --git a/CHANGELOG.md b/CHANGELOG.md
> index e1c9243..568c795 100644
> --- a/CHANGELOG.md
> +++ b/CHANGELOG.md
> @@ -10,6 +10,7 @@ DOG COMMAND INTERFACE:
>    - "node log level set" sets loglevel of running sheep process
>    - "node log level get" gets loglevel from running sheep process
>    - "node log level list" lists avialable loglevels
> + - new option "-o" of "vdi track", for tracking objects with their oids
>  
>  SHEEP COMMAND INTERFACE:
>   - improvements of help messages
> diff --git a/dog/vdi.c b/dog/vdi.c
> index a6344af..76b9d8d 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -32,6 +32,7 @@ static struct sd_option vdi_options[] = {
>  	{'F', "from", true, "create a differential backup from the snapshot"},
>  	{'f', "force", false, "do operation forcibly"},
>  	{'y', "hyper", false, "create a hyper volume"},
> +	{'o', "oid", true, "specify the object id of the tracking object"},
>  	{ 0, NULL, false, NULL },
>  };
>  
> @@ -49,6 +50,7 @@ static struct vdi_cmd_data {
>  	bool force;
>  	uint8_t copy_policy;
>  	uint8_t store_policy;
> +	uint64_t oid;
>  } vdi_cmd_data = { ~0, };
>  
>  struct get_vdi_info {
> @@ -1080,6 +1082,7 @@ static int vdi_track(int argc, char **argv)
>  	struct obj_info_filler_info oid_info = {0};
>  	uint32_t vid;
>  	uint8_t nr_copies;
> +	uint64_t oid = vdi_cmd_data.oid;
>  
>  	memset(&info, 0, sizeof(info));
>  	info.name = vdiname;
> @@ -1097,38 +1100,48 @@ static int vdi_track(int argc, char **argv)
>  		return EXIT_MISSING;
>  	}
>  
> -	if (idx == ~0) {
> -		printf("Tracking the inode object 0x%" PRIx32 " with %d nodes\n",
> -		       vid, sd_nodes_nr);
> -		return do_track_object(vid_to_vdi_oid(vid), nr_copies);
> -	}
> +	if (!oid) {
> +		if (idx == ~0) {
> +			printf("Tracking the inode object 0x%" PRIx32
> +			       " with %d nodes\n", vid, sd_nodes_nr);
> +			return do_track_object(vid_to_vdi_oid(vid), nr_copies);
> +		}
>  
> -	oid_info.success = false;
> -	oid_info.idx = idx;
> +		oid_info.success = false;
> +		oid_info.idx = idx;
>  
> -	if (idx >= MAX_DATA_OBJS) {
> -		printf("The offset is too large!\n");
> -		goto err;
> -	}
> +		if (idx >= MAX_DATA_OBJS) {
> +			printf("The offset is too large!\n");
> +			goto err;
> +		}
>  
> -	parse_objs(vid_to_vdi_oid(vid), obj_info_filler, &oid_info,
> -		   get_store_objsize(info.copy_policy,
> -				     vid_to_data_oid(vid, 0)));
> +		parse_objs(vid_to_vdi_oid(vid), obj_info_filler, &oid_info,
> +			   get_store_objsize(info.copy_policy,
> +					     vid_to_data_oid(vid, 0)));
> +
> +		if (!oid_info.success) {
> +			sd_err("Failed to read the inode object 0x%" PRIx32,
> +			       vid);
> +			goto err;
> +		}
> +		if (!oid_info.data_oid) {
> +			printf("The inode object 0x%"PRIx32
> +			       " idx %u is not allocated\n", vid, idx);
> +			goto err;
> +		}
> +
> +		oid = oid_info.data_oid;
> +
> +		printf("Tracking the object 0x%" PRIx64
> +		       " (the inode vid 0x%" PRIx32 " idx %u)"
> +		       " with %d nodes\n", oid, vid, idx, sd_nodes_nr);
> +	} else
> +		printf("Tracking the object 0x%" PRIx64
> +		       " (the inode vid 0x%" PRIx32 ")"
> +		       " with %d nodes\n", oid, vid, sd_nodes_nr);
> +
> +	return do_track_object(oid, nr_copies);
>  
> -	if (!oid_info.success) {
> -		sd_err("Failed to read the inode object 0x%" PRIx32, vid);
> -		goto err;
> -	}
> -	if (!oid_info.data_oid) {
> -		printf("The inode object 0x%"PRIx32" idx %u is not allocated\n",
> -		       vid, idx);
> -		goto err;
> -	}
> -	printf("Tracking the object 0x%" PRIx64
> -	       " (the inode vid 0x%" PRIx32 " idx %u)"
> -	       " with %d nodes\n",
> -	       oid_info.data_oid, vid, idx, sd_nodes_nr);
> -	return do_track_object(oid_info.data_oid, nr_copies);
>  err:
>  	return EXIT_FAILURE;
>  }
> @@ -2428,7 +2441,8 @@ static struct subcommand vdi_cmd[] = {
>  	{"object", "<vdiname>", "isaph", "show object information in the image",
>  	 NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
>  	 vdi_object, vdi_options},
> -	{"track", "<vdiname>", "isaph", "show the object epoch trace in the image",
> +	{"track", "<vdiname>", "isapho",
> +	 "show the object epoch trace in the image",
>  	 NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
>  	 vdi_track, vdi_options},
>  	{"setattr", "<vdiname> <key> [value]", "dxaph", "set a VDI attribute",
> @@ -2521,6 +2535,14 @@ static int vdi_parser(int ch, const char *opt)
>  		break;
>  	case 'y':
>  		vdi_cmd_data.store_policy = 1;
> +		break;
> +	case 'o':
> +		vdi_cmd_data.oid = strtol(opt, &p, 16);

I think you need use strtoll here.

Thanks
Yuan



More information about the sheepdog mailing list