[Sheepdog] [PATCH v2 1/3] sheep: unify cow object and regular object writing path

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Tue Nov 22 08:01:49 CET 2011


At Mon, 21 Nov 2011 20:11:21 +0800,
Liu Yuan wrote:
> 
> From: Liu Yuan <tailai.ly at taobao.com>
> 
> This is necessary to do further unifying of sheep requests handling.
> 
> small changes on other:
>  - remove read_from_one and merge it, make it return sd result.
>  - rename read_from_other_sheep into read_copy_from_cluster
> 
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
>  sheep/store.c |   97 +++++++++++++++------------------------------------------
>  1 files changed, 25 insertions(+), 72 deletions(-)
> 
> diff --git a/sheep/store.c b/sheep/store.c
> index c0dc8db..d4ba334 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -162,8 +162,8 @@ out:
>  	return res;
>  }
>  
> -static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
> -			 unsigned ori_rlen, void *buf, uint64_t offset)
> +static int read_copy_from_cluster(struct request *req, uint32_t epoch,
> +				  uint64_t oid, char *buf)
>  {
>  	int i, n, nr, ret;
>  	unsigned wlen, rlen;
> @@ -190,12 +190,11 @@ static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
>  				continue;
>  
>  			iocb.buf = buf;
> -			iocb.length = ori_rlen;
> -			iocb.offset = offset;
> +			iocb.length = SD_DATA_OBJ_SIZE;
> +			iocb.offset = 0;
>  			ret = store.read(oid, &iocb);
>  			if (ret != SD_RES_SUCCESS)
>  				continue;
> -			ret = 0;
>  			store.close(oid, &iocb);
>  			goto out;
>  		}
> @@ -209,11 +208,11 @@ static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
>  		hdr.oid = oid;
>  		hdr.epoch = epoch;
>  
> -		rlen = ori_rlen;
> +		rlen = SD_DATA_OBJ_SIZE;
>  		wlen = 0;
>  		hdr.flags = SD_FLAG_CMD_IO_LOCAL;
>  		hdr.data_length = rlen;
> -		hdr.offset = offset;
> +		hdr.offset = 0;
>  
>  		ret = exec_req(fd, (struct sd_req *)&hdr, buf, &wlen, &rlen);
>  
> @@ -224,7 +223,7 @@ static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
>  
>  		switch (rsp->result) {
>  		case SD_RES_SUCCESS:
> -			ret = 0;
> +			ret = SD_RES_SUCCESS;
>  			goto out;
>  		case SD_RES_OLD_NODE_VER:
>  		case SD_RES_NEW_NODE_VER:
> @@ -235,24 +234,11 @@ static int read_from_one(struct request *req, uint32_t epoch, uint64_t oid,
>  		}
>  	}
>  
> -	ret = -1;
> +	ret = SD_RES_EIO;
>  out:
>  	return ret;
>  }
>  
> -static int read_from_other_sheep(struct request *req, uint32_t epoch,
> -				  uint64_t oid, char *buf, int copies)
> -{
> -	int ret;
> -	unsigned int rlen;
> -
> -	rlen = SD_DATA_OBJ_SIZE;
> -
> -	ret = read_from_one(req, epoch, oid, rlen, buf, 0);
> -
> -	return ret;
> -}
> -
>  static int store_queue_request_local(struct request *req, uint32_t epoch);
>  
>  static int forward_read_obj_req(struct request *req, int idx)
> @@ -636,7 +622,7 @@ static int store_write_obj(struct request *req, uint32_t epoch)
>  	return ret;
>  }
>  
> -static int store_create_and_write_obj_cow(struct request *req, uint32_t epoch)
> +static int store_create_and_write_obj(struct request *req, uint32_t epoch)
>  {
>  	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
>  	int ret;
> @@ -654,30 +640,23 @@ static int store_create_and_write_obj_cow(struct request *req, uint32_t epoch)
>  	ret = store.open(hdr->oid, &iocb, 1);
>  	if (ret != SD_RES_SUCCESS)
>  		return ret;
> +	if (hdr->flags & SD_FLAG_CMD_COW) {
> +		dprintf("%" PRIu64 ", %" PRIx64 "\n", hdr->oid, hdr->cow_oid);
>  
> -	dprintf("%" PRIu64 ", %" PRIx64 "\n", hdr->oid, hdr->cow_oid);
> -
> -	buf = valloc(SD_DATA_OBJ_SIZE);
> -	if (!buf) {
> -		eprintf("failed to allocate memory\n");
> -		ret = SD_RES_NO_MEM;
> -		goto out;
> -	}
> -	ret = read_from_other_sheep(req, hdr->epoch, hdr->cow_oid, buf,
> -				     hdr->copies);
> -	if (ret) {
> -		eprintf("failed to read old object\n");
> -		ret = SD_RES_EIO;
> -		goto out;
> -	}
> -	iocb.buf = buf;
> -	iocb.length = SD_DATA_OBJ_SIZE;
> -	iocb.offset = 0;
> -	ret = store.write(hdr->oid, &iocb);
> -	if (ret != SD_RES_SUCCESS) {
> -		goto out;
> +		buf = xzalloc(SD_DATA_OBJ_SIZE);
> +		ret = read_copy_from_cluster(req, hdr->epoch, hdr->cow_oid, buf);
> +		if (ret != SD_RES_SUCCESS) {
> +			eprintf("failed to read cow object\n");
> +			goto out;
> +		}
> +		iocb.buf = buf;
> +		iocb.length = SD_DATA_OBJ_SIZE;
> +		iocb.offset = 0;
> +		ret = store.write(hdr->oid, &iocb);
> +		if (ret != SD_RES_SUCCESS) {
> +			goto out;
> +		}

Remove redundant braces.

Thanks,

Kazutaka


>  	}
> -
>  	ret = do_write_obj(&iocb, req, epoch);
>  out:
>  	free(buf);
> @@ -685,29 +664,6 @@ out:
>  	return ret;
>  }
>  
> -static int store_create_and_write_obj(struct request *req, uint32_t epoch)
> -{
> -	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
> -	int ret;
> -	struct siocb iocb;
> -
> -	if (!hdr->copies) {
> -		eprintf("the number of copies cannot be zero\n");
> -		return SD_RES_INVALID_PARMS;
> -	}
> -
> -	memset(&iocb, 0, sizeof(iocb));
> -	iocb.epoch = epoch;
> -	iocb.flags = hdr->flags;
> -	ret = store.open(hdr->oid, &iocb, 1);
> -	if (ret != SD_RES_SUCCESS)
> -		return ret;
> -
> -	ret = do_write_obj(&iocb, req, epoch);
> -	store.close(hdr->oid, &iocb);
> -	return ret;
> -}
> -
>  static int store_queue_request_local(struct request *req, uint32_t epoch)
>  {
>  	struct sd_obj_req *hdr = (struct sd_obj_req *)&req->rq;
> @@ -726,10 +682,7 @@ static int store_queue_request_local(struct request *req, uint32_t epoch)
>  		ret = store_read_obj(req, epoch);
>  		break;
>  	case SD_OP_CREATE_AND_WRITE_OBJ:
> -		if (hdr->flags & SD_FLAG_CMD_COW)
> -			ret = store_create_and_write_obj_cow(req, epoch);
> -		else
> -			ret = store_create_and_write_obj(req, epoch);
> +		ret = store_create_and_write_obj(req, epoch);
>  		break;
>  	}
>  
> -- 
> 1.7.8.rc3
> 
> -- 
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog



More information about the sheepdog mailing list