[sheepdog] [PATCH] sheep: cleanup generational reference counting code and document

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Mon Aug 25 03:21:22 CEST 2014


At Fri, 22 Aug 2014 17:39:23 +0900,
Hitoshi Mitake wrote:
> 
> This patch does a little refactoring of generational reference
> counting. It also fixes trivial problems of pseudo code in
> doc/object-reclaim.txt.
> 
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
>  doc/object-reclaim.txt |  6 +++++-
>  sheep/vdi.c            | 21 ++++++++-------------
>  2 files changed, 13 insertions(+), 14 deletions(-)

Applied.

Thanks,
Hitoshi

> 
> diff --git a/doc/object-reclaim.txt b/doc/object-reclaim.txt
> index 4cef5f5..d9c8fca 100644
> --- a/doc/object-reclaim.txt
> +++ b/doc/object-reclaim.txt
> @@ -43,6 +43,9 @@ Generational reference counting is performed as follows:
>     reference B is initialized as follows:
>  
>         for (i = 0; i < MAX_DATA_OBJS; i++) {
> +       	   if (!A.data_vdi_id[i])
> +              continue;
> +
>             B.gref[i].generation = A.gref[i].generation + 1;
>             B.gref[i].count = 0;
>         }
> @@ -50,7 +53,8 @@ Generational reference counting is performed as follows:
>     In addition, A.gref.count's are incremented:
>  
>         for (i = 0; i < MAX_DATA_OBJS; i++) {
> -           A.gref[i].count++;
> +       	   if (A.data_vdi_id[i])
> +              A.gref[i].count++;
>         }
>  
>  3. When a object o is removed, a decrement message is sent to its
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index 05cae7b..0adbea0 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -992,10 +992,8 @@ static int snapshot_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
>  	base->snap_ctime = iocb->time;
>  
>  	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
> -		if (!base->data_vdi_id[i])
> -			continue;
> -
> -		base->gref[i].count++;
> +		if (base->data_vdi_id[i])
> +			base->gref[i].count++;
>  	}
>  
>  	ret = sd_write_object(vid_to_vdi_oid(base_vid), (char *)base,
> @@ -1007,13 +1005,8 @@ static int snapshot_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
>  	}
>  
>  	/* create a new vdi */
> -	new = alloc_inode(iocb, new_snapid, new_vid, base->data_vdi_id, NULL);
> -	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
> -		if (!base->data_vdi_id[i])
> -			continue;
> -
> -		new->gref[i].generation = base->gref[i].generation + 1;
> -	}
> +	new = alloc_inode(iocb, new_snapid, new_vid, base->data_vdi_id,
> +			  base->gref);
>  	ret = sd_write_object(vid_to_vdi_oid(new_vid), (char *)new,
>  			      sizeof(*new), 0, true);
>  	if (ret != SD_RES_SUCCESS)
> @@ -1073,8 +1066,10 @@ static int rebase_vdi(const struct vdi_iocb *iocb, uint32_t new_snapid,
>  		goto out;
>  	}
>  
> -	for (int i = 0; i < ARRAY_SIZE(base->gref); i++)
> -		base->gref[i].count++;
> +	for (int i = 0; i < ARRAY_SIZE(base->gref); i++) {
> +		if (base->data_vdi_id[i])
> +			base->gref[i].count++;
> +	}
>  	/* update current working vdi */
>  	ret = sd_write_object(vid_to_vdi_oid(base_vid), (char *)base->gref,
>  			      sizeof(base->gref),
> -- 
> 1.8.3.2
> 



More information about the sheepdog mailing list