From: Liu Yuan <[email protected]>

We need this to decouple the sheep from kv-store.

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/store.c |   57 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/sheep/store.c b/sheep/store.c
index d4a231d..ac7f588 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -57,6 +57,14 @@ static int obj_cmp(const void *oid1, const void *oid2)
        return 0;
 }
 
+static void get_store_dir(struct strbuf *buf, int epoch)
+{
+       if (!strcmp(store.driver_name, "simple"))
+               strbuf_addf(buf, "%s%08u", obj_path, epoch);
+       else if (!strcmp(store.driver_name, "farm"))
+               strbuf_addf(buf, "%s", obj_path);
+}
+
 int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
 {
        struct statvfs vs;
@@ -65,22 +73,27 @@ int stat_sheep(uint64_t *store_size, uint64_t *store_free, 
uint32_t epoch)
        struct dirent *d;
        uint64_t used = 0;
        struct stat s;
-       char path[1024], store_dir[1024];
+       char path[1024];
+       struct strbuf store_dir = STRBUF_INIT;
 
        ret = statvfs(mnt_path, &vs);
-       if (ret)
-               return SD_RES_EIO;
+       if (ret) {
+               ret = SD_RES_EIO;
+               goto out;
+       }
 
-       snprintf(store_dir, sizeof(store_dir), "%s%08u", obj_path, epoch);
-       dir = opendir(store_dir);
-       if (!dir)
-               return SD_RES_EIO;
+       get_store_dir(&store_dir, epoch);
+       dir = opendir(store_dir.buf);
+       if (!dir) {
+               ret = SD_RES_EIO;
+               goto out;
+       }
 
        while ((d = readdir(dir))) {
                if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
                        continue;
 
-               snprintf(path, sizeof(path), "%s/%s", store_dir, d->d_name);
+               snprintf(path, sizeof(path), "%s/%s", store_dir.buf, d->d_name);
 
                ret = stat(path, &s);
                if (ret)
@@ -90,11 +103,13 @@ int stat_sheep(uint64_t *store_size, uint64_t *store_free, 
uint32_t epoch)
        }
 
        closedir(dir);
+       ret = SD_RES_SUCCESS;
 
        *store_size = (uint64_t)vs.f_frsize * vs.f_bfree + used;
        *store_free = (uint64_t)vs.f_frsize * vs.f_bfree;
-
-       return SD_RES_SUCCESS;
+out:
+       strbuf_release(&store_dir);
+       return ret;
 }
 
 static int merge_objlist(uint64_t *list1, int nr_list1,
@@ -398,11 +413,12 @@ out:
 
 int update_epoch_store(uint32_t epoch)
 {
-       char new[1024];
-
-       snprintf(new, sizeof(new), "%s%08u/", obj_path, epoch);
-       mkdir(new, def_dmode);
+       if (!strcmp(store.driver_name, "simple")) {
+               char new[1024];
 
+               snprintf(new, sizeof(new), "%s%08u/", obj_path, epoch);
+               mkdir(new, def_dmode);
+       }
        return 0;
 }
 
@@ -565,16 +581,19 @@ static int do_write_obj(struct siocb *iocb, struct 
sd_obj_req *req, uint32_t epo
        iocb->length = hdr->data_length;
        iocb->offset = hdr->offset;
        if (is_vdi_obj(oid)) {
-               char path[1024];
+               struct strbuf buf = STRBUF_INIT;
 
-               snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
-                        epoch, oid);
+               get_store_dir(&buf, epoch);
+               strbuf_addf(&buf, "%016" PRIx64, oid);
                jd = jrnl_begin(data, hdr->data_length,
-                                  hdr->offset, path, jrnl_path);
-               if (!jd)
+                                  hdr->offset, buf.buf, jrnl_path);
+               if (!jd) {
+                       strbuf_release(&buf);
                        return SD_RES_EIO;
+               }
                ret = store.write(oid, iocb);
                jrnl_end(jd);
+               strbuf_release(&buf);
        } else
                ret = store.write(oid, iocb);
 
-- 
1.7.8.rc3

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

Reply via email to