Emit QUORUM_REPORT_BAD for reads in fifo mode
cover Emit QUORUM_REPORT_BAD for reads in fifo mode
This is a follow-up to the "Separate QUORUM_REPORT_BAD events" series:
https://lists.gnu.org/archive/html/qemu-devel/2016-03/msg02402.html
If there's an I/O error in one of Quorum children then QEMU should emit QUORUM_REPORT_BAD. However this is not working with read-pattern=fifo. This patch fixes this problem.
This applies on top of Kevin's block branch.
Regards,
Berto
Alberto Garcia (2):
quorum: Emit QUORUM_REPORT_BAD for reads in fifo mode
iotests: Test QUORUM_REPORT_BAD in fifo mode
block/quorum.c | 17 +++++++++-------- tests/qemu-iotests/148 | 17 +++++++++++++++-- tests/qemu-iotests/148.out | 4 ++-- 3 files changed, 26 insertions(+), 12 deletions(-)
Signature · 1 line
2.7.0
PATCH 1/2 quorum: Emit QUORUM_REPORT_BAD for reads in fifo mode
If there's an I/O error in one of Quorum children then QEMU should emit QUORUM_REPORT_BAD. However this is not working with read-pattern=fifo. This patch fixes this problem.
--- block/quorum.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
block/quorum.c +9 -8
@@ -284,9 +284,17 @@ static void quorum_aio_cb(void *opaque, int ret)QuorumChildRequest *sacb = opaque;QuorumAIOCB *acb = sacb->parent;BDRVQuorumState *s = acb->common.bs->opaque; -QuorumOpType type;bool rewrite = false; +if (ret ==0 ) { + acb->success_count++; + }else { +QuorumOpType type; + type = acb->is_read ?QUORUM_OP_TYPE_READ :QUORUM_OP_TYPE_WRITE ; +quorum_report_bad (type, acb->sector_num, acb->nb_sectors, + sacb->aiocb->bs->node_name, ret); + } +if (acb->is_read && s->read_pattern ==QUORUM_READ_PATTERN_FIFO ) {/* We try to read next child in FIFO order if we fail to read */ if (ret <0 && (acb->child_iter +1 ) < s->num_children) {
@@ -303,15 +311,8 @@ static void quorum_aio_cb(void *opaque, int ret)return ; } - type = acb->is_read ?QUORUM_OP_TYPE_READ :QUORUM_OP_TYPE_WRITE ; sacb->ret = ret; acb->count++; -if (ret ==0 ) { - acb->success_count++; - }else { -quorum_report_bad (type, acb->sector_num, acb->nb_sectors, - sacb->aiocb->bs->node_name, ret); - }assert (acb->count <= s->num_children);assert (acb->success_count <= s->num_children);if (acb->count < s->num_children) {
Signature · 1 line
2.7.0
Re: [Qemu-devel] [PATCH 1/2] quorum: Emit QUORUM_REPORT_BAD for reads in fifo mode
Quoted 8 lines · Alberto Garcia
If there's an I/O error in one of Quorum children then QEMU should emit
QUORUM_REPORT_BAD. However this is not working with read-pattern=fifo. This patch fixes this problem.Signed-off-by Alberto Garcia <[email protected]>--- block/quorum.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
PATCH 2/2 iotests: Test QUORUM_REPORT_BAD in fifo mode
In reply to Alberto Garcia--- tests/qemu-iotests/148 | 17 +++++++++++++++-- tests/qemu-iotests/148.out | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-)
tests/qemu-iotests/148 +15 -2
@@ -35,6 +35,7 @@ sector_size = 512 offset = 10 class TestQuorumEvents(iotests.QMPTestCase): + read_pattern = 'quorum' def create_blkdebug_file(self, blkdebug_file, bad_sector): file = open(blkdebug_file, 'w')
@@ -48,6 +49,7 @@ sector = "%d" def setUp(self): driveopts = ['driver=quorum', 'vote-threshold=2'] + driveopts.append('read-pattern=%s' % self.read_pattern) for i in range(len(imgs)): iotests.qemu_img('create', '-f', iotests.imgfmt, imgs[i], '1M') self.create_blkdebug_file(img_conf[i], i + offset)
@@ -112,7 +114,11 @@ sector = "%d" self.vm.hmp_qemu_io("drive0", "aio_read %d %d" % ((offset + i) * sector_size, sector_size)) self.vm.qtest("clock_step %d" % delay) - self.do_check_event('img%d' % i, offset + i) + # In fifo mode only errors in the first child are detected + if i > 0 and self.read_pattern == 'fifo': + self.do_check_event(None) + else: + self.do_check_event('img%d' % i, offset + i) # I/O errors in different children: all events are emitted delay = 2 * event_rate
@@ -120,10 +126,17 @@ sector = "%d" self.vm.hmp_qemu_io("drive0", "aio_read %d %d" % ((offset + i) * sector_size, sector_size)) self.vm.qtest("clock_step %d" % delay) - self.do_check_event('img%d' % i, offset + i) + # In fifo mode only errors in the first child are detected + if i > 0 and self.read_pattern == 'fifo': + self.do_check_event(None) + else: + self.do_check_event('img%d' % i, offset + i) # No more pending events self.do_check_event(None) +class TestFifoQuorumEvents(TestQuorumEvents): + read_pattern = 'fifo' + if __name__ == '__main__': iotests.main(supported_fmts=["raw"])
tests/qemu-iotests/148.out +2 -2
@@ -1,5 +1,5 @@ -. +.. ---------------------------------------------------------------------- -Ran 1 tests +Ran 2 tests OK
Signature · 1 line
2.7.0
Re: [Qemu-devel] [PATCH 2/2] iotests: Test QUORUM_REPORT_BAD in fifo mode
Quoted 5 lines · Alberto Garcia
Signed-off-by Alberto Garcia <[email protected]>--- tests/qemu-iotests/148 | 17 +++++++++++++++-- tests/qemu-iotests/148.out | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-)
Max Reitz
AppliedQuoted 14 lines · Alberto Garcia
This is a follow-up to the "Separate
QUORUM_REPORT_BADevents" series:https://lists.gnu.org/archive/html/qemu-devel/2016-03/msg02402.htmlIf there's an I/O error in one of Quorum children then QEMU should emit
QUORUM_REPORT_BAD. However this is not working with read-pattern=fifo. This patch fixes this problem.This applies on top of Kevin's block branch.
Regards,
Berto
Quoted 8 lines
Alberto Garcia (2):
quorum: EmitQUORUM_REPORT_BADfor reads in fifo mode
iotests: TestQUORUM_REPORT_BADin fifo modeblock/quorum.c | 17 +++++++++-------- tests/qemu-iotests/148 | 17 +++++++++++++++-- tests/qemu-iotests/148.out | 4 ++-- 3 files changed, 26 insertions(+), 12 deletions(-)
Thanks, applied to my block tree:
https://github.com/XanClic/qemu/commits/block
Max