[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