Use the out and done labels more consistently and flatten the control flow.
Also return actual error values instead of -1 to the caller in all cases
to allow for more fine grained error handling in the future.

diff --git a/sheep/recovery.c b/sheep/recovery.c
index 591c5d1..2597126 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -79,7 +79,7 @@ static int recover_object_from_replica(uint64_t oid,
        struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
        char name[128];
        unsigned wlen = 0, rlen;
-       int fd, ret = -1;
+       int fd, ret;
        void *buf;
        struct siocb iocb = { 0 };
 
@@ -93,6 +93,7 @@ static int recover_object_from_replica(uint64_t oid,
        buf = valloc(rlen);
        if (!buf) {
                eprintf("%m\n");
+               ret = SD_RES_EIO;
                goto out;
        }
 
@@ -100,13 +101,9 @@ static int recover_object_from_replica(uint64_t oid,
                iocb.epoch = epoch;
                iocb.length = rlen;
                ret = sd_store->link(oid, &iocb, tgt_epoch);
-               if (ret == SD_RES_SUCCESS) {
-                       ret = 0;
-                       goto done;
-               } else {
-                       ret = -1;
+               if (ret != SD_RES_SUCCESS)
                        goto out;
-               }
+               goto done;
        }
 
        addr_to_str(name, sizeof(name), entry->addr, 0);
@@ -114,7 +111,7 @@ static int recover_object_from_replica(uint64_t oid,
        dprintf("%s, %d\n", name, entry->port);
        if (fd < 0) {
                eprintf("failed to connect to %s:%"PRIu32"\n", name, 
entry->port);
-               ret = -1;
+               ret = SD_RES_EIO;
                goto out;
        }
 
@@ -133,31 +130,29 @@ static int recover_object_from_replica(uint64_t oid,
 
        if (ret != 0) {
                eprintf("res: %"PRIx32"\n", rsp->result);
-               ret = -1;
                goto out;
        }
 
        rsp = (struct sd_rsp *)&hdr;
 
-       if (rsp->result == SD_RES_SUCCESS) {
-               iocb.epoch = epoch;
-               iocb.length = rlen;
-               iocb.buf = buf;
-               ret = sd_store->atomic_put(oid, &iocb);
-               if (ret != SD_RES_SUCCESS) {
-                       ret = -1;
-                       goto out;
-               }
-       } else {
+       if (rsp->result != SD_RES_SUCCESS) {
                eprintf("failed, res: %"PRIx32"\n", rsp->result);
                ret = rsp->result;
                goto out;
        }
+
+       iocb.epoch = epoch;
+       iocb.length = rlen;
+       iocb.buf = buf;
+       ret = sd_store->atomic_put(oid, &iocb);
+       if (ret != SD_RES_SUCCESS)
+               goto out;
+
 done:
-       dprintf("recovered oid %"PRIx64" from %d to epoch %d\n", oid, 
tgt_epoch, epoch);
+       dprintf("recovered oid %"PRIx64" from %d to epoch %d\n", oid,
+               tgt_epoch, epoch);
+       objlist_cache_insert(oid);
 out:
-       if (ret == SD_RES_SUCCESS)
-               objlist_cache_insert(oid);
        free(buf);
        return ret;
 }
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to