* [Qemu-devel] [PATCH v3 0/2] add read-pattern for block qourum @ 2014-07-15 6:34 Liu Yuan 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support Liu Yuan 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum Liu Yuan 0 siblings, 2 replies; 8+ messages in thread From: Liu Yuan @ 2014-07-15 6:34 UTC (permalink / raw) To: qemu-devel v3: - separate patch into two, one for quorum and one for qapi for easier review - add enumeration for quorum read pattern - remove unrelated blank line fix from this patch set v2: - rename single as 'fifo' - rename read_all_children as read_quorum_children - fix quorum_aio_finalize() for fifo pattern This patch adds single read pattern to quorum driver and quorum vote is default pattern. For now we do a quorum vote on all the reads, it is designed for unreliable underlying storage such as non-redundant NFS to make sure data integrity at the cost of the read performance. For some use cases as following: VM -------------- | | v v A B Both A and B has hardware raid storage to justify the data integrity on its own. So it would help performance if we do a single read instead of on all the nodes. Further, if we run VM on either of the storage node, we can make a local read request for better performance. This patch generalize the above 2 nodes case in the N nodes. That is, vm -> write to all the N nodes, read just one of them. If single read fails, we try to read next node in FIFO order specified by the startup command. The 2 nodes case is very similar to DRBD[1] though lack of auto-sync functionality in the single device/node failure for now. But compared with DRBD we still have some advantages over it: - Suppose we have 20 VMs running on one(assume A) of 2 nodes' DRBD backed storage. And if A crashes, we need to restart all the VMs on node B. But for practice case, we can't because B might not have enough resources to setup 20 VMs at once. So if we run our 20 VMs with quorum driver, and scatter the replicated images over the data center, we can very likely restart 20 VMs without any resource problem. After all, I think we can build a more powerful replicated image functionality on quorum and block jobs(block mirror) to meet various High Availibility needs. E.g, Enable single read pattern on 2 children, -drive driver=quorum,children.0.file.filename=0.qcow2,\ children.1.file.filename=1.qcow2,read-pattern=single,vote-threshold=1 [1] http://en.wikipedia.org/wiki/Distributed_Replicated_Block_Device Liu Yuan (2): block/quorum: add simple read pattern support qapi: add read-pattern support for quorum block/quorum.c | 181 +++++++++++++++++++++++++++++++++++++-------------- qapi/block-core.json | 19 +++++- 2 files changed, 149 insertions(+), 51 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support 2014-07-15 6:34 [Qemu-devel] [PATCH v3 0/2] add read-pattern for block qourum Liu Yuan @ 2014-07-15 6:34 ` Liu Yuan 2014-07-15 12:14 ` Eric Blake 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum Liu Yuan 1 sibling, 1 reply; 8+ messages in thread From: Liu Yuan @ 2014-07-15 6:34 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, Benoit Canet, Stefan Hajnoczi This patch adds single read pattern to quorum driver and quorum vote is default pattern. For now we do a quorum vote on all the reads, it is designed for unreliable underlying storage such as non-redundant NFS to make sure data integrity at the cost of the read performance. For some use cases as following: VM -------------- | | v v A B Both A and B has hardware raid storage to justify the data integrity on its own. So it would help performance if we do a single read instead of on all the nodes. Further, if we run VM on either of the storage node, we can make a local read request for better performance. This patch generalize the above 2 nodes case in the N nodes. That is, vm -> write to all the N nodes, read just one of them. If single read fails, we try to read next node in FIFO order specified by the startup command. The 2 nodes case is very similar to DRBD[1] though lack of auto-sync functionality in the single device/node failure for now. But compared with DRBD we still have some advantages over it: - Suppose we have 20 VMs running on one(assume A) of 2 nodes' DRBD backed storage. And if A crashes, we need to restart all the VMs on node B. But for practice case, we can't because B might not have enough resources to setup 20 VMs at once. So if we run our 20 VMs with quorum driver, and scatter the replicated images over the data center, we can very likely restart 20 VMs without any resource problem. After all, I think we can build a more powerful replicated image functionality on quorum and block jobs(block mirror) to meet various High Availibility needs. E.g, Enable single read pattern on 2 children, -drive driver=quorum,children.0.file.filename=0.qcow2,\ children.1.file.filename=1.qcow2,read-pattern=single,vote-threshold=1 [1] http://en.wikipedia.org/wiki/Distributed_Replicated_Block_Device Cc: Benoit Canet <benoit@irqsave.net> Cc: Kevin Wolf <kwolf@redhat.com> Cc: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Liu Yuan <namei.unix@gmail.com> --- block/quorum.c | 181 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 131 insertions(+), 50 deletions(-) diff --git a/block/quorum.c b/block/quorum.c index d5ee9c0..1443fc5 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -24,6 +24,7 @@ #define QUORUM_OPT_VOTE_THRESHOLD "vote-threshold" #define QUORUM_OPT_BLKVERIFY "blkverify" #define QUORUM_OPT_REWRITE "rewrite-corrupted" +#define QUORUM_OPT_READ_PATTERN "read-pattern" /* This union holds a vote hash value */ typedef union QuorumVoteValue { @@ -74,6 +75,16 @@ typedef struct BDRVQuorumState { bool rewrite_corrupted;/* true if the driver must rewrite-on-read corrupted * block if Quorum is reached. */ + +#define READ_PATTERN_QUORUM 0 /* default */ +#define READ_PATTERN_FIFO 1 + int read_pattern; /* fifo: read a single child and try first one + * first. If error, try next child in an + * FIFO order specifed by command line. + * Return error if no child read succeeds. + * quorum: read all the children and do a quorum + * vote on reads. + */ } BDRVQuorumState; typedef struct QuorumAIOCB QuorumAIOCB; @@ -117,6 +128,7 @@ struct QuorumAIOCB { bool is_read; int vote_ret; + int child_iter; /* which child to read in fifo pattern */ }; static bool quorum_vote(QuorumAIOCB *acb); @@ -154,8 +166,10 @@ static void quorum_aio_finalize(QuorumAIOCB *acb) if (acb->is_read) { for (i = 0; i < s->num_children; i++) { - qemu_vfree(acb->qcrs[i].buf); - qemu_iovec_destroy(&acb->qcrs[i].qiov); + if (i <= acb->child_iter) { + qemu_vfree(acb->qcrs[i].buf); + qemu_iovec_destroy(&acb->qcrs[i].qiov); + } } } @@ -256,6 +270,21 @@ static void quorum_rewrite_aio_cb(void *opaque, int ret) quorum_aio_finalize(acb); } +static BlockDriverAIOCB *read_fifo_child(QuorumAIOCB *acb); + +static void quorum_copy_qiov(QEMUIOVector *dest, QEMUIOVector *source) +{ + int i; + assert(dest->niov == source->niov); + assert(dest->size == source->size); + for (i = 0; i < source->niov; i++) { + assert(dest->iov[i].iov_len == source->iov[i].iov_len); + memcpy(dest->iov[i].iov_base, + source->iov[i].iov_base, + source->iov[i].iov_len); + } +} + static void quorum_aio_cb(void *opaque, int ret) { QuorumChildRequest *sacb = opaque; @@ -263,6 +292,21 @@ static void quorum_aio_cb(void *opaque, int ret) BDRVQuorumState *s = acb->common.bs->opaque; bool rewrite = false; + if (acb->is_read && s->read_pattern == READ_PATTERN_FIFO) { + /* We try to read next child in FIFO order if we fail to read */ + if (ret < 0 && ++acb->child_iter < s->num_children) { + read_fifo_child(acb); + return; + } + + if (ret == 0) { + quorum_copy_qiov(acb->qiov, &acb->qcrs[acb->child_iter].qiov); + } + acb->vote_ret = ret; + quorum_aio_finalize(acb); + return; + } + sacb->ret = ret; acb->count++; if (ret == 0) { @@ -343,19 +387,6 @@ static bool quorum_rewrite_bad_versions(BDRVQuorumState *s, QuorumAIOCB *acb, return count; } -static void quorum_copy_qiov(QEMUIOVector *dest, QEMUIOVector *source) -{ - int i; - assert(dest->niov == source->niov); - assert(dest->size == source->size); - for (i = 0; i < source->niov; i++) { - assert(dest->iov[i].iov_len == source->iov[i].iov_len); - memcpy(dest->iov[i].iov_base, - source->iov[i].iov_base, - source->iov[i].iov_len); - } -} - static void quorum_count_vote(QuorumVotes *votes, QuorumVoteValue *value, int index) @@ -615,34 +646,62 @@ free_exit: return rewrite; } -static BlockDriverAIOCB *quorum_aio_readv(BlockDriverState *bs, - int64_t sector_num, - QEMUIOVector *qiov, - int nb_sectors, - BlockDriverCompletionFunc *cb, - void *opaque) +static BlockDriverAIOCB *read_quorum_children(QuorumAIOCB *acb) { - BDRVQuorumState *s = bs->opaque; - QuorumAIOCB *acb = quorum_aio_get(s, bs, qiov, sector_num, - nb_sectors, cb, opaque); + BDRVQuorumState *s = acb->common.bs->opaque; int i; - acb->is_read = true; - for (i = 0; i < s->num_children; i++) { - acb->qcrs[i].buf = qemu_blockalign(s->bs[i], qiov->size); - qemu_iovec_init(&acb->qcrs[i].qiov, qiov->niov); - qemu_iovec_clone(&acb->qcrs[i].qiov, qiov, acb->qcrs[i].buf); + acb->qcrs[i].buf = qemu_blockalign(s->bs[i], acb->qiov->size); + qemu_iovec_init(&acb->qcrs[i].qiov, acb->qiov->niov); + qemu_iovec_clone(&acb->qcrs[i].qiov, acb->qiov, acb->qcrs[i].buf); } for (i = 0; i < s->num_children; i++) { - bdrv_aio_readv(s->bs[i], sector_num, &acb->qcrs[i].qiov, nb_sectors, - quorum_aio_cb, &acb->qcrs[i]); + bdrv_aio_readv(s->bs[i], acb->sector_num, &acb->qcrs[i].qiov, + acb->nb_sectors, quorum_aio_cb, &acb->qcrs[i]); } return &acb->common; } +static BlockDriverAIOCB *read_fifo_child(QuorumAIOCB *acb) +{ + BDRVQuorumState *s = acb->common.bs->opaque; + + acb->qcrs[acb->child_iter].buf = qemu_blockalign(s->bs[acb->child_iter], + acb->qiov->size); + qemu_iovec_init(&acb->qcrs[acb->child_iter].qiov, acb->qiov->niov); + qemu_iovec_clone(&acb->qcrs[acb->child_iter].qiov, acb->qiov, + acb->qcrs[acb->child_iter].buf); + bdrv_aio_readv(s->bs[acb->child_iter], acb->sector_num, + &acb->qcrs[acb->child_iter].qiov, acb->nb_sectors, + quorum_aio_cb, &acb->qcrs[acb->child_iter]); + + return &acb->common; +} + +static BlockDriverAIOCB *quorum_aio_readv(BlockDriverState *bs, + int64_t sector_num, + QEMUIOVector *qiov, + int nb_sectors, + BlockDriverCompletionFunc *cb, + void *opaque) +{ + BDRVQuorumState *s = bs->opaque; + QuorumAIOCB *acb = quorum_aio_get(s, bs, qiov, sector_num, + nb_sectors, cb, opaque); + acb->is_read = true; + + if (s->read_pattern == READ_PATTERN_QUORUM) { + acb->child_iter = s->num_children - 1; + return read_quorum_children(acb); + } + + acb->child_iter = 0; + return read_fifo_child(acb); +} + static BlockDriverAIOCB *quorum_aio_writev(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, @@ -782,6 +841,11 @@ static QemuOptsList quorum_runtime_opts = { .type = QEMU_OPT_BOOL, .help = "Rewrite corrupted block on read quorum", }, + { + .name = QUORUM_OPT_READ_PATTERN, + .type = QEMU_OPT_STRING, + .help = "Allowed pattern: quorum, fifo. Quorum is default", + }, { /* end of list */ } }, }; @@ -796,6 +860,7 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags, QDict *sub = NULL; QList *list = NULL; const QListEntry *lentry; + const char *read_pattern; int i; int ret = 0; @@ -827,28 +892,44 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags, } s->threshold = qemu_opt_get_number(opts, QUORUM_OPT_VOTE_THRESHOLD, 0); - - /* and validate it against s->num_children */ - ret = quorum_valid_threshold(s->threshold, s->num_children, &local_err); - if (ret < 0) { - goto exit; + read_pattern = qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN); + if (read_pattern) { + if (strcmp(read_pattern, "fifo") == 0) { + s->read_pattern = READ_PATTERN_FIFO; + } else if (strcmp(read_pattern, "quorum") == 0) { + s->read_pattern = READ_PATTERN_QUORUM; + } else { + error_setg(&local_err, + "Please set read-pattern as fifo or quorum\n"); + ret = -EINVAL; + goto exit; + } } - /* is the driver in blkverify mode */ - if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false) && - s->num_children == 2 && s->threshold == 2) { - s->is_blkverify = true; - } else if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false)) { - fprintf(stderr, "blkverify mode is set by setting blkverify=on " - "and using two files with vote_threshold=2\n"); - } + if (s->read_pattern == READ_PATTERN_QUORUM) { + /* and validate it against s->num_children */ + ret = quorum_valid_threshold(s->threshold, s->num_children, &local_err); + if (ret < 0) { + goto exit; + } - s->rewrite_corrupted = qemu_opt_get_bool(opts, QUORUM_OPT_REWRITE, false); - if (s->rewrite_corrupted && s->is_blkverify) { - error_setg(&local_err, - "rewrite-corrupted=on cannot be used with blkverify=on"); - ret = -EINVAL; - goto exit; + /* is the driver in blkverify mode */ + if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false) && + s->num_children == 2 && s->threshold == 2) { + s->is_blkverify = true; + } else if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false)) { + fprintf(stderr, "blkverify mode is set by setting blkverify=on " + "and using two files with vote_threshold=2\n"); + } + + s->rewrite_corrupted = qemu_opt_get_bool(opts, QUORUM_OPT_REWRITE, + false); + if (s->rewrite_corrupted && s->is_blkverify) { + error_setg(&local_err, + "rewrite-corrupted=on cannot be used with blkverify=on"); + ret = -EINVAL; + goto exit; + } } /* allocate the children BlockDriverState array */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support Liu Yuan @ 2014-07-15 12:14 ` Eric Blake 2014-07-16 5:30 ` Liu Yuan 0 siblings, 1 reply; 8+ messages in thread From: Eric Blake @ 2014-07-15 12:14 UTC (permalink / raw) To: Liu Yuan, qemu-devel; +Cc: Kevin Wolf, Benoit Canet, Stefan Hajnoczi [-- Attachment #1: Type: text/plain, Size: 2582 bytes --] On 07/15/2014 12:34 AM, Liu Yuan wrote: > This patch adds single read pattern to quorum driver and quorum vote is default > pattern. > > For now we do a quorum vote on all the reads, it is designed for unreliable > underlying storage such as non-redundant NFS to make sure data integrity at the > cost of the read performance. > > */ > + > +#define READ_PATTERN_QUORUM 0 /* default */ > +#define READ_PATTERN_FIFO 1 > + int read_pattern; /* fifo: read a single child and try first one > + * first. If error, try next child in an > + * FIFO order specifed by command line. > + * Return error if no child read succeeds. > + * quorum: read all the children and do a quorum > + * vote on reads. > + */ Please swap the order of your two patches, or squash them back into one. If you define the qapi enum first, then you don't need to open-code these #defines; instead, the qapi code will generate a typedef that puts the C enum QuorumReadPattern into play, so that this declaration becomes 'QuorumReadPattern read_pattern;'... > @@ -263,6 +292,21 @@ static void quorum_aio_cb(void *opaque, int ret) > BDRVQuorumState *s = acb->common.bs->opaque; > bool rewrite = false; > > + if (acb->is_read && s->read_pattern == READ_PATTERN_FIFO) { ...and code like this can compare against the constant QUORUM_READ_PATTERN_FIFO (which will be generated for you from the .json file)... > + read_pattern = qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN); > + if (read_pattern) { > + if (strcmp(read_pattern, "fifo") == 0) { > + s->read_pattern = READ_PATTERN_FIFO; > + } else if (strcmp(read_pattern, "quorum") == 0) { > + s->read_pattern = READ_PATTERN_QUORUM; > + } else { > + error_setg(&local_err, > + "Please set read-pattern as fifo or quorum\n"); > + ret = -EINVAL; > + goto exit; > + } ...and instead of open-coding this, you should use parse_enum_option(). Also, by using the generated list here, if you later add a third read pattern, then this parser code doesn't have to change, but already automatically covers all valid options encoded in the qapi list. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support 2014-07-15 12:14 ` Eric Blake @ 2014-07-16 5:30 ` Liu Yuan 0 siblings, 0 replies; 8+ messages in thread From: Liu Yuan @ 2014-07-16 5:30 UTC (permalink / raw) To: Eric Blake; +Cc: Kevin Wolf, qemu-devel, Stefan Hajnoczi, Benoit Canet On Tue, Jul 15, 2014 at 06:14:32AM -0600, Eric Blake wrote: > On 07/15/2014 12:34 AM, Liu Yuan wrote: > > This patch adds single read pattern to quorum driver and quorum vote is default > > pattern. > > > > For now we do a quorum vote on all the reads, it is designed for unreliable > > underlying storage such as non-redundant NFS to make sure data integrity at the > > cost of the read performance. > > > > > */ > > + > > +#define READ_PATTERN_QUORUM 0 /* default */ > > +#define READ_PATTERN_FIFO 1 > > + int read_pattern; /* fifo: read a single child and try first one > > + * first. If error, try next child in an > > + * FIFO order specifed by command line. > > + * Return error if no child read succeeds. > > + * quorum: read all the children and do a quorum > > + * vote on reads. > > + */ > > Please swap the order of your two patches, or squash them back into one. > If you define the qapi enum first, then you don't need to open-code > these #defines; instead, the qapi code will generate a typedef that puts > the C enum QuorumReadPattern into play, so that this declaration becomes > 'QuorumReadPattern read_pattern;'... > > > > @@ -263,6 +292,21 @@ static void quorum_aio_cb(void *opaque, int ret) > > BDRVQuorumState *s = acb->common.bs->opaque; > > bool rewrite = false; > > > > + if (acb->is_read && s->read_pattern == READ_PATTERN_FIFO) { > > ...and code like this can compare against the constant > QUORUM_READ_PATTERN_FIFO (which will be generated for you from the .json > file)... > > > > + read_pattern = qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN); > > + if (read_pattern) { > > + if (strcmp(read_pattern, "fifo") == 0) { > > + s->read_pattern = READ_PATTERN_FIFO; > > + } else if (strcmp(read_pattern, "quorum") == 0) { > > + s->read_pattern = READ_PATTERN_QUORUM; > > + } else { > > + error_setg(&local_err, > > + "Please set read-pattern as fifo or quorum\n"); > > + ret = -EINVAL; > > + goto exit; > > + } > > ...and instead of open-coding this, you should use parse_enum_option(). > Also, by using the generated list here, if you later add a third read > pattern, then this parser code doesn't have to change, but already > automatically covers all valid options encoded in the qapi list. > That's awesome, thanks for your pointers, Eric. Yuan ^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum 2014-07-15 6:34 [Qemu-devel] [PATCH v3 0/2] add read-pattern for block qourum Liu Yuan 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support Liu Yuan @ 2014-07-15 6:34 ` Liu Yuan 2014-07-15 12:22 ` Eric Blake 1 sibling, 1 reply; 8+ messages in thread From: Liu Yuan @ 2014-07-15 6:34 UTC (permalink / raw) To: qemu-devel Cc: Eric Blake <eblake@redhat.com> Signed-off-by: Liu Yuan <namei.unix@gmail.com> --- qapi/block-core.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index e378653..22491bc 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1384,6 +1384,18 @@ 'raw': 'BlockdevRef' } } ## +# @QuorumReadPattern +# An enumeration of quorum read pattern. +# +# @quorum: read all the children and do a quorum vote on reads +# +# @fifo: read a single child and try next child in FIFO order if read fails. +# +# Since: 2.2 +## +{ 'enum': 'QuorumReadPattern', 'data': [ 'quorum', 'fifo' ] } + +## # @BlockdevOptionsQuorum # # Driver specific block device options for Quorum @@ -1398,12 +1410,17 @@ # @rewrite-corrupted: #optional rewrite corrupted data when quorum is reached # (Since 2.1) # +# @read-pattern: #optional choose read pattern and set to quorum by default +# (Since 2.2) +# # Since: 2.0 ## { 'type': 'BlockdevOptionsQuorum', 'data': { '*blkverify': 'bool', 'children': [ 'BlockdevRef' ], - 'vote-threshold': 'int', '*rewrite-corrupted': 'bool' } } + 'vote-threshold': 'int', + '*rewrite-corrupted': 'bool', + '*read-pattern': 'QuorumReadPattern' } } ## # @BlockdevOptions -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum Liu Yuan @ 2014-07-15 12:22 ` Eric Blake 2014-07-16 2:22 ` Liu Yuan 0 siblings, 1 reply; 8+ messages in thread From: Eric Blake @ 2014-07-15 12:22 UTC (permalink / raw) To: Liu Yuan, qemu-devel [-- Attachment #1: Type: text/plain, Size: 1142 bytes --] On 07/15/2014 12:34 AM, Liu Yuan wrote: > Cc: Eric Blake <eblake@redhat.com> > Signed-off-by: Liu Yuan <namei.unix@gmail.com> > --- > qapi/block-core.json | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > > diff --git a/qapi/block-core.json b/qapi/block-core.json > index e378653..22491bc 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -1384,6 +1384,18 @@ > 'raw': 'BlockdevRef' } } > > ## > +# @QuorumReadPattern > +# An enumeration of quorum read pattern. s/pattern/patterns/ > +# > +# @quorum: read all the children and do a quorum vote on reads > +# > +# @fifo: read a single child and try next child in FIFO order if read fails. Inconsistent on whether you are ending a line with '.'. I'm not quite sure if this reads well; maybe: @fifo: read only from the first child that has not failed I also wonder if 'single' might be a better name than 'fifo', especially if we later add a 'round-robin' for read load balancing. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 604 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum 2014-07-15 12:22 ` Eric Blake @ 2014-07-16 2:22 ` Liu Yuan 2014-07-16 2:23 ` Liu Yuan 0 siblings, 1 reply; 8+ messages in thread From: Liu Yuan @ 2014-07-16 2:22 UTC (permalink / raw) To: Eric Blake; +Cc: qemu-devel On Tue, Jul 15, 2014 at 06:22:14AM -0600, Eric Blake wrote: > On 07/15/2014 12:34 AM, Liu Yuan wrote: > > Cc: Eric Blake <eblake@redhat.com> > > Signed-off-by: Liu Yuan <namei.unix@gmail.com> > > --- > > qapi/block-core.json | 19 ++++++++++++++++++- > > 1 file changed, 18 insertions(+), 1 deletion(-) > > > > diff --git a/qapi/block-core.json b/qapi/block-core.json > > index e378653..22491bc 100644 > > --- a/qapi/block-core.json > > +++ b/qapi/block-core.json > > @@ -1384,6 +1384,18 @@ > > 'raw': 'BlockdevRef' } } > > > > ## > > +# @QuorumReadPattern > > +# An enumeration of quorum read pattern. > > s/pattern/patterns/ > > > +# > > +# @quorum: read all the children and do a quorum vote on reads > > +# > > +# @fifo: read a single child and try next child in FIFO order if read fails. > > Inconsistent on whether you are ending a line with '.'. I'm not quite > sure if this reads well; maybe: > > @fifo: read only from the first child that has not failed > > I also wonder if 'single' might be a better name than 'fifo', especially > if we later add a 'round-robin' for read load balancing. Both fifo and round-robin in our context indicate a single read. but either one looks okay to me. We need to reach agreement on the name before I send the next version, single or fifo or any other suggested, Benoit, Kevin, Stefan? Thanks Yuan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum 2014-07-16 2:22 ` Liu Yuan @ 2014-07-16 2:23 ` Liu Yuan 0 siblings, 0 replies; 8+ messages in thread From: Liu Yuan @ 2014-07-16 2:23 UTC (permalink / raw) To: Eric Blake; +Cc: Kevin Wolf, qemu-devel, Stefan Hajnoczi, Benoit Canet On Wed, Jul 16, 2014 at 10:22:20AM +0800, Liu Yuan wrote: > On Tue, Jul 15, 2014 at 06:22:14AM -0600, Eric Blake wrote: > > On 07/15/2014 12:34 AM, Liu Yuan wrote: > > > Cc: Eric Blake <eblake@redhat.com> > > > Signed-off-by: Liu Yuan <namei.unix@gmail.com> > > > --- > > > qapi/block-core.json | 19 ++++++++++++++++++- > > > 1 file changed, 18 insertions(+), 1 deletion(-) > > > > > > diff --git a/qapi/block-core.json b/qapi/block-core.json > > > index e378653..22491bc 100644 > > > --- a/qapi/block-core.json > > > +++ b/qapi/block-core.json > > > @@ -1384,6 +1384,18 @@ > > > 'raw': 'BlockdevRef' } } > > > > > > ## > > > +# @QuorumReadPattern > > > +# An enumeration of quorum read pattern. > > > > s/pattern/patterns/ > > > > > +# > > > +# @quorum: read all the children and do a quorum vote on reads > > > +# > > > +# @fifo: read a single child and try next child in FIFO order if read fails. > > > > Inconsistent on whether you are ending a line with '.'. I'm not quite > > sure if this reads well; maybe: > > > > @fifo: read only from the first child that has not failed > > > > I also wonder if 'single' might be a better name than 'fifo', especially > > if we later add a 'round-robin' for read load balancing. > > Both fifo and round-robin in our context indicate a single read. > > but either one looks okay to me. We need to reach agreement on the name before I > send the next version, single or fifo or any other suggested, Benoit, Kevin, > Stefan? Cc others mentioned. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2014-07-16 5:30 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-07-15 6:34 [Qemu-devel] [PATCH v3 0/2] add read-pattern for block qourum Liu Yuan 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 1/2] block/quorum: add simple read pattern support Liu Yuan 2014-07-15 12:14 ` Eric Blake 2014-07-16 5:30 ` Liu Yuan 2014-07-15 6:34 ` [Qemu-devel] [PATCH v3 2/2] qapi: add read-pattern support for quorum Liu Yuan 2014-07-15 12:22 ` Eric Blake 2014-07-16 2:22 ` Liu Yuan 2014-07-16 2:23 ` Liu Yuan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).