[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