Skip to contentSkip to conversation

Emit QUORUM_REPORT_BAD for reads in fifo mode

PATCH Applied Alberto Garcia 2 participants 6 messages Mar 15, 2016 – Mar 16, 2016 Block layer

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index 3d47351..da15465 100644
@@ -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
Reviewed-by on v1 1/2
#2 lore raw

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.

---
 block/quorum.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)
#3 lore raw

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
index 30bc379..d066ec3 100644
@@ -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
index ae1213e..fbc63e6 100644
@@ -1,5 +1,5 @@
-.
+..
 ----------------------------------------------------------------------
-Ran 1 tests
+Ran 2 tests
 
 OK
Signature · 1 line
2.7.0
Applied
#5 lore raw
In reply to Alberto Garcia
Quoted 14 lines · Alberto Garcia

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

Quoted 8 lines

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(-)

Thanks, applied to my block tree:

https://github.com/XanClic/qemu/commits/block

Max