Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
iotests: Add test for QMP event rates
This test verifies that the rate-limited QMP events are emitted at a maximum rate of 1 per second as defined in monitor_qapi_event_conf in monitor.c It also checks that QUORUM_REPORT_BAD events generated from different nodes are kept in separate queues so they don't mask each other. Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 0dbd3ee88a59a6363042ad81cfb345037bfbf612.1457610443.git.berto@igalia.com [mreitz@redhat.com: Renamed test from 146 to 148] Signed-off-by: Max Reitz <mreitz@redhat.com>
- Loading branch information
Showing
3 changed files
with
135 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
#!/usr/bin/env python | ||
# | ||
# Test the rate limit of QMP events | ||
# | ||
# Copyright (C) 2016 Igalia, S.L. | ||
# Author: Alberto Garcia <berto@igalia.com> | ||
# | ||
# This program is free software; you can redistribute it and/or modify | ||
# it under the terms of the GNU General Public License as published by | ||
# the Free Software Foundation; either version 2 of the License, or | ||
# (at your option) any later version. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
# | ||
|
||
import os | ||
import iotests | ||
|
||
imgs = (os.path.join(iotests.test_dir, 'quorum0.img'), | ||
os.path.join(iotests.test_dir, 'quorum1.img'), | ||
os.path.join(iotests.test_dir, 'quorum2.img')) | ||
|
||
img_conf = (os.path.join(iotests.test_dir, 'quorum0.conf'), | ||
os.path.join(iotests.test_dir, 'quorum1.conf'), | ||
os.path.join(iotests.test_dir, 'quorum2.conf')) | ||
|
||
event_rate = 1000000000 | ||
sector_size = 512 | ||
offset = 10 | ||
|
||
class TestQuorumEvents(iotests.QMPTestCase): | ||
|
||
def create_blkdebug_file(self, blkdebug_file, bad_sector): | ||
file = open(blkdebug_file, 'w') | ||
file.write(''' | ||
[inject-error] | ||
event = "read_aio" | ||
errno = "5" | ||
sector = "%d" | ||
''' % bad_sector) | ||
file.close() | ||
|
||
def setUp(self): | ||
driveopts = ['driver=quorum', 'vote-threshold=2'] | ||
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) | ||
driveopts.append('children.%d.driver=%s' % (i, iotests.imgfmt)) | ||
driveopts.append('children.%d.file.driver=blkdebug' % i) | ||
driveopts.append('children.%d.file.config=%s' % (i, img_conf[i])) | ||
driveopts.append('children.%d.file.image.filename=%s' % (i, imgs[i])) | ||
driveopts.append('children.%d.node-name=img%d' % (i, i)) | ||
self.vm = iotests.VM() | ||
self.vm.add_drive(None, opts = ','.join(driveopts)) | ||
self.vm.launch() | ||
|
||
def tearDown(self): | ||
self.vm.shutdown() | ||
for i in range(len(imgs)): | ||
os.remove(imgs[i]) | ||
os.remove(img_conf[i]) | ||
|
||
def do_check_event(self, node, sector = 0): | ||
if node == None: | ||
self.assertEqual(self.vm.get_qmp_event(), None) | ||
return | ||
|
||
for event in self.vm.get_qmp_events(wait=True): | ||
if event['event'] == 'QUORUM_REPORT_BAD': | ||
self.assert_qmp(event, 'data/node-name', node) | ||
self.assert_qmp(event, 'data/sector-num', sector) | ||
|
||
def testQuorum(self): | ||
if not 'quorum' in iotests.qemu_img_pipe('--help'): | ||
return | ||
|
||
# Generate an error and get an event | ||
self.vm.hmp_qemu_io("drive0", "aio_read %d %d" % | ||
(offset * sector_size, sector_size)) | ||
self.vm.qtest("clock_step 10") | ||
self.do_check_event('img0', offset) | ||
|
||
# I/O errors in the same child: only one event is emitted | ||
delay = 10 | ||
for i in range(3): | ||
self.vm.hmp_qemu_io("drive0", "aio_read %d %d" % | ||
(offset * sector_size, sector_size)) | ||
self.vm.qtest("clock_step %d" % delay) | ||
self.do_check_event(None) | ||
|
||
# Wait enough so the event is finally emitted | ||
self.vm.qtest("clock_step %d" % (2 * event_rate)) | ||
self.do_check_event('img0', offset) | ||
|
||
# I/O errors in the same child: all events are emitted | ||
delay = 2 * event_rate | ||
for i in range(3): | ||
self.vm.hmp_qemu_io("drive0", "aio_read %d %d" % | ||
(offset * sector_size, sector_size)) | ||
self.vm.qtest("clock_step %d" % delay) | ||
self.do_check_event('img0', offset) | ||
|
||
# I/O errors in different children: all events are emitted | ||
delay = 10 | ||
for i in range(len(imgs)): | ||
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) | ||
|
||
# I/O errors in different children: all events are emitted | ||
delay = 2 * event_rate | ||
for i in range(len(imgs)): | ||
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) | ||
|
||
# No more pending events | ||
self.do_check_event(None) | ||
|
||
if __name__ == '__main__': | ||
iotests.main(supported_fmts=["raw"]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
. | ||
---------------------------------------------------------------------- | ||
Ran 1 tests | ||
|
||
OK |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -149,3 +149,4 @@ | |
144 rw auto quick | ||
145 auto quick | ||
146 auto quick | ||
148 rw auto quick |