We cannot exit forward_write_obj_req() just when an error occurs
because other connections may be during data receiving.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 sheep/store.c |   37 +++++++++++++++++--------------------
 1 files changed, 17 insertions(+), 20 deletions(-)

diff --git a/sheep/store.c b/sheep/store.c
index c229679..6b31267 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -357,7 +357,7 @@ static int forward_write_obj_req(struct request *req, int 
idx)
        uint64_t oid = hdr.oid;
        int copies;
        struct pollfd pfds[SD_MAX_REDUNDANCY];
-       int done, nr_fds, local = 0;
+       int nr_fds, local = 0;
 
        dprintf("%"PRIx64"\n", oid);
        e = req->entry;
@@ -372,7 +372,6 @@ static int forward_write_obj_req(struct request *req, int 
idx)
                copies = req->nr_nodes;
 
        nr_fds = 0;
-       done = 0;
        memset(pfds, 0, sizeof(pfds));
        for (i = 0; i < ARRAY_SIZE(pfds); i++)
                pfds[i].fd = -1;
@@ -426,52 +425,50 @@ static int forward_write_obj_req(struct request *req, int 
idx)
                }
        }
 
+       ret = SD_RES_SUCCESS;
 again:
-       ret = poll(pfds, nr_fds, -1);
-
-       if (ret < 0) {
+       if (poll(pfds, nr_fds, -1) < 0) {
                if (errno == EINTR)
                        goto again;
 
                ret = SD_RES_EIO;
-               goto out;
        }
 
        for (i = 0; i < nr_fds; i++) {
                if (pfds[i].fd < 0)
-                       continue;
+                       break;
 
-               if (pfds[i].revents & POLLERR || pfds[i].revents & POLLHUP) {
-                       ret = SD_RES_EIO;
-                       goto out;
+               if (pfds[i].revents & POLLERR || pfds[i].revents & POLLHUP || 
pfds[i].revents & POLLNVAL) {
+                       ret = SD_RES_NETWORK_ERROR;
+                       break;
                }
 
                if (!(pfds[i].revents & POLLIN))
                        continue;
 
-               ret = do_read(pfds[i].fd, rsp, sizeof(*rsp));
-
-               if (ret) {
+               if (do_read(pfds[i].fd, rsp, sizeof(*rsp))) {
                        eprintf("failed to get a rsp, %m\n");
                        ret = SD_RES_NETWORK_ERROR;
-                       goto out;
+                       break;
                }
 
                if (rsp->result != SD_RES_SUCCESS) {
                        eprintf("fail %"PRIu32"\n", rsp->result);
                        ret = rsp->result;
-                       goto out;
                }
 
-               done++;
+               break;
+       }
+       if (i < nr_fds) {
+               nr_fds--;
+               memmove(pfds + i, pfds + i + 1, sizeof(*pfds) * (nr_fds - i));
        }
 
-       dprintf("%"PRIx64" %"PRIu32" %"PRIu32"\n", oid, nr_fds, done);
+       dprintf("%"PRIx64" %"PRIu32"\n", oid, nr_fds);
 
-       if (done != nr_fds)
+       if (nr_fds > 0) {
                goto again;
-
-       ret = SD_RES_SUCCESS;
+       }
 out:
        return ret;
 }
-- 
1.5.6.5

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

Reply via email to