On Wed, Nov 26, 2014 at 10:50:46AM +0900, Saeki Masaki wrote:
> For day-to-day backup, repeatedly create snapshot and delete snapshot.
> but inode file remains even after delete snapshot.
> "dog vdi list" command would read all inode files, even if vdi/snapshot was 
> deleted.
> this behavior is inefficient to get current VDI list.
> 
> This patch manages the deleted VDI in a bit map. 
> And, referring VDI bit map when you get VDI list, to open only the necessary 
> files.
> 
> Assessment procedure of this patch are below
> 
> 1. create VDI 1000 times
> 2. clearing file cache
> 3. execute "dog vdi list -T"
> ===> execution time assessment [case1]
> 4. create and delete snapshot 4000 times
> 5. clearing file cache
> 6. execute "dog vdi list -T"
> ===> execution time assessment [case2]
> 7. create and delete snapshot 5000 times
> 8. clearing file cache
> 9. execute "dog vdi list -T"
> ===> execution time assessment [case3]
> 
> results are follow.
> 
> * Current Sheepdog
> [case1] Elapsed time: 0.963 seconds
> [case2] Elapsed time: 6.522 seconds
> [case3] Elapsed time: 23.376 seconds
> 
> * Patch applied Sheepdog
> [case1] Elapsed time: 0.714 seconds
> [case2] Elapsed time: 0.979 seconds
> [case3] Elapsed time: 0.921 seconds
> 
> Signed-off-by: Masaki Saeki <[email protected]>
> ---
>  dog/common.c             |   15 +++++++++++++++
>  include/internal_proto.h |    2 +-
>  include/sheepdog_proto.h |    1 +
>  sheep/group.c            |    1 +
>  sheep/ops.c              |   17 +++++++++++++++++
>  sheep/plain_store.c      |    4 ++++
>  sheep/sheep_priv.h       |    2 ++
>  sheep/vdi.c              |   14 ++++++++++++++
>  8 files changed, 55 insertions(+), 1 deletions(-)
> 
> diff --git a/dog/common.c b/dog/common.c
> index 3c4f6f5..2d8a173 100644
> --- a/dog/common.c
> +++ b/dog/common.c
> @@ -137,6 +137,7 @@ int parse_vdi(vdi_parser_func_t func, size_t size, void 
> *data,
>       struct sd_req req;
>       struct sd_rsp *rsp = (struct sd_rsp *)&req;
>       static DECLARE_BITMAP(vdi_inuse, SD_NR_VDIS);
> +     static DECLARE_BITMAP(vdi_deleted, SD_NR_VDIS);
>       uint32_t rlen;
>  
>       sd_init_req(&req, SD_OP_READ_VDIS);
> @@ -150,10 +151,24 @@ int parse_vdi(vdi_parser_func_t func, size_t size, void 
> *data,
>               goto out;
>       }
>  
> +     sd_init_req(&req, SD_OP_READ_DEL_VDIS);
> +     req.data_length = sizeof(vdi_deleted);
> +
> +     ret = dog_exec_req(&sd_nid, &req, vdi_deleted);
> +     if (ret < 0)
> +             goto out;
> +     if (rsp->result != SD_RES_SUCCESS) {
> +             sd_err("%s", sd_strerror(rsp->result));
> +             goto out;
> +     }
> +
>       FOR_EACH_VDI(nr, vdi_inuse) {
>               uint64_t oid;
>               uint32_t snapid;
>  
> +             if (test_bit(nr, vdi_deleted))
> +                     continue;
> +
>               oid = vid_to_vdi_oid(nr);
>  
>               /* for B-tree inode, we also need sd_index_header */
> diff --git a/include/internal_proto.h b/include/internal_proto.h
> index 85f66b8..faed3f6 100644
> --- a/include/internal_proto.h
> +++ b/include/internal_proto.h
> @@ -24,7 +24,7 @@
>  #include "rbtree.h"
>  #include "fec.h"
>  
> -#define SD_SHEEP_PROTO_VER 0x09
> +#define SD_SHEEP_PROTO_VER 0x0a
>  
>  #define SD_DEFAULT_COPIES 3
>  /*
> diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h
> index c25e9f1..3785f26 100644
> --- a/include/sheepdog_proto.h
> +++ b/include/sheepdog_proto.h
> @@ -45,6 +45,7 @@
>  #define SD_OP_READ_VDIS      0x15
>  #define SD_OP_FLUSH_VDI      0x16
>  #define SD_OP_DEL_VDI        0x17
> +#define SD_OP_READ_DEL_VDIS  0x18

We should add SD_OP_READ_DEL_VDIS to internal_proto.h for dog&sheep commucation.

Thanks
Yuan
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to