[Sheepdog] [PATCH v2] sheepdog: implement SD_OP_FLUSH_VDI operation
MORITA Kazutaka
morita.kazutaka at gmail.com
Fri Mar 30 18:17:25 CEST 2012
At Mon, 26 Mar 2012 21:48:22 +0800,
Liu Yuan wrote:
>
> From: Liu Yuan <tailai.ly at taobao.com>
>
> With this operation added, Guest can assure the data of
> reaching the sheepdog cluster storage by sending flush request.
>
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
> block/sheepdog.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 52 insertions(+), 0 deletions(-)
>
> diff --git a/block/sheepdog.c b/block/sheepdog.c
> index 00276f6f..81dbc66 100644
> --- a/block/sheepdog.c
> +++ b/block/sheepdog.c
> @@ -32,9 +32,11 @@
> #define SD_OP_RELEASE_VDI 0x13
> #define SD_OP_GET_VDI_INFO 0x14
> #define SD_OP_READ_VDIS 0x15
> +#define SD_OP_FLUSH_VDI 0x16
>
> #define SD_FLAG_CMD_WRITE 0x01
> #define SD_FLAG_CMD_COW 0x02
> +#define SD_FLAG_CMD_CACHE 0x04
>
> #define SD_RES_SUCCESS 0x00 /* Success */
> #define SD_RES_UNKNOWN 0x01 /* Unknown error */
> @@ -179,6 +181,8 @@ typedef struct SheepdogInode {
> uint32_t data_vdi_id[MAX_DATA_OBJS];
> } SheepdogInode;
>
> +static int cache_enabled;
> +
> /*
> * 64 bit FNV-1a non-zero initial basis
> */
> @@ -900,6 +904,10 @@ static int coroutine_fn add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
> hdr.flags = SD_FLAG_CMD_WRITE | flags;
> }
>
> + if (cache_enabled) {
> + hdr.flags |= SD_FLAG_CMD_CACHE;
> + }
> +
> hdr.oid = oid;
> hdr.cow_oid = old_oid;
> hdr.copies = s->inode.nr_copies;
> @@ -965,6 +973,11 @@ static int read_write_object(int fd, char *buf, uint64_t oid, int copies,
> rlen = datalen;
> hdr.opcode = SD_OP_READ_OBJ;
> }
> +
> + if (cache_enabled) {
> + hdr.flags |= SD_FLAG_CMD_CACHE;
> + }
> +
> hdr.oid = oid;
> hdr.data_length = datalen;
> hdr.offset = offset;
> @@ -1011,6 +1024,12 @@ static int sd_open(BlockDriverState *bs, const char *filename, int flags)
> QLIST_INIT(&s->outstanding_aio_head);
> s->fd = -1;
>
> + if (flags & BDRV_O_CACHE_WB) {
> + if (!(flags & BDRV_O_NOCACHE)) {
It might be better to ignore BDRV_O_NOCACHE here because:
- When writeback is enabled, we always use a cache. And when
writeback is disabled, we don't use a cache at all. This means
that users cannot specify whether to use a cache.
- I think qemu users expect a better performance if cache=none, which
means BDRV_O_NOCACHE | BDRV_O_CACHE_WB, is specified
- I guess qemu users expect that if BDRV_O_NOCACHE is set, O_DIRECT
is used for file I/Os.
- If we ignore BDRV_O_NOCACHE here, we can use qemu-iotests for
Sheepdog cache tests with the following command:
$ check -sheepdog -nocache
where -nocache means BDRV_O_NOCACHE | BDRV_O_CACHE_WB.
Thanks,
Kazutaka
> + cache_enabled = 1;
> + }
> + }
> +
> memset(vdi, 0, sizeof(vdi));
> memset(tag, 0, sizeof(tag));
> if (parse_vdiname(s, filename, vdi, &snapid, tag) < 0) {
> @@ -1575,6 +1594,38 @@ static coroutine_fn int sd_co_readv(BlockDriverState *bs, int64_t sector_num,
> return acb->ret;
> }
>
> +static int coroutine_fn sd_co_flush_to_disk(BlockDriverState *bs)
> +{
> + BDRVSheepdogState *s = bs->opaque;
> + SheepdogObjReq hdr = { 0 };
> + SheepdogObjRsp *rsp = (SheepdogObjRsp *)&hdr;
> + SheepdogInode *inode = &s->inode;
> + int fd, ret;
> + unsigned int wlen = 0, rlen = 0;
> +
> + fd = connect_to_sdog(s->addr, s->port);
> + if (fd < 0) {
> + return -1;
> + }
> +
> + hdr.opcode = SD_OP_FLUSH_VDI;
> + hdr.oid = vid_to_vdi_oid(inode->vdi_id);
> +
> + ret = do_req(fd, (SheepdogReq *)&hdr, NULL, &wlen, &rlen);
> + closesocket(fd);
> + if (ret) {
> + error_report("failed to send a request to the sheep");
> + return -1;
> + }
> +
> + if (rsp->result != SD_RES_SUCCESS) {
> + error_report("%s", sd_strerror(rsp->result));
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
> {
> BDRVSheepdogState *s = bs->opaque;
> @@ -1904,6 +1955,7 @@ BlockDriver bdrv_sheepdog = {
>
> .bdrv_co_readv = sd_co_readv,
> .bdrv_co_writev = sd_co_writev,
> + .bdrv_co_flush_to_disk = sd_co_flush_to_disk,
>
> .bdrv_snapshot_create = sd_snapshot_create,
> .bdrv_snapshot_goto = sd_snapshot_goto,
> --
> 1.7.8.2
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list