[Sheepdog] [PATCH] sheep: update inode cache first

Liu Yuan namei.unix at gmail.com
Mon Apr 16 07:40:49 CEST 2012


On 04/13/2012 10:25 AM, yaohaiting.wujue at gmail.com wrote:

> From: HaiTing Yao <wujue.yht at taobao.com>
> 
> When create snapshot, write inode of base VDI internally without care of
> cache. Then the inode in cache may be wrong from disk
> 
> Signed-off-by: HaiTing Yao <wujue.yht at taobao.com>
> ---
>  sheep/sdnet.c      |   12 +++++++++---
>  sheep/sheep_priv.h |    3 +++
>  sheep/store.c      |   39 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 51 insertions(+), 3 deletions(-)
> 
> diff --git a/sheep/sdnet.c b/sheep/sdnet.c
> index 5db9f29..d21c12e 100644
> --- a/sheep/sdnet.c
> +++ b/sheep/sdnet.c
> @@ -623,20 +623,26 @@ int write_object(struct sd_vnode *e,
>  		 uint64_t offset, uint16_t flags, int nr, int create)
>  {
>  	struct sd_obj_req hdr;
> -	int i, n, fd, ret;
> +	int i, n, fd, ret, local = -1;
>  	char name[128];
> +	uint32_t vid = oid_to_vid(oid);
>  
>  	if (nr > zones)
>  		nr = zones;
>  
> +	if (object_is_cached(oid))
> +		local = write_inode_cache(oid, data, datalen, offset,
> +			flags, nr, node_version, create);
> +
>  	for (i = 0; i < nr; i++) {
>  		unsigned rlen = 0, wlen = datalen;
>  
>  		n = obj_to_sheep(e, vnodes, oid, i);
>  
>  		if (is_myself(e[n].addr, e[n].port)) {
> -			ret = write_object_local(oid, data, datalen, offset,
> -						 flags, nr, node_version, create);
> +			if (local)
> +				ret = write_object_local(oid, data, datalen, offset,
> +					flags, nr, node_version, create);
>  
>  			if (ret != 0) {
>  				eprintf("fail %"PRIx64" %"PRIx32"\n", oid, ret);
> diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
> index a9e8440..7fc7c0b 100644
> --- a/sheep/sheep_priv.h
> +++ b/sheep/sheep_priv.h
> @@ -248,6 +248,9 @@ void do_io_request(struct work *work);
>  int write_object_local(uint64_t oid, char *data, unsigned int datalen,
>  		       uint64_t offset, uint16_t flags, int copies,
>  		       uint32_t epoch, int create);
> +int write_inode_cache(uint64_t oid, char *data, unsigned int datalen,
> +		       uint64_t offset, uint16_t flags, int copies,
> +		       uint32_t epoch, int create);
>  int read_object_local(uint64_t oid, char *data, unsigned int datalen,
>  		      uint64_t offset, int copies, uint32_t epoch);
>  int forward_write_obj_req(struct request *req);
> diff --git a/sheep/store.c b/sheep/store.c
> index 739862c..e226898 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -551,6 +551,45 @@ int write_object_local(uint64_t oid, char *data, unsigned int datalen,
>  	return ret;
>  }
>  
> +int write_inode_cache(uint64_t oid, char *data, unsigned int datalen,
> +		       uint64_t offset, uint16_t flags, int copies,
> +		       uint32_t epoch, int create)
> +{
> +	int ret;
> +	struct request *req;
> +	struct sd_obj_req *hdr;
> +	uint32_t vid = oid_to_vid(oid);
> +	uint32_t idx = data_oid_to_idx(oid);
> +	struct object_cache *cache;
> +
> +	idx |= 1 << CACHE_VDI_SHIFT;
> +
> +	cache = find_object_cache(vid, 1);
> +
> +	req = zalloc(sizeof(*req));
> +	if (!req)
> +		return SD_RES_NO_MEM;
> +	hdr = (struct sd_obj_req *)&req->rq;
> +
> +	hdr->oid = oid;
> +	if (create)
> +		hdr->opcode = SD_OP_CREATE_AND_WRITE_OBJ;
> +	else
> +		hdr->opcode = SD_OP_WRITE_OBJ;
> +	hdr->copies = copies;
> +	hdr->flags = flags | SD_FLAG_CMD_WRITE;
> +	hdr->offset = offset;
> +	hdr->data_length = datalen;
> +	req->data = data;
> +	req->op = get_sd_op(hdr->opcode);
> +
> +	ret = object_cache_rw(cache, idx, req);
> +
> +	free(req);
> +
> +	return ret;
> +}
> +
>  int read_object_local(uint64_t oid, char *data, unsigned int datalen,
>  		      uint64_t offset, int copies, uint32_t epoch)
>  {


I think we need to fix qemu-img firstly for creation, conversion and
snapshot operation. After that, let's see if there is problem inside sheep.

Thanks,
Yuan



More information about the sheepdog mailing list