[Sheepdog] [PATCH 2/2] always delete data objects when deleting an cloned vdi

MORITA Kazutaka morita.kazutaka at gmail.com
Thu May 3 21:46:40 CEST 2012


At Mon, 23 Apr 2012 14:18:06 +0800,
Li Wenpeng wrote:
> 
> From: levin li <xingke.lwp at taobao.com>
> 
> When deleting a cloned vdi, sheep find the root vdi and then
> traverse the vdi chain(such as base --> snapshot --> clone) to
> check wheter there's an undeleted vdi in the chain, if some vdi
> in the chain isn't deleted, sheep just mark the cloned vdi as
> deleted by clear its vdi name.
> 
> But in fact a cloned vdi may created its own objects by copy-on-write,
> these objects can be deleted when deleting the vdi, so we make
> the cloned vdi to be deleted as the root vdi, then we can deleting
> its data objects, in delete_one() we check whether the object belongs
> to itself to determine whether to delete the object.
> 
> Signed-off-by: levin li <xingke.lwp at taobao.com>
> ---
>  sheep/vdi.c |   14 ++++++++++++++
>  1 files changed, 14 insertions(+), 0 deletions(-)
> 
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index d2a522d..c8085c8 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -478,6 +478,12 @@ static void delete_one(struct work *work)
>  		if (!inode->data_vdi_id[i])
>  			continue;
>  
> +		if (inode->data_vdi_id[i] != inode->vdi_id) {
> +			dprintf("object %" PRIx64 " is base's data, would not be deleted.\n",
> +					vid_to_data_oid(inode->data_vdi_id[i], i));
> +			continue;
> +		}
> +
>  		ret = remove_object(dw->entries, dw->nr_vnodes, dw->nr_zones, dw->epoch,
>  			      vid_to_data_oid(inode->data_vdi_id[i], i),
>  			      inode->nr_copies);
> @@ -587,6 +593,14 @@ next:
>  			  vid_to_vdi_oid(vid), (char *)inode,
>  			  SD_INODE_HEADER_SIZE, 0, sys->nr_sobjs);
>  
> +	if (vid == inode->vdi_id && inode->snap_id == 1

What does 'inode->snap_id == 1' mean here?  I think this patch is not
correct at all.

Thanks,

Kazutaka

> +			&& inode->parent_vdi_id != 0
> +			&& !inode->snap_ctime) {
> +		dprintf("vdi %" PRIx32 " is a cloned vdi.\n", vid);
> +		/* current vdi is a cloned vdi */
> +		goto out;
> +	}
> +
>  	if (ret != SD_RES_SUCCESS) {
>  		eprintf("cannot find VDI object\n");
>  		vid = 0;
> -- 
> 1.7.1
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



More information about the sheepdog mailing list