From: Liu Yuan <[email protected]>

We should continue to read if one read fails, since we have strong consistency

Signed-off-by: Liu Yuan <[email protected]>
---
 update:
 - reset hdr if error happens 
 sheep/gateway.c |   23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/sheep/gateway.c b/sheep/gateway.c
index c89dd2c..ffe4ffd 100644
--- a/sheep/gateway.c
+++ b/sheep/gateway.c
@@ -15,7 +15,11 @@
 
 #include "sheep_priv.h"
 
-
+/*
+ * Try our best to read one copy and read local first.
+ *
+ * Return success if any read succeed.
+ */
 int forward_read_obj_req(struct request *req)
 {
        int i, fd, ret = SD_RES_SUCCESS;
@@ -35,7 +39,6 @@ int forward_read_obj_req(struct request *req)
        else
                nr_copies = get_nr_copies(req->vnodes);
 
-       /* TODO: we can do better; we need to check this first */
        oid_to_vnodes(req->vnodes, oid, nr_copies, obj_vnodes);
        for (i = 0; i < nr_copies; i++) {
                v = obj_vnodes[i];
@@ -71,16 +74,20 @@ read_remote:
 
                ret = exec_req(fd, &fwd_hdr, req->data, &wlen, &rlen);
 
-               if (ret) { /* network errors */
+               if (ret) {
+                       dprintf("remote node might be crashed");
                        sheep_del_fd(v, fd, sock_idx);
                        ret = SD_RES_NETWORK_ERROR;
                        continue;
-               } else {
-                       sheep_put_fd(v, fd, sock_idx);
-                       memcpy(&req->rp, rsp, sizeof(*rsp));
-                       ret = rsp->result;
-                       break;
                }
+               sheep_put_fd(v, fd, sock_idx);
+               memcpy(&req->rp, rsp, sizeof(*rsp));
+               ret = rsp->result;
+               if (ret == SD_RES_SUCCESS)
+                       break;
+               /* Reset the hdr for next read */
+               memcpy(&fwd_hdr, &req->rq, sizeof(fwd_hdr));
+               fwd_hdr.flags |= SD_FLAG_CMD_IO_LOCAL;
        }
        return ret;
 }
-- 
1.7.10.2

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to