From: Liu Yuan <tailai.ly at taobao.com> Since sd_req has length field, we don't need data_len arg in exec_local_req() Signed-off-by: Liu Yuan <tailai.ly at taobao.com> --- sheep/object_cache.c | 5 +++-- sheep/sdnet.c | 10 +++++++--- sheep/sheep_priv.h | 2 +- sheep/store.c | 8 +++++--- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/sheep/object_cache.c b/sheep/object_cache.c index ecceba8..124650d 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -519,7 +519,7 @@ static int object_cache_pull(struct object_cache *oc, uint32_t idx) hdr.data_length = data_length; hdr.obj.oid = oid; hdr.obj.offset = 0; - ret = exec_local_req(&hdr, buf, data_length); + ret = exec_local_req(&hdr, buf); if (ret == SD_RES_SUCCESS) { dprintf("oid %"PRIx64" pulled successfully\n", oid); @@ -584,10 +584,11 @@ static int push_cache_object(uint32_t vid, uint32_t idx, uint64_t bmap, memset(&hdr, 0, sizeof(hdr)); hdr.opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ; hdr.flags = SD_FLAG_CMD_WRITE; + hdr.data_length = data_length; hdr.obj.oid = oid; hdr.obj.offset = offset; - ret = exec_local_req(&hdr, buf, data_length); + ret = exec_local_req(&hdr, buf); if (ret != SD_RES_SUCCESS) eprintf("failed to push object %x\n", ret); diff --git a/sheep/sdnet.c b/sheep/sdnet.c index 01b598f..f9c85ae 100644 --- a/sheep/sdnet.c +++ b/sheep/sdnet.c @@ -406,15 +406,19 @@ static struct request *alloc_local_request(void *data, int data_length) return req; } -int exec_local_req(struct sd_req *rq, void *data, int data_length) +/* + * Exec the request locally and synchronously. + * + * This function takes advantage of gateway's retry mechanism. + */ +int exec_local_req(struct sd_req *rq, void *data) { struct request *req; eventfd_t value = 1; int ret; - req = alloc_local_request(data, data_length); + req = alloc_local_request(data, rq->data_length); req->rq = *rq; - req->rq.data_length = data_length; req->wait_efd = eventfd(0, 0); pthread_mutex_lock(&sys->wait_req_lock); diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h index 8b38e15..4437551 100644 --- a/sheep/sheep_priv.h +++ b/sheep/sheep_priv.h @@ -285,7 +285,7 @@ int read_object(uint64_t oid, char *data, unsigned int datalen, uint64_t offset); int remove_object(uint64_t oid); -int exec_local_req(struct sd_req *rq, void *data, int data_length); +int exec_local_req(struct sd_req *rq, void *data); void local_req_init(void); int prealloc(int fd, uint32_t size); diff --git a/sheep/store.c b/sheep/store.c index ce56e34..dcbbb87 100644 --- a/sheep/store.c +++ b/sheep/store.c @@ -532,11 +532,12 @@ int write_object(uint64_t oid, char *data, unsigned int datalen, memset(&hdr, 0, sizeof(hdr)); hdr.opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ; hdr.flags = flags | SD_FLAG_CMD_WRITE; + hdr.data_length = datalen; hdr.obj.oid = oid; hdr.obj.offset = offset; - ret = exec_local_req(&hdr, data, datalen); + ret = exec_local_req(&hdr, data); if (ret != SD_RES_SUCCESS) eprintf("failed to write object %" PRIx64 ", %x\n", oid, ret); @@ -566,10 +567,11 @@ int read_object(uint64_t oid, char *data, unsigned int datalen, forward_read: memset(&hdr, 0, sizeof(hdr)); hdr.opcode = SD_OP_READ_OBJ; + hdr.data_length = datalen; hdr.obj.oid = oid; hdr.obj.offset = offset; - ret = exec_local_req(&hdr, data, datalen); + ret = exec_local_req(&hdr, data); if (ret != SD_RES_SUCCESS) eprintf("failed to read object %" PRIx64 ", %x\n", oid, ret); @@ -585,7 +587,7 @@ int remove_object(uint64_t oid) hdr.opcode = SD_OP_REMOVE_OBJ; hdr.obj.oid = oid; - ret = exec_local_req(&hdr, NULL, 0); + ret = exec_local_req(&hdr, NULL); if (ret != SD_RES_SUCCESS) eprintf("failed to remove object %" PRIx64 ", %x\n", oid, ret); -- 1.7.10.2 |