[sheepdog] [PATCH 1/3] bs_sheepdog.c: partial update of inode object for optimizing COW
Hitoshi Mitake
mitake.hitoshi at gmail.com
Sun Oct 6 17:27:50 CEST 2013
Current bs_sheepdog.c updates whole inode object (metadata of
sheepdog) when COW occurs. This patch reduces the traffic of update.
Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
usr/bs_sheepdog.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/usr/bs_sheepdog.c b/usr/bs_sheepdog.c
index fcd2557..87c7986 100644
--- a/usr/bs_sheepdog.c
+++ b/usr/bs_sheepdog.c
@@ -604,14 +604,28 @@ static int update_inode(struct sheepdog_access_info *ai)
{
int ret = 0;
uint64_t oid = vid_to_vdi_oid(ai->inode.vdi_id);
+ uint32_t min, max, offset, data_len;
- /* todo: optimization with partial update of inode object */
- ret = write_object(ai->fd, (char *)&ai->inode, oid,
- ai->inode.nr_copies, SD_INODE_SIZE, 0,
+ min = ai->min_dirty_data_idx;
+ max = ai->max_dirty_data_idx;
+
+ if (max < min)
+ goto end;
+
+ offset = sizeof(ai->inode) - sizeof(ai->inode.data_vdi_id) +
+ min * sizeof(ai->inode.data_vdi_id[0]);
+ data_len = (max - min + 1) * sizeof(ai->inode.data_vdi_id[0]);
+
+ ret = write_object(ai->fd, (char *)&ai->inode + offset, oid,
+ ai->inode.nr_copies, data_len, offset,
0, 0, 0, NULL);
if (ret < 0)
eprintf("sync inode failed\n");
+end:
+ ai->min_dirty_data_idx = UINT32_MAX;
+ ai->max_dirty_data_idx = 0;
+
return ret;
}
--
1.8.1.2
More information about the sheepdog
mailing list