[sheepdog] [PATCH v3 3/3] sheep/http: add lock to protect container and object

Liu Yuan namei.unix at gmail.com
Thu Dec 12 07:12:01 CET 2013


On Wed, Dec 11, 2013 at 06:14:43PM +0800, Robin Dong wrote:
> From: Robin Dong <sanbai at taobao.com>
> 
> Add locks to protect containers and objects when users create/delete
> containers or create/delete objects in the same time.
> 
> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
>  sheep/http/kv.c    | 252 ++++++++++++++++++++++++++++++++---------------------
>  sheep/http/swift.c |  10 ++-
>  2 files changed, 162 insertions(+), 100 deletions(-)
> 
> diff --git a/sheep/http/kv.c b/sheep/http/kv.c
> index fb66dfa..4d690cb 100644
> --- a/sheep/http/kv.c
> +++ b/sheep/http/kv.c
> @@ -218,22 +218,22 @@ static int kv_get_account(const char *account, uint32_t *nr_buckets)
>  
>  	ret = lookup_vdi(account, &account_vid);
>  	if (ret != SD_RES_SUCCESS)
> -		return ret;
> +		goto out;
>  
>  	/* read account vdi out */
>  	oid = vid_to_vdi_oid(account_vid);
>  	ret = sd_read_object(oid, (char *)&inode, sizeof(struct sd_inode), 0);
>  	if (ret != SD_RES_SUCCESS) {
>  		sd_err("Failed to read inode header %lx", oid);
> -		return ret;
> +		goto out;
>  	}
>  
>  	struct list_buckets_arg arg = {NULL, NULL, NULL, 0};
>  	traverse_btree(sheep_bnode_reader, &inode, list_buckets_cb, &arg);
>  	if (nr_buckets)
>  		*nr_buckets = arg.bucket_counter;
> -
> -	return SD_RES_SUCCESS;
> +out:
> +	return ret;
>  }
>  
>  int kv_read_account(const char *account, uint32_t *nr_buckets)
> @@ -528,21 +528,22 @@ out:
>  }
>  
>  static int kv_get_bucket(struct sd_inode *account_inode, const char *account,
> -			 const char *bucket)
> +			 const char *bucket, uint32_t *account_vid)

account_inode already has the account_vid, no? So we can remove account_vdi as
parameter.

>  {
>  	char vdi_name[SD_MAX_VDI_LEN];
>  	uint64_t oid;
> -	uint32_t account_vid, bucket_vid;
> +	uint32_t bucket_vid;
>  	int ret;
>  
> -	ret = lookup_vdi(account, &account_vid);
> +	ret = lookup_vdi(account, account_vid);
>  	if (ret != SD_RES_SUCCESS) {
>  		sd_err("Failed to find account %s", account);
>  		return -1;
>  	}
>  
> +	sys->cdrv->lock(*account_vid);

Seems that you don't unlock after exit of this function?

Thanks
Yuan




More information about the sheepdog mailing list