This patch introduces a state of object recovery to guarantee the
followings:

 - is_recoverying_oid() returns 1 while preparing recovery
 - we access rw->done only in main thread

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

diff --git a/sheep/store.c b/sheep/store.c
index 45ddd23..9f04ccc 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -1038,7 +1038,14 @@ static int contains_node(struct 
sheepdog_vnode_list_entry *key,
        return -1;
 }
 
+enum rw_state {
+       RW_INIT,
+       RW_RUN,
+};
+
 struct recovery_work {
+       enum rw_state state;
+
        uint32_t epoch;
        uint32_t done;
 
@@ -1407,9 +1414,6 @@ fail:
 out:
        if (buf)
                free(buf);
-
-       if (!rw->retry)
-               rw->done++;
 }
 
 static struct recovery_work *suspended_recovery_work;
@@ -1466,6 +1470,9 @@ int is_recoverying_oid(uint64_t oid)
        if (before(rw->epoch, sys->epoch))
                return 1;
 
+       if (rw->state == RW_INIT)
+               return 1;
+
        fd = ob_open(sys->epoch, oid, 0, &ret);
        if (fd != -1) {
                dprintf("the object %" PRIx64 " is already recoverd\n", oid);
@@ -1489,7 +1496,14 @@ int is_recoverying_oid(uint64_t oid)
 static void recover_done(struct work *work, int idx)
 {
        struct recovery_work *rw = container_of(work, struct recovery_work, 
work);
-       uint64_t oid = rw->oids[rw->done];
+       uint64_t oid;
+
+       if (rw->state == RW_INIT)
+               rw->state = RW_RUN;
+       else if (!rw->retry)
+               rw->done++;
+
+       oid = rw->oids[rw->done];
 
        if (rw->retry && list_empty(&recovery_work_list)) {
                rw->retry = 0;
@@ -1729,6 +1743,7 @@ int start_recovery(uint32_t epoch)
        if (!rw)
                return -1;
 
+       rw->state = RW_INIT;
        rw->oids = malloc(1 << 20); /* FIXME */
        rw->epoch = epoch;
        rw->count = 0;
-- 
1.5.6.5

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

Reply via email to