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

Hitoshi Mitake mitake.hitoshi at gmail.com
Fri Dec 13 06:22:26 CET 2013


At Fri, 13 Dec 2013 13:16:24 +0800,
Liu Yuan wrote:
> 
> 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, good catch. I'll fix it and send v2 soon.

Thanks,
Hitoshi



More information about the sheepdog mailing list