[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