[sheepdog] [PATCH v2 13/21] sheep: get object size correctly
Liu Yuan
namei.unix at gmail.com
Wed Oct 16 07:50:39 CEST 2013
For backend store, the object size is determined by copy_policy.
Also add a helper to get store object size for future use.
Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
dog/common.c | 10 ++++++++++
dog/dog.h | 1 +
dog/vdi.c | 5 +++--
sheep/md.c | 4 ++--
sheep/ops.c | 2 +-
sheep/plain_store.c | 2 +-
6 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/dog/common.c b/dog/common.c
index 0685be6..a2fb945 100644
--- a/dog/common.c
+++ b/dog/common.c
@@ -12,6 +12,7 @@
#include "dog.h"
#include "sha1.h"
#include "sockfd_cache.h"
+#include "fec.h"
static char *strnumber_raw(uint64_t _size, bool raw)
{
@@ -328,3 +329,12 @@ void show_progress(uint64_t done, uint64_t total, bool raw)
free(buf);
}
+
+size_t get_store_objsize(uint8_t copy_policy, uint64_t oid)
+{
+ if (is_vdi_obj(oid))
+ return SD_INODE_SIZE;
+ if (copy_policy != 0)
+ return SD_EC_OBJECT_SIZE;
+ return get_objsize(oid);
+}
diff --git a/dog/dog.h b/dog/dog.h
index e8b7f0f..cfc9d54 100644
--- a/dog/dog.h
+++ b/dog/dog.h
@@ -82,6 +82,7 @@ int do_vdi_create(const char *vdiname, int64_t vdi_size,
uint8_t nr_copies, uint8_t copy_policy);
int do_vdi_check(const struct sd_inode *inode);
void show_progress(uint64_t done, uint64_t total, bool raw);
+size_t get_store_objsize(uint8_t copy_policy, uint64_t oid);
extern struct command vdi_command;
extern struct command node_command;
diff --git a/dog/vdi.c b/dog/vdi.c
index 5324f97..6eec5b4 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -877,11 +877,11 @@ static int vdi_object(int argc, char **argv)
return EXIT_MISSING;
}
- size = info.copy_policy ? SD_EC_OBJECT_SIZE : SD_DATA_OBJ_SIZE;
if (idx == ~0) {
printf("Looking for the inode object 0x%" PRIx32 " with %d nodes\n\n",
vid, sd_nodes_nr);
- parse_objs(vid_to_vdi_oid(vid), do_print_obj, NULL, size);
+ parse_objs(vid_to_vdi_oid(vid), do_print_obj, NULL,
+ SD_INODE_SIZE);
} else {
struct obj_info_filler_info oid_info = {0};
@@ -893,6 +893,7 @@ static int vdi_object(int argc, char **argv)
exit(EXIT_FAILURE);
}
+ size = info.copy_policy ? SD_EC_OBJECT_SIZE : SD_DATA_OBJ_SIZE;
parse_objs(vid_to_vdi_oid(vid), obj_info_filler, &oid_info,
size);
diff --git a/sheep/md.c b/sheep/md.c
index 9fc1b6e..e6d175c 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -153,7 +153,7 @@ static int get_total_object_size(uint64_t oid, const char *wd, uint32_t epoch,
if (stat(path, &s) == 0)
*t += s.st_blocks * SECTOR_SIZE;
else
- *t += get_objsize(oid);
+ *t += get_store_objsize(oid);
return SD_RES_SUCCESS;
}
@@ -486,7 +486,7 @@ static int md_move_object(uint64_t oid, const char *old, const char *new)
{
struct strbuf buf = STRBUF_INIT;
int fd, ret = -1;
- size_t sz = get_objsize(oid);
+ size_t sz = get_store_objsize(oid);
fd = open(old, O_RDONLY);
if (fd < 0) {
diff --git a/sheep/ops.c b/sheep/ops.c
index 72ccefb..d96ab43 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -976,7 +976,7 @@ static int peer_create_and_write_obj(struct request *req)
memset(&iocb, 0, sizeof(iocb));
iocb.epoch = epoch;
- iocb.length = get_objsize(oid);
+ iocb.length = get_store_objsize(oid);
iocb.ec_index = hdr->obj.ec_index;
if (hdr->flags & SD_FLAG_CMD_COW) {
sd_debug("%" PRIx64 ", %" PRIx64, oid, hdr->obj.cow_oid);
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index 6b437e2..102285b 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -621,7 +621,7 @@ int default_get_hash(uint64_t oid, uint32_t epoch, uint8_t *sha1)
}
}
- length = get_objsize(oid);
+ length = get_store_objsize(oid);
buf = valloc(length);
if (buf == NULL)
return SD_RES_NO_MEM;
--
1.7.9.5
More information about the sheepdog
mailing list