For fill_object_tree() and delete_one() to support hyper volume by using 
traverse_btree()

Signed-off-by: Robin Dong <[email protected]>
---
 dog/cluster.c |   33 ++++++++++++++++++++-----
 sheep/vdi.c   |   72 +++++++++++++++++++++++++++++++++++++++++++-------------
 2 files changed, 81 insertions(+), 24 deletions(-)

diff --git a/dog/cluster.c b/dog/cluster.c
index 78586a5..ecc4ec2 100644
--- a/dog/cluster.c
+++ b/dog/cluster.c
@@ -241,13 +241,29 @@ out:
        return ret;
 }
 
+static void fill_cb(void *data, enum btree_node_type type, void *arg)
+{
+       struct sd_extent *ext;
+       struct sd_inode *inode = (struct sd_inode *)arg;
+       uint64_t oid;
+
+       if (type == BTREE_EXT) {
+               ext = (struct sd_extent *)data;
+               if (ext->vdi_id) {
+                       oid = vid_to_data_oid(ext->vdi_id, ext->idx);
+                       object_tree_insert(oid, inode->nr_copies,
+                                          inode->copy_policy);
+               }
+       }
+}
+
 static void fill_object_tree(uint32_t vid, const char *name, const char *tag,
                             uint32_t snapid, uint32_t flags,
                             const struct sd_inode *i, void *data)
 {
        uint64_t vdi_oid = vid_to_vdi_oid(vid), vmstate_oid;
        uint32_t vdi_id;
-       int nr_objs, nr_vmstate_object;
+       uint32_t nr_objs, nr_vmstate_object;
 
        /* ignore active vdi */
        if (!vdi_is_snapshot(i))
@@ -257,18 +273,21 @@ static void fill_object_tree(uint32_t vid, const char 
*name, const char *tag,
        object_tree_insert(vdi_oid, i->nr_copies, i->copy_policy);
 
        /* fill data object id */
-       nr_objs = count_data_objs(i);
-       for (uint64_t idx = 0; idx < nr_objs; idx++) {
-               vdi_id = INODE_GET_VID(i, idx);
-               if (vdi_id) {
+       if (i->store_policy == 0) {
+               nr_objs = count_data_objs(i);
+               for (uint32_t idx = 0; idx < nr_objs; idx++) {
+                       vdi_id = INODE_GET_VID(i, idx);
+                       if (!vdi_id)
+                               continue;
                        uint64_t oid = vid_to_data_oid(vdi_id, idx);
                        object_tree_insert(oid, i->nr_copies, i->copy_policy);
                }
-       }
+       } else
+               traverse_btree(dog_bnode_reader, i, fill_cb, &i);
 
        /* fill vmstate object id */
        nr_vmstate_object = DIV_ROUND_UP(i->vm_state_size, SD_DATA_OBJ_SIZE);
-       for (int idx = 0; idx < nr_vmstate_object; idx++) {
+       for (uint32_t idx = 0; idx < nr_vmstate_object; idx++) {
                vmstate_oid = vid_to_vmstate_oid(vid, idx);
                object_tree_insert(vmstate_oid, i->nr_copies, i->copy_policy);
        }
diff --git a/sheep/vdi.c b/sheep/vdi.c
index 3d4af76..77308fe 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -834,11 +834,43 @@ static int notify_vdi_deletion(uint32_t vdi_id)
        return ret;
 }
 
+struct delete_arg {
+       const struct sd_inode *inode;
+       uint32_t *nr_deleted;
+};
+
+static void delete_cb(void *data, enum btree_node_type type, void *arg)
+{
+       struct sd_extent *ext;
+       struct delete_arg *darg = (struct delete_arg *)arg;
+       uint64_t oid;
+       int ret;
+
+       if (type != BTREE_EXT)
+               return;
+
+       ext = (struct sd_extent *)data;
+       if (ext->vdi_id) {
+               oid = vid_to_data_oid(ext->vdi_id, ext->idx);
+               if (ext->vdi_id != darg->inode->vdi_id)
+                       sd_debug("object %" PRIx64 " is base's data, would"
+                                " not be deleted.", oid);
+               else {
+                       ret = remove_object(oid);
+                       if (ret != SD_RES_SUCCESS)
+                               sd_err("remove object %" PRIx64 " fail, %d",
+                                      oid, ret);
+                       (*(darg->nr_deleted))++;
+               }
+       }
+}
+
 static void delete_one(struct work *work)
 {
        struct deletion_work *dw = container_of(work, struct deletion_work, 
work);
        uint32_t vdi_id = *(dw->buf + dw->count - dw->done - 1);
-       int ret, i, nr_deleted, nr_objs;
+       int ret;
+       uint32_t i, nr_deleted, nr_objs;
        struct sd_inode *inode = NULL;
 
        sd_debug("%d %d, %16x", dw->done, dw->count, vdi_id);
@@ -860,27 +892,33 @@ static void delete_one(struct work *work)
        if (inode->vdi_size == 0 && vdi_is_deleted(inode))
                goto out;
 
-       nr_objs = count_data_objs(inode);
-       for (nr_deleted = 0, i = 0; i < nr_objs; i++) {
-               uint64_t oid;
-               uint32_t vid = INODE_GET_VID(inode, i);
+       if (inode->store_policy == 0) {
+               nr_objs = count_data_objs(inode);
+               for (nr_deleted = 0, i = 0; i < nr_objs; i++) {
+                       uint64_t oid;
+                       uint32_t vid = INODE_GET_VID(inode, i);
 
-               if (!vid)
-                       continue;
+                       if (!vid)
+                               continue;
 
-               oid = vid_to_data_oid(vid, i);
+                       oid = vid_to_data_oid(vid, i);
 
-               if (vid != inode->vdi_id) {
-                       sd_debug("object %" PRIx64 " is base's data, would"
-                                " not be deleted.", oid);
-                       continue;
-               }
+                       if (vid != inode->vdi_id) {
+                               sd_debug("object %" PRIx64 " is base's data, "
+                                        "would not be deleted.", oid);
+                               continue;
+                       }
 
-               ret = remove_object(oid);
-               if (ret != SD_RES_SUCCESS)
-                       sd_err("remove object %" PRIx64 " fail, %d", oid, ret);
+                       ret = remove_object(oid);
+                       if (ret != SD_RES_SUCCESS)
+                               sd_err("remove object %" PRIx64 " fail, %d",
+                                      oid, ret);
 
-               nr_deleted++;
+                       nr_deleted++;
+               }
+       } else {
+               struct delete_arg arg = {inode, &nr_deleted};
+               traverse_btree(sheep_bnode_reader, inode, delete_cb, &arg);
        }
 
        if (vdi_is_deleted(inode))
-- 
1.7.1

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

Reply via email to