[sheepdog] [PATCH] add new function to fulfill parallelly dicarding
Robin Dong
robin.k.dong at gmail.com
Tue Dec 17 13:02:02 CET 2013
The new function sd_inode_write_vid_only will only write 'vid' in 'idx' for
non-hyper-volume vid. For hyper-volume vdi, we write the 'vid' in function
sd_inode_set_vid() only when this 'vid' is exists.
Signed-off-by: Robin Dong <sanbai at taobao.com>
---
include/sheepdog_proto.h | 3 +++
lib/sd_inode.c | 28 ++++++++++++++++++++++++++++
sheep/ops.c | 4 ++--
3 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h
index 6a7ada7..22d6f73 100644
--- a/include/sheepdog_proto.h
+++ b/include/sheepdog_proto.h
@@ -282,6 +282,9 @@ extern void sd_inode_set_vid(write_node_fn writer, read_node_fn reader,
uint32_t vdi_id);
extern int sd_inode_write(write_node_fn writer, struct sd_inode *inode,
int flags, bool create, bool direct);
+extern int sd_inode_write_vid_only(write_node_fn writer, struct sd_inode *inode,
+ uint32_t idx, uint32_t vid, int flags,
+ bool create, bool direct);
extern int sd_inode_write_vid(write_node_fn writer, struct sd_inode *inode,
uint32_t idx, uint32_t vid, uint32_t value,
int flags, bool create, bool direct);
diff --git a/lib/sd_inode.c b/lib/sd_inode.c
index 0043981..fb689d5 100644
--- a/lib/sd_inode.c
+++ b/lib/sd_inode.c
@@ -585,6 +585,15 @@ void sd_inode_set_vid(write_node_fn writer, read_node_fn reader,
ret = search_whole_btree(reader, inode, idx, &path);
if (ret == SD_RES_BTREE_FOUND) {
path.p_ext->vdi_id = vdi_id;
+ /* only write the vdi_id in sd_extent */
+ if (path.p_ext_header)
+ header = path.p_ext_header;
+ writer(vid_to_vdi_oid(inode->vdi_id), &vdi_id,
+ sizeof(vdi_id), (char *)(path.p_ext) -
+ (char *)header +
+ offsetof(struct sd_extent, vdi_id), 0,
+ inode->nr_copies, inode->copy_policy,
+ false, false);
goto out;
} else {
ret = insert_new_node(writer, reader, inode,
@@ -661,6 +670,25 @@ out:
return ret;
}
+/*
+ * Only write the vid for non-hyper-volume vdi.
+ * For hyper-volume, sd_inode_set_vid() have already wrote the vid when
+ * search_whole_btree() return SD_RES_BTREE_FOUND. Therefore, this function
+ * could only be called when vid could be found.
+ */
+int sd_inode_write_vid_only(write_node_fn writer, struct sd_inode *inode,
+ uint32_t idx, uint32_t vid, int flags, bool create,
+ bool direct)
+{
+ int ret = SD_RES_SUCCESS;
+ if (inode->store_policy == 0)
+ ret = writer(vid_to_vdi_oid(vid), &vid, sizeof(vid),
+ SD_INODE_HEADER_SIZE + sizeof(vid) * idx,
+ flags, inode->nr_copies, inode->copy_policy,
+ create, direct);
+ return ret;
+}
+
/* Write the meta-data of inode out */
int sd_inode_write_vid(write_node_fn writer, struct sd_inode *inode,
uint32_t idx, uint32_t vid, uint32_t value,
diff --git a/sheep/ops.c b/sheep/ops.c
index 1e9bc1e..403dfa2 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -842,8 +842,8 @@ static int local_discard_obj(struct request *req)
/* if vid in idx is not exist, we don't need to remove it */
if (tmp_vid) {
INODE_SET_VID(inode, idx, 0);
- ret = sd_inode_write_vid(sheep_bnode_writer, inode, idx, vid,
- 0, 0, false, false);
+ ret = sd_inode_write_vid_only(sheep_bnode_writer, inode, idx,
+ vid, 0, false, false);
if (ret != SD_RES_SUCCESS)
goto out;
if (sd_remove_object(oid) != SD_RES_SUCCESS)
--
1.7.9.5
More information about the sheepdog
mailing list