[stgt] [PATCH] sheepdog: optimize reloading of inode

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Sun Sep 28 14:48:05 CEST 2014


Current sheepdog driver reloads inode when in both cases of snapshot
and invalidateion with iSCSI multipath. In the first case, reloading
whole inode isn't required. This patch reduces the overhead produced
by whole reloading in the case of snapshot.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 usr/bs_sheepdog.c | 47 +++++++++++++++++++++++++++++++++++------------
 1 file changed, 35 insertions(+), 12 deletions(-)

diff --git a/usr/bs_sheepdog.c b/usr/bs_sheepdog.c
index b9b7067..9376946 100644
--- a/usr/bs_sheepdog.c
+++ b/usr/bs_sheepdog.c
@@ -642,22 +642,37 @@ static int read_object(struct sheepdog_access_info *ai, char *buf, uint64_t oid,
 		       int copies, unsigned int datalen, uint64_t offset,
 		       int *need_reload);
 
-static int reload_inode(struct sheepdog_access_info *ai)
+static int reload_inode(struct sheepdog_access_info *ai, int is_snapshot)
 {
 	int ret, need_reload = 0;
 	char tag[SD_MAX_VDI_TAG_LEN];
 	uint32_t vid;
 
-	memset(tag, 0, sizeof(tag));
+	if (is_snapshot) {
+		memset(tag, 0, sizeof(tag));
 
-	ret = find_vdi_name(ai, ai->inode.name, CURRENT_VDI_ID, tag, &vid, 0);
-	if (ret)
-		return -1;
+		ret = find_vdi_name(ai, ai->inode.name, CURRENT_VDI_ID, tag,
+				    &vid, 0);
+		if (ret)
+			return -1;
 
-	ret = read_object(ai, (char *)&ai->inode, vid_to_vdi_oid(vid),
-			  ai->inode.nr_copies, SD_INODE_SIZE, 0, &need_reload);
-	if (ret)
-		return -1;
+		ret = read_object(ai, (char *)&ai->inode, vid_to_vdi_oid(vid),
+				  ai->inode.nr_copies,
+				  offsetof(struct sheepdog_inode, data_vdi_id),
+				  0, &need_reload);
+		if (ret)
+			return -1;
+	} else {
+		ret = read_object(ai, (char *)&ai->inode,
+				  vid_to_vdi_oid(ai->inode.vdi_id),
+				  ai->inode.nr_copies, SD_INODE_SIZE, 0,
+				  &need_reload);
+		if (ret)
+			return -1;
+	}
+
+	ai->min_dirty_data_idx = UINT32_MAX;
+	ai->max_dirty_data_idx = 0;
 
 	return 0;
 }
@@ -709,6 +724,8 @@ static int read_write_object(struct sheepdog_access_info *ai, char *buf,
 		return 0;
 	case SD_RES_INODE_INVALIDATED:
 		dprintf("inode object is invalidated\n");
+		*need_reload = 2;
+		return 0;
 	case SD_RES_READONLY:
 		*need_reload = 1;
 		return 0;
@@ -784,7 +801,7 @@ static int update_inode(struct sheepdog_access_info *ai)
 	goto update;
 
 reload:
-	reload_inode(ai);
+	reload_inode(ai, 0);
 	need_reload_inode = 0;
 
 update:
@@ -853,7 +870,7 @@ reload_in_read_path:
 	pthread_rwlock_unlock(&ai->inode_lock); /* unlock current read lock */
 
 	pthread_rwlock_wrlock(&ai->inode_lock);
-	ret = reload_inode(ai);
+	ret = reload_inode(ai, 0);
 	if (ret) {
 		eprintf("failed to reload in read path\n");
 		goto out;
@@ -911,7 +928,13 @@ retry:
 					   old_oid, flags, &need_reload_inode);
 			if (!ret) {
 				if (need_reload_inode) {
-					ret = reload_inode(ai);
+					/* If need_reload_inode is 1,
+					 * snapshot was created.
+					 * If it is 2, inode object is
+					 * invalidated
+					 */
+					ret = reload_inode(ai,
+						   need_reload_inode == 1);
 					if (!ret)
 						goto retry;
 				}
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list