[sheepdog] [PATCH] object cache: reuse the pulled buffer for read request

Liu Yuan namei.unix at gmail.com
Thu Aug 2 04:04:36 CEST 2012


On 08/02/2012 09:53 AM, levin li wrote:
> From: levin li <xingke.lwp at taobao.com>
> 
> 
> Signed-off-by: levin li <xingke.lwp at taobao.com>
> ---
>  sheep/object_cache.c |   37 ++++++++++++++++++++++++++++++-------
>  1 files changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/sheep/object_cache.c b/sheep/object_cache.c
> index 3b6ecbe..ca95287 100644
> --- a/sheep/object_cache.c
> +++ b/sheep/object_cache.c
> @@ -740,7 +740,8 @@ out:
>  
>  
>  /* Fetch the object, cache it in success */
> -static int object_cache_pull(struct object_cache *oc, uint32_t idx)
> +static int object_cache_pull(struct object_cache *oc, uint32_t idx,
> +			     void **buffer)
>  {
>  	struct sd_req hdr;
>  	int ret = SD_RES_NO_MEM;
> @@ -776,7 +777,11 @@ static int object_cache_pull(struct object_cache *oc, uint32_t idx)
>  		else if (ret == SD_RES_OID_EXIST)
>  			ret = SD_RES_SUCCESS;
>  	}
> -	free(buf);
> +
> +	if (ret != SD_RES_SUCCESS)
> +		free(buf);
> +	else
> +		*buffer = buf;
>  out:
>  	return ret;
>  }
> @@ -952,6 +957,12 @@ int bypass_object_cache(struct request *req)
>  	return 0;
>  }
>  
> +static void read_cache_buffer(void *buffer, void *data, size_t count,
> +			      off_t offset)
> +{
> +	memcpy(data, (char *)buffer + offset, count);
> +}
> +
>  int object_cache_handle_request(struct request *req)
>  {
>  	struct sd_req *hdr = &req->rq;
> @@ -961,6 +972,7 @@ int object_cache_handle_request(struct request *req)
>  	struct object_cache *cache;
>  	struct object_cache_entry *entry;
>  	int ret, create = 0;
> +	void *data_buf = NULL;
>  
>  	dprintf("%08"PRIx32", len %"PRIu32", off %"PRIu64"\n", idx,
>  		hdr->data_length, hdr->obj.offset);
> @@ -973,7 +985,7 @@ int object_cache_handle_request(struct request *req)
>  retry:
>  	ret = object_cache_lookup(cache, idx, create);
>  	if (ret == SD_RES_NO_CACHE) {
> -		ret = object_cache_pull(cache, idx);
> +		ret = object_cache_pull(cache, idx, &data_buf);
>  		if (ret != SD_RES_SUCCESS)
>  			return ret;
>  	} else if (ret == SD_RES_EIO)
> @@ -983,6 +995,10 @@ retry:
>  	if (!entry) {
>  		dprintf("oid %"PRIx64" maybe reclaimed\n",
>  			idx_to_oid(vid, idx));
> +		if (data_buf) {
> +			free(data_buf);
> +			data_buf = NULL;
> +		}
>  		goto retry;
>  	}
>  
> @@ -994,16 +1010,23 @@ retry:
>  		update_cache_entry(cache, idx, hdr->data_length,
>  				   hdr->obj.offset);
>  	} else {
> -		ret = read_cache_object(cache->vid, idx, req->data,
> -					hdr->data_length, hdr->obj.offset);
> -		if (ret != SD_RES_SUCCESS)
> -			goto err;
> +		if (data_buf) {
> +			read_cache_buffer(data_buf, req->data, hdr->data_length,
> +					  hdr->obj.offset);
> +		} else {
> +			ret = read_cache_object(cache->vid, idx, req->data,
> +						hdr->data_length,
> +						hdr->obj.offset);

I think this trick doesn't improve the performance, because by default
we use buffered RW for object cache, which is mostly a memory operation.

Also this patch makes the code more complex. Consider we don't get much
benefit, I think we'd better drop this micro optimization.

Thanks,
Yuan



More information about the sheepdog mailing list