From: Liu Yuan <tailai...@taobao.com>

Signed-off-by: Liu Yuan <tailai...@taobao.com>
---
 sheep/md.c          |   51 +++++++++++++++++++++++++++++++++++++++++----------
 sheep/plain_store.c |    3 +--
 sheep/sheep_priv.h  |    1 +
 3 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/sheep/md.c b/sheep/md.c
index 5a55835..ed474c8 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -389,32 +389,49 @@ static inline bool md_access(char *path)
        return true;
 }
 
-static int check_and_move(uint64_t oid, char *path)
+static int get_old_new_path(uint64_t oid, uint32_t epoch, char *path,
+                           char *old, char *new)
 {
-       char old[PATH_MAX], new[PATH_MAX];
+       if (!epoch) {
+               snprintf(old, PATH_MAX, "%s/%016" PRIx64, path, oid);
+               snprintf(new, PATH_MAX, "%s/%016" PRIx64,
+                        get_object_path_nolock(oid), oid);
+       } else {
+               snprintf(old, PATH_MAX, "%s/.stale/%016"PRIx64".%"PRIu32, path,
+                        oid, epoch);
+               snprintf(new, PATH_MAX, "%s/.stale/%016"PRIx64".%"PRIu32,
+                        get_object_path_nolock(oid), oid, epoch);
+       }
 
-       snprintf(old, PATH_MAX, "%s/%016" PRIx64, path, oid);
        if (!md_access(old))
+               return -1;
+
+       return 0;
+}
+
+static int check_and_move(uint64_t oid, uint32_t epoch, char *path)
+{
+       char old[PATH_MAX], new[PATH_MAX];
+
+       if (get_old_new_path(oid, epoch, path, old, new) < 0)
                return SD_RES_EIO;
 
-       snprintf(new, PATH_MAX, "%s/%016" PRIx64, get_object_path_nolock(oid),
-                oid);
        if (rename(old, new) < 0) {
-               sd_eprintf("%"PRIx64 " failed, %m", oid);
+               sd_eprintf("old %s, new %s: %m", old, new);
                return SD_RES_EIO;
        }
 
-       sd_dprintf("%"PRIx64" from %s to %s", oid, old, new);
+       sd_dprintf("from %s to %s", old, new);
        return SD_RES_SUCCESS;
 }
 
-static int scan_wd(uint64_t oid)
+static int scan_wd(uint64_t oid, uint32_t epoch)
 {
        int i, ret = SD_RES_EIO;
 
        pthread_rwlock_rdlock(&md_lock);
        for (i = 0; i < md_nr_disks; i++) {
-               ret = check_and_move(oid, md_disks[i].path);
+               ret = check_and_move(oid, epoch, md_disks[i].path);
                if (ret == SD_RES_SUCCESS)
                        break;
        }
@@ -434,8 +451,22 @@ bool md_exist(uint64_t oid)
         * track to locate the objects for multiple disk failure. Simply do
         * hard iteration simplify the code a lot.
         */
-       if (scan_wd(oid) == SD_RES_SUCCESS)
+       if (scan_wd(oid, 0) == SD_RES_SUCCESS)
                return true;
 
        return false;
 }
+
+int md_get_stale_path(uint64_t oid, uint32_t epoch, char *path)
+{
+       snprintf(path, PATH_MAX, "%s/.stale/%016"PRIx64".%"PRIu32,
+               get_object_path(oid), oid, epoch);
+       if (md_access(path))
+               return SD_RES_SUCCESS;
+
+       assert(epoch);
+       if (scan_wd(oid, epoch) == SD_RES_SUCCESS)
+               return SD_RES_SUCCESS;
+
+       return SD_RES_NO_OBJ;
+}
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index 6b41238..1352dc4 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -49,8 +49,7 @@ static int get_tmp_obj_path(uint64_t oid, char *path)
 
 static int get_stale_obj_path(uint64_t oid, uint32_t epoch, char *path)
 {
-       return snprintf(path, PATH_MAX, "%s/.stale/%016"PRIx64".%"PRIu32,
-                       get_object_path(oid), oid, epoch);
+       return md_get_stale_path(oid, epoch, path);
 }
 
 bool default_exist(uint64_t oid)
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index d395a5f..652fd3a 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -422,5 +422,6 @@ uint64_t md_init_space(void);
 char *get_object_path(uint64_t oid);
 int md_handle_eio(char *);
 bool md_exist(uint64_t oid);
+int md_get_stale_path(uint64_t oid, uint32_t epoch, char *path);
 
 #endif
-- 
1.7.9.5

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

Reply via email to