On Wed, Aug 20, 2014 at 04:53:46PM +0800, Ruoyu wrote: > Once vdi snapshot is deleted before executing 'dog cluster snapshot > save', error messsage just like as below is seen. > > Failed to read object 807c2b2500000000 No object found > Failed to read inode header > > Once a vdi is deleted, cluster snapshot save will not backup it to > farm so that cluster snapshot load cannot restore it to new cluster. > However, the vdi id is marked as in use for safety, vdi list > will try to read all vdis in use. Therefore, dog cannot read the object. > > The solution is saving the deleted vdi object too. To achieve it, > a parameter, include_deleted, is added to the function parse_vdi.
s/include_deleted/no_deleted looks better. > The default value is false. But for cluster snapshot save, it is true. > > Functional test 030 is also updated to simulate the scenario. > > Reported-by: Valerio Pachera <siri...@gmail.com> > Signed-off-by: Ruoyu <lian...@ucweb.com> > --- > dog/cluster.c | 5 +++-- > dog/common.c | 9 ++++++--- > dog/dog.h | 3 ++- > dog/node.c | 2 +- > dog/vdi.c | 19 +++++++++++-------- > tests/functional/030 | 14 ++++++++++++++ > tests/functional/030.out | 13 +++++++++++++ > 7 files changed, 50 insertions(+), 15 deletions(-) > > diff --git a/dog/cluster.c b/dog/cluster.c > index 9cf96a8..86188e2 100644 > --- a/dog/cluster.c > +++ b/dog/cluster.c > @@ -419,7 +419,8 @@ static int save_snapshot(int argc, char **argv) > > opt.count = argc - optind; > opt.name = argv + optind; > - if (parse_vdi(fill_object_tree, SD_INODE_SIZE, &opt) != SD_RES_SUCCESS) > + if (parse_vdi(fill_object_tree, SD_INODE_SIZE, > + &opt, true) != SD_RES_SUCCESS) > goto out; > > if (object_tree_size() == 0) { > @@ -657,7 +658,7 @@ static void cluster_check_cb(uint32_t vid, const char > *name, const char *tag, > > static int cluster_check(int argc, char **argv) > { > - if (parse_vdi(cluster_check_cb, SD_INODE_SIZE, NULL) < 0) > + if (parse_vdi(cluster_check_cb, SD_INODE_SIZE, NULL, false) < 0) > return EXIT_SYSFAIL; > > return EXIT_SUCCESS; > diff --git a/dog/common.c b/dog/common.c > index 2335e14..8cbf44c 100644 > --- a/dog/common.c > +++ b/dog/common.c > @@ -128,7 +128,8 @@ int dog_write_object(uint64_t oid, uint64_t cow_oid, void > *data, > > #define FOR_EACH_VDI(nr, vdis) FOR_EACH_BIT(nr, vdis, SD_NR_VDIS) > > -int parse_vdi(vdi_parser_func_t func, size_t size, void *data) > +int parse_vdi(vdi_parser_func_t func, size_t size, void *data, > + bool include_deleted) > { > int ret; > unsigned long nr; > @@ -163,8 +164,10 @@ int parse_vdi(vdi_parser_func_t func, size_t size, void > *data) > continue; > } > > - if (i->name[0] == '\0') /* this VDI has been deleted */ > - continue; > + if (!include_deleted) { > + if (i->name[0] == '\0') /* this VDI has been deleted */ > + continue; > + } then if (no_deleted && i->name[0] == '\0') continue; looks better self-explained. Thanks Yuan -- sheepdog mailing list sheepdog@lists.wpkg.org http://lists.wpkg.org/mailman/listinfo/sheepdog