Commit 361dca7a authored by Kevin Wolf's avatar Kevin Wolf
Browse files

Merge remote-tracking branch 'mreitz/tags/pull-block-for-kevin-2016-03-17-v2' into queue-block



Two quorum patches for the block queue, v2.

# gpg: Signature made Thu Mar 17 16:44:11 2016 CET using RSA key ID E838ACAD
# gpg: Good signature from "Max Reitz <mreitz@redhat.com>"

* mreitz/tags/pull-block-for-kevin-2016-03-17-v2:
  iotests: Test QUORUM_REPORT_BAD in fifo mode
  quorum: Emit QUORUM_REPORT_BAD for reads in fifo mode

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parents 8896e088 509565f3
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -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) {
+15 −2
Original line number Diff line number Diff line
@@ -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,6 +114,10 @@ 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)
            # 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
@@ -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)
            # 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"])
+2 −2
Original line number Diff line number Diff line
.
..
----------------------------------------------------------------------
Ran 1 tests
Ran 2 tests

OK