[sheepdog] [PATCH stable-0.6 1/3] sheep: flush cache for snapshot creation

Hitoshi Mitake mitake.hitoshi at gmail.com
Sun Jul 14 18:35:14 CEST 2013


From: Liu Yuan <namei.unix at gmail.com>

This fixes a panic for such case with object cache enabled:

1 VM is running and take a live snapshot by qemu-img or collie
2 after snapshoting, there are some dirty objects in the cache
3 sheep will try to push these dirty objects but sheep gateway return READONLY
4 sheep gat paniced because pusher will assume it never fails

Signed-off-by: Liu Yuan <namei.unix at gmail.com>
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/vdi.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/sheep/vdi.c b/sheep/vdi.c
index ff16a07..096244a 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -492,6 +492,20 @@ static int notify_vdi_add(uint32_t vdi_id, uint32_t nr_copies, uint32_t old_vid)
 	return ret;
 }
 
+static void vdi_flush(uint32_t vid)
+{
+	struct sd_req hdr;
+	int ret;
+
+	sd_init_req(&hdr, SD_OP_FLUSH_VDI);
+	hdr.obj.oid = vid_to_vdi_oid(vid);
+
+	ret = exec_local_req(&hdr, NULL);
+	if (ret != SD_RES_SUCCESS)
+		sd_eprintf("fail to flush vdi %" PRIx32 ", %s", vid,
+			   sd_strerror(ret));
+}
+
 /*
  * There are 3 create operation in SD:
  * 1. fresh create (expect NO_VDI returned from vdi_lookup)
@@ -512,6 +526,8 @@ int vdi_create(struct vdi_iocb *iocb, uint32_t *new_vid)
 	case SD_RES_SUCCESS:
 		if (!iocb->create_snapshot)
 			return SD_RES_VDI_EXIST;
+		if (sys->enable_object_cache)
+			vdi_flush(iocb->base_vid);
 		break;
 	case SD_RES_NO_VDI:
 		if (iocb->create_snapshot)
-- 
1.7.5.1




More information about the sheepdog mailing list