This will save network traffic. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- sheep/gateway.c | 11 ++++++++--- sheep/ops.c | 17 ++++++++++++----- sheep/request.c | 2 ++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/sheep/gateway.c b/sheep/gateway.c index 3e8e673..2ed53d4 100644 --- a/sheep/gateway.c +++ b/sheep/gateway.c @@ -32,8 +32,10 @@ int gateway_read_obj(struct request *req) uint64_t oid = req->rq.obj.oid; int nr_copies, j; - if (is_object_cache_enabled() && !req->local && !bypass_object_cache(req)) - return object_cache_handle_request(req); + if (is_object_cache_enabled() && !req->local && !bypass_object_cache(req)) { + ret = object_cache_handle_request(req); + goto out; + } nr_copies = get_req_copy_number(req); oid_to_vnodes(req->vinfo->vnodes, req->vinfo->nr_vnodes, oid, @@ -44,7 +46,7 @@ int gateway_read_obj(struct request *req) continue; ret = peer_read_obj(req); if (ret == SD_RES_SUCCESS) - return ret; + goto out; eprintf("local read fail %x\n", ret); break; @@ -95,6 +97,9 @@ int gateway_read_obj(struct request *req) sheep_put_sockfd(&v->nid, sfd); } } +out: + if (ret != SD_RES_SUCCESS) + req->rp.data_length = 0; return ret; } diff --git a/sheep/ops.c b/sheep/ops.c index 4c0426f..472fb00 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -401,8 +401,9 @@ static int local_get_store_list(struct request *req) strbuf_addf(&buf, "%s ", driver->name); } strbuf_copyout(&buf, req->data, req->data_length); - strbuf_release(&buf); + + req->rp.data_length = strlen(req->data) + 1; return SD_RES_SUCCESS; } @@ -676,12 +677,16 @@ static int local_get_snap_file(struct request *req) int ret; struct siocb iocb = { .buf = req->data }; - if (sd_store->get_snap_file) { + if (sd_store->get_snap_file) ret = sd_store->get_snap_file(&iocb); - req->rp.data_length = iocb.length; - } else + else ret = SD_RES_NO_SUPPORT; + if (ret == SD_RES_SUCCESS) + req->rp.data_length = iocb.length; + else + req->rp.data_length = 0; + return ret; } @@ -731,8 +736,10 @@ static int local_trace_read_buf(struct request *request) int ret; ret = trace_buffer_pop(request->data, req->data_length); - if (ret == -1) + if (ret == -1) { + rsp->data_length = 0; return SD_RES_AGAIN; + } rsp->data_length = ret; dprintf("%u\n", rsp->data_length); diff --git a/sheep/request.c b/sheep/request.c index ae12bd3..40a49fc 100644 --- a/sheep/request.c +++ b/sheep/request.c @@ -123,6 +123,7 @@ static int check_request_epoch(struct request *req) /* ask gateway to retry. */ req->rp.result = SD_RES_OLD_NODE_VER; req->rp.epoch = sys->epoch; + req->rp.data_length = 0; put_request(req); return -1; } else if (after(req->rq.epoch, sys->epoch)) { @@ -394,6 +395,7 @@ static void queue_request(struct request *req) return; done: + rsp->data_length = 0; put_request(req); } -- 1.7.2.5 |