All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Liu Yuan <namei.unix@gmail.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	sheepdog@lists.wpkg.org, qemu-devel@nongnu.org,
	Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 2/2] sheepdog: support user-defined redundancy option
Date: Tue, 29 Oct 2013 21:40:05 +0100	[thread overview]
Message-ID: <20131029204005.GF2948@irqsave.net> (raw)
In-Reply-To: <1383035152-14924-3-git-send-email-namei.unix@gmail.com>

Le Tuesday 29 Oct 2013 à 16:25:52 (+0800), Liu Yuan a écrit :
> Sheepdog support two kinds of redundancy, full replication and erasure coding.
> 
> # create a fully replicated vdi with x copies
>  -o redundancy=x (1 <= x <= SD_MAX_COPIES)
> 
> # create a erasure coded vdi with x data strips and y parity strips
>  -o redundancy=x:y (x must be one of {2,4,8,16} and 1 <= y < SD_EC_MAX_STRIP)
> 
> E.g, to convert a vdi into sheepdog vdi 'test' with 8:3 erasure coding scheme
> 
> $ qemu-img convert -o redundancy=8:3 linux-0.2.img sheepdog:test
> 
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Liu Yuan <namei.unix@gmail.com>
> ---
>  block/sheepdog.c          |   78 ++++++++++++++++++++++++++++++++++++++++++++-
>  include/block/block_int.h |    1 +
>  2 files changed, 78 insertions(+), 1 deletion(-)
> 
> diff --git a/block/sheepdog.c b/block/sheepdog.c
> index e66d2f8..bd7cfd6 100644
> --- a/block/sheepdog.c
> +++ b/block/sheepdog.c
> @@ -91,6 +91,14 @@
>  #define SD_NR_VDIS   (1U << 24)
>  #define SD_DATA_OBJ_SIZE (UINT64_C(1) << 22)
>  #define SD_MAX_VDI_SIZE (SD_DATA_OBJ_SIZE * MAX_DATA_OBJS)
> +/*
> + * For erasure coding, we use at most SD_EC_MAX_STRIP for data strips and
> + * (SD_EC_MAX_STRIP - 1) for parity strips
> + *
> + * SD_MAX_COPIES is sum of number of dats trips and parity strips.
> + */
> +#define SD_EC_MAX_STRIP 16
> +#define SD_MAX_COPIES (SD_EC_MAX_STRIP * 2 - 1)
>  
>  #define SD_INODE_SIZE (sizeof(SheepdogInode))
>  #define CURRENT_VDI_ID 0
> @@ -1446,6 +1454,65 @@ out:
>      return ret;
>  }
>  
> +static int64_t is_numeric(const char *s)
> +{
> +    char *end;
> +    return strtosz_suffix(s, &end, STRTOSZ_DEFSUFFIX_B);
> +}
> +
> +/*
> + * Sheepdog support two kinds of redundancy, full replication and erasure
> + * coding.
> + *
> + * # create a fully replicated vdi with x copies
> + * -o redundancy=x (1 <= x <= SD_MAX_COPIES)
> + *
> + * # create a erasure coded vdi with x data strips and y parity strips
> + * -o redundancy=x:y (x must be one of {2,4,8,16} and 1 <= y < SD_EC_MAX_STRIP)
> + */
> +static int parse_redundancy(BDRVSheepdogState *s, const char *opt)
> +{
> +    struct SheepdogInode *inode = &s->inode;
> +    const char *n1, *n2;
> +    uint8_t copy, parity;
> +    char p[10];
> +
> +    strncpy(p, opt, sizeof(p));
> +    n1 = strtok(p, ":");
> +    n2 = strtok(NULL, ":");
> +
> +    if ((n1 && !is_numeric(n1)) || (n2 && !is_numeric(n2))) {
> +        return -EINVAL;
> +    }
> +
> +    copy = strtol(n1, NULL, 10);
> +    if (copy > SD_MAX_COPIES) {
> +        return -EINVAL;
> +    }
> +    if (!n2) {
> +        inode->copy_policy = 0;
> +        inode->nr_copies = copy;
> +    }
> +
> +    if (copy != 2 && copy != 4 && copy != 8 && copy != 16) {
> +        return -EINVAL;
> +    }
> +
> +    parity = strtol(n2, NULL, 10);
> +    if (parity >= SD_EC_MAX_STRIP || parity == 0) {
> +        return -EINVAL;
> +    }
> +
> +    /*
> +     * 4 bits for parity and 4 bits for data.
> +     * We have to compress upper data bits because it can't represent 16
> +     */
> +    inode->copy_policy = ((copy / 2) << 4) + parity;
> +    inode->nr_copies = copy + parity;
> +
> +    return 0;
> +}
> +
>  static int sd_create(const char *filename, QEMUOptionParameter *options,
>                       Error **errp)
>  {
> @@ -1486,6 +1553,11 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
>                  ret = -EINVAL;
>                  goto out;
>              }
> +        } else if (!strcmp(options->name, BLOCK_OPT_REDUNDANCY)) {
> +            ret = parse_redundancy(s, options->value.s);
> +            if (ret < 0) {
> +                goto out;
> +            }
>          }
>          options++;
>      }
> @@ -1528,7 +1600,6 @@ static int sd_create(const char *filename, QEMUOptionParameter *options,
>          bdrv_unref(bs);
>      }
>  
> -    /* TODO: allow users to specify copy number */
>      ret = do_sd_create(s, &vid, 0);
>      if (!prealloc || ret) {
>          goto out;
> @@ -2332,6 +2403,11 @@ static QEMUOptionParameter sd_create_options[] = {
>          .type = OPT_STRING,
>          .help = "Preallocation mode (allowed values: off, full)"
>      },
> +    {
> +        .name = BLOCK_OPT_REDUNDANCY,
> +        .type = OPT_STRING,
> +        .help = "Redundancy of the image"
> +    },
>      { NULL }
>  };
>  
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index a48731d..b90862f 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -53,6 +53,7 @@
>  #define BLOCK_OPT_COMPAT_LEVEL      "compat"
>  #define BLOCK_OPT_LAZY_REFCOUNTS    "lazy_refcounts"
>  #define BLOCK_OPT_ADAPTER_TYPE      "adapter_type"
> +#define BLOCK_OPT_REDUNDANCY        "redundancy"
>  
>  typedef struct BdrvTrackedRequest {
>      BlockDriverState *bs;
> -- 
> 1.7.9.5
> 
> 

Hi,

Perhaps it would be better to implement theses options with the new block driver
options mechanism that Kevin implemented.

>From a user perspective it look like this.
  -drive if=virtio,file.driver=quorum,\
    file.children.0.file.filename=1.qcow2,\
    file.children.1.file.filename=2.qcow2,\
    file.children.2.file.filename=3.qcow2,\
    file.vote_threshold=3

I don't know if it would work with protocols but that would uniformize the
options passing style accross multiple block drivers.

I have an under review patch on the list using this mechanism, see:
"[PATCH V9 11/11] quorum: Add quorum_open() and quorum_close()."

Best regards

Benoît

  reply	other threads:[~2013-10-29 20:40 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-10-29  8:25 [Qemu-devel] [PATCH v2 0/2] sheepdog: add user-defined redundancy option Liu Yuan
2013-10-29  8:25 ` [Qemu-devel] [PATCH v2 1/2] sheepdog: refactor do_sd_create() Liu Yuan
2013-10-29 20:34   ` Benoît Canet
2013-10-29  8:25 ` [Qemu-devel] [PATCH v2 2/2] sheepdog: support user-defined redundancy option Liu Yuan
2013-10-29 20:40   ` Benoît Canet [this message]
2013-10-30 19:41   ` [Qemu-devel] [sheepdog] " MORITA Kazutaka
2013-10-31  3:07     ` Liu Yuan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20131029204005.GF2948@irqsave.net \
    --to=benoit.canet@irqsave.net \
    --cc=kwolf@redhat.com \
    --cc=namei.unix@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sheepdog@lists.wpkg.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.