[Sheepdog] [PATCH v3 1/3] sheep: unify cow object and regular object writing path
Liu Yuan
namei.unix at gmail.com
Tue Nov 22 08:31:01 CET 2011
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 | 96 ++++++++++++++------------------------------------------
1 files changed, 24 insertions(+), 72 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index c0dc8db..1eefee4 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,22 @@ 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;
}
-
ret = do_write_obj(&iocb, req, epoch);
out:
free(buf);
@@ -685,29 +663,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 +681,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
More information about the sheepdog
mailing list