SD_PROTO_VER is a protocol version between sheep and client, so the
check of SD_PROTO_VER_TRIM_ZERO_SECTORS must be in gateway_read_obj,
not peer_read_obj.

Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
---
 sheep/gateway.c |   18 +++++++++++++++---
 sheep/ops.c     |    8 ++------
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/sheep/gateway.c b/sheep/gateway.c
index eea6d41..55b1370 100644
--- a/sheep/gateway.c
+++ b/sheep/gateway.c
@@ -39,8 +39,11 @@ 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,
@@ -51,7 +54,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;
@@ -84,6 +87,15 @@ int gateway_read_obj(struct request *req)
                memcpy(&req->rp, rsp, sizeof(*rsp));
                break;
        }
+out:
+       if (ret == SD_RES_SUCCESS &&
+           req->rq.proto_ver < SD_PROTO_VER_TRIM_ZERO_SECTORS) {
+               /* the client doesn't support trimming zero bytes */
+               set_trimmed_sectors(req->data, req->rp.obj.offset,
+                                   req->rp.data_length, req->rq.data_length);
+               req->rp.data_length = req->rq.data_length;
+               req->rp.obj.offset = 0;
+       }
        return ret;
 }
 
diff --git a/sheep/ops.c b/sheep/ops.c
index a2a795e..df4831b 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -775,12 +775,8 @@ int peer_read_obj(struct request *req)
                goto out;
 
        rsp->data_length = hdr->data_length;
-
-       if (hdr->proto_ver >= SD_PROTO_VER_TRIM_ZERO_SECTORS) {
-               rsp->obj.offset = 0;
-               trim_zero_sectors(req->data, &rsp->obj.offset,
-                                 &rsp->data_length);
-       }
+       rsp->obj.offset = 0;
+       trim_zero_sectors(req->data, &rsp->obj.offset, &rsp->data_length);
 
        if (hdr->obj.copies)
                rsp->obj.copies = hdr->obj.copies;
-- 
1.7.2.5

-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to