1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
3 Date: Mon, 6 Apr 2020 12:17:07 +0200
4 Subject: [PATCH] iotests: add test for bitmap mirror
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 heavily based on/practically forked off iotest 257 for bitmap backups,
12 - no writes to filter node 'mirror-top' between completion and
13 finalization, as those seem to deadlock?
14 - no inclusion of not-yet-available full/top sync modes in combination
16 - extra set of reference/test mirrors to verify that writes in parallel
17 with active mirror work
19 intentionally keeping copyright and ownership of original test case to
22 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
24 tests/qemu-iotests/384 | 547 +++++++
25 tests/qemu-iotests/384.out | 2846 ++++++++++++++++++++++++++++++++++++
26 tests/qemu-iotests/group | 1 +
27 3 files changed, 3394 insertions(+)
28 create mode 100755 tests/qemu-iotests/384
29 create mode 100644 tests/qemu-iotests/384.out
31 diff --git a/tests/qemu-iotests/384 b/tests/qemu-iotests/384
33 index 0000000000..b04a8e651a
35 +++ b/tests/qemu-iotests/384
37 +#!/usr/bin/env python3
39 +# Test bitmap-sync mirrors (incremental, differential, and partials)
41 +# Copyright (c) 2019 John Snow for Red Hat, Inc.
43 +# This program is free software; you can redistribute it and/or modify
44 +# it under the terms of the GNU General Public License as published by
45 +# the Free Software Foundation; either version 2 of the License, or
46 +# (at your option) any later version.
48 +# This program is distributed in the hope that it will be useful,
49 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
50 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
51 +# GNU General Public License for more details.
53 +# You should have received a copy of the GNU General Public License
54 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
56 +# owner=jsnow@redhat.com
62 +from iotests import log, qemu_img
64 +SIZE = 64 * 1024 * 1024
65 +GRANULARITY = 64 * 1024
69 + def __init__(self, byte, offset, size=GRANULARITY):
71 + self.offset = offset
74 + def bits(self, granularity):
75 + lower = self.offset // granularity
76 + upper = (self.offset + self.size - 1) // granularity
77 + return set(range(lower, upper + 1))
81 + """Grouping of Pattern objects. Initialize with an iterable of Patterns."""
82 + def __init__(self, patterns):
83 + self.patterns = patterns
85 + def bits(self, granularity):
86 + """Calculate the unique bits dirtied by this pattern grouping"""
88 + for pattern in self.patterns:
89 + res |= pattern.bits(granularity)
95 + # Batch 0: 4 clusters
96 + Pattern('0x49', 0x0000000),
97 + Pattern('0x6c', 0x0100000), # 1M
98 + Pattern('0x6f', 0x2000000), # 32M
99 + Pattern('0x76', 0x3ff0000)]), # 64M - 64K
101 + # Batch 1: 6 clusters (3 new)
102 + Pattern('0x65', 0x0000000), # Full overwrite
103 + Pattern('0x77', 0x00f8000), # Partial-left (1M-32K)
104 + Pattern('0x72', 0x2008000), # Partial-right (32M+32K)
105 + Pattern('0x69', 0x3fe0000)]), # Adjacent-left (64M - 128K)
107 + # Batch 2: 7 clusters (3 new)
108 + Pattern('0x74', 0x0010000), # Adjacent-right
109 + Pattern('0x69', 0x00e8000), # Partial-left (1M-96K)
110 + Pattern('0x6e', 0x2018000), # Partial-right (32M+96K)
111 + Pattern('0x67', 0x3fe0000,
112 + 2*GRANULARITY)]), # Overwrite [(64M-128K)-64M)
114 + # Batch 3: 8 clusters (5 new)
115 + # Carefully chosen such that nothing re-dirties the one cluster
116 + # that copies out successfully before failure in Group #1.
117 + Pattern('0xaa', 0x0010000,
118 + 3*GRANULARITY), # Overwrite and 2x Adjacent-right
119 + Pattern('0xbb', 0x00d8000), # Partial-left (1M-160K)
120 + Pattern('0xcc', 0x2028000), # Partial-right (32M+160K)
121 + Pattern('0xdd', 0x3fc0000)]), # New; leaving a gap to the right
125 +class EmulatedBitmap:
126 + def __init__(self, granularity=GRANULARITY):
128 + self.granularity = granularity
130 + def dirty_bits(self, bits):
131 + self._bits |= set(bits)
133 + def dirty_group(self, n):
134 + self.dirty_bits(GROUPS[n].bits(self.granularity))
139 + def clear_bits(self, bits):
140 + self._bits -= set(bits)
142 + def clear_bit(self, bit):
143 + self.clear_bits({bit})
145 + def clear_group(self, n):
146 + self.clear_bits(GROUPS[n].bits(self.granularity))
149 + def first_bit(self):
150 + return sorted(self.bits)[0]
158 + return len(self.bits)
160 + def compare(self, qmp_bitmap):
162 + Print a nice human-readable message checking that a bitmap as reported
163 + by the QMP interface has as many bits set as we expect it to.
166 + name = qmp_bitmap.get('name', '(anonymous)')
167 + log("= Checking Bitmap {:s} =".format(name))
170 + have = qmp_bitmap['count'] // qmp_bitmap['granularity']
172 + log("expecting {:d} dirty sectors; have {:d}. {:s}".format(
173 + want, have, "OK!" if want == have else "ERROR!"))
178 + """Represents, vaguely, a drive attached to a VM.
179 + Includes format, graph, and device information."""
181 + def __init__(self, path, vm=None):
188 + def img_create(self, fmt, size):
191 + iotests.qemu_img_create('-f', self.fmt, self.path, str(self.size))
193 + def create_target(self, name, fmt, size):
194 + basename = os.path.basename(self.path)
195 + file_node_name = "file_{}".format(basename)
198 + log(vm.command('blockdev-create', job_id='bdc-file-job',
201 + 'filename': self.path,
204 + vm.run_job('bdc-file-job')
205 + log(vm.command('blockdev-add', driver='file',
206 + node_name=file_node_name, filename=self.path))
208 + log(vm.command('blockdev-create', job_id='bdc-fmt-job',
211 + 'file': file_node_name,
214 + vm.run_job('bdc-fmt-job')
215 + log(vm.command('blockdev-add', driver=fmt,
217 + file=file_node_name))
222 +def blockdev_mirror(vm, device, target, sync, **kwargs):
223 + # Strip any arguments explicitly nulled by the caller:
224 + kwargs = {key: val for key, val in kwargs.items() if val is not None}
225 + result = vm.qmp_log('blockdev-mirror',
229 + filter_node_name='mirror-top',
233 +def blockdev_mirror_mktarget(drive, target_id, filepath, sync, **kwargs):
234 + target_drive = Drive(filepath, vm=drive.vm)
235 + target_drive.create_target(target_id, drive.fmt, drive.size)
236 + blockdev_mirror(drive.vm, drive.node, target_id, sync, **kwargs)
238 +def reference_mirror(drive, n, filepath):
239 + log("--- Reference mirror #{:d} ---\n".format(n))
240 + target_id = "ref_target_{:d}".format(n)
241 + job_id = "ref_mirror_{:d}".format(n)
242 + blockdev_mirror_mktarget(drive, target_id, filepath, "full",
244 + drive.vm.run_job(job_id, auto_dismiss=True)
247 +def mirror(drive, n, filepath, sync, **kwargs):
248 + log("--- Test mirror #{:d} ---\n".format(n))
249 + target_id = "mirror_target_{:d}".format(n)
250 + job_id = "mirror_{:d}".format(n)
251 + kwargs.setdefault('auto-finalize', False)
252 + blockdev_mirror_mktarget(drive, target_id, filepath, sync,
253 + job_id=job_id, **kwargs)
256 +def perform_writes(drive, n, filter_node_name=None):
257 + log("--- Write #{:d} ---\n".format(n))
258 + for pattern in GROUPS[n].patterns:
259 + cmd = "write -P{:s} 0x{:07x} 0x{:x}".format(
264 + log(drive.vm.hmp_qemu_io(filter_node_name or drive.node, cmd))
265 + bitmaps = drive.vm.query_bitmaps()
266 + log({'bitmaps': bitmaps}, indent=2)
271 +def compare_images(image, reference, baseimg=None, expected_match=True):
273 + Print a nice human-readable message comparing these images.
275 + expected_ret = 0 if expected_match else 1
277 + assert qemu_img("rebase", "-u", "-b", baseimg, image) == 0
278 + ret = qemu_img("compare", image, reference)
279 + log('qemu_img compare "{:s}" "{:s}" ==> {:s}, {:s}'.format(
281 + "Identical" if ret == 0 else "Mismatch",
282 + "OK!" if ret == expected_ret else "ERROR!"),
283 + filters=[iotests.filter_testfiles])
285 +def test_bitmap_sync(bsync_mode, msync_mode='bitmap', failure=None):
287 + Test bitmap mirror routines.
289 + :param bsync_mode: Is the Bitmap Sync mode, and can be any of:
290 + - on-success: This is the "incremental" style mode. Bitmaps are
291 + synchronized to what was copied out only on success.
292 + (Partial images must be discarded.)
293 + - never: This is the "differential" style mode.
294 + Bitmaps are never synchronized.
295 + - always: This is a "best effort" style mode.
296 + Bitmaps are always synchronized, regardless of failure.
297 + (Partial images must be kept.)
299 + :param msync_mode: The mirror sync mode to use for the first mirror.
301 + - bitmap: mirrors based on bitmap manifest.
302 + - full: Full mirrors.
303 + - top: Full mirrors of the top layer only.
305 + :param failure: Is the (optional) failure mode, and can be any of:
306 + - None: No failure. Test the normative path. Default.
307 + - simulated: Cancel the job right before it completes.
308 + This also tests writes "during" the job.
309 + - intermediate: This tests a job that fails mid-process and produces
310 + an incomplete mirror. Testing limitations prevent
311 + testing competing writes.
313 + with iotests.FilePaths(['img', 'bsync1', 'bsync2', 'bsync3',
314 + 'fmirror0', 'fmirror1', 'fmirror2', 'fmirror3']) as \
315 + (img_path, bsync1, bsync2, bsync3,
316 + fmirror0, fmirror1, fmirror2, fmirror3), \
317 + iotests.VM() as vm:
319 + mode = "Mode {:s}; Bitmap Sync {:s}".format(msync_mode, bsync_mode)
320 + preposition = "with" if failure else "without"
321 + cond = "{:s} {:s}".format(preposition,
322 + "{:s} failure".format(failure) if failure
324 + log("\n=== {:s} {:s} ===\n".format(mode, cond))
326 + log('--- Preparing image & VM ---\n')
327 + drive0 = Drive(img_path, vm=vm)
328 + drive0.img_create(iotests.imgfmt, SIZE)
329 + vm.add_device("{},id=scsi0".format(iotests.get_virtio_scsi_device()))
334 + 'filename': drive0.path
337 + if failure == 'intermediate':
339 + 'driver': 'blkdebug',
340 + 'image': file_config,
342 + 'event': 'flush_to_disk',
346 + 'event': 'read_aio',
350 + 'event': 'read_aio',
355 + 'event': 'read_aio',
358 + 'immediately': False,
361 + 'event': 'read_aio',
364 + 'immediately': False,
369 + drive0.node = 'drive0'
370 + vm.qmp_log('blockdev-add',
371 + filters=[iotests.filter_qmp_testfiles],
372 + node_name=drive0.node,
377 + # 0 - Writes and Reference mirror
378 + perform_writes(drive0, 0)
379 + reference_mirror(drive0, 0, fmirror0)
380 + log('--- Add Bitmap ---\n')
381 + vm.qmp_log("block-dirty-bitmap-add", node=drive0.node,
382 + name="bitmap0", granularity=GRANULARITY)
384 + ebitmap = EmulatedBitmap()
386 + # 1 - Writes and Reference mirror
387 + bitmaps = perform_writes(drive0, 1)
388 + ebitmap.dirty_group(1)
389 + bitmap = vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps)
390 + ebitmap.compare(bitmap)
391 + reference_mirror(drive0, 1, fmirror1)
393 + # 1 - Test mirror (w/ Optional induced failure)
394 + if failure == 'intermediate':
395 + # Activate blkdebug induced failure for second-to-next read
396 + log(vm.hmp_qemu_io(drive0.node, 'flush'))
398 + job = mirror(drive0, 1, bsync1, msync_mode,
399 + bitmap="bitmap0", bitmap_mode=bsync_mode)
401 + vm.run_job(job, auto_dismiss=True, auto_finalize=False,
402 + cancel=(failure == 'simulated'))
403 + bitmaps = vm.query_bitmaps()
404 + log({'bitmaps': bitmaps}, indent=2)
407 + if bsync_mode == 'always':
408 + if failure == 'intermediate':
409 + # We manage to copy one sector (one bit) before the error.
410 + ebitmap.clear_bit(ebitmap.first_bit)
412 + # successful mirror / cancelled complete mirror
415 + if bsync_mode == 'on-success' and not failure:
418 + ebitmap.compare(vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps))
420 + # 2 - Reference mirror
421 + reference_mirror(drive0, 2, fmirror2)
423 + # 2 - Bitmap mirror with writes before completion
424 + job = mirror(drive0, 2, bsync2, "bitmap",
425 + bitmap="bitmap0", bitmap_mode=bsync_mode)
427 + bitmaps = perform_writes(drive0, 2)
428 + ebitmap.dirty_group(2)
429 + ebitmap.compare(vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps))
431 + # don't use run_job as that logs too much even with use_log=False
432 + events = [('JOB_STATUS_CHANGE', {'data': {'id': job}})]
434 + ev = iotests.filter_qmp_event(vm.events_wait(events, timeout=10))
435 + status = ev['data']['status']
436 + if status == 'ready':
437 + vm.qmp('job-complete', id=job)
438 + elif status == 'standby':
439 + vm.qmp('job-resume', id=job)
440 + elif status == 'pending':
441 + vm.qmp('job-finalize', id=job)
442 + elif status == 'null':
445 + if bsync_mode != 'never':
448 + bitmaps = vm.query_bitmaps()
449 + ebitmap.compare(vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps))
451 + # 3 - Writes and Reference mirror
452 + bitmaps = perform_writes(drive0, 3)
453 + ebitmap.dirty_group(3)
454 + ebitmap.compare(vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps))
455 + reference_mirror(drive0, 3, fmirror3)
457 + # 3 - Bitmap mirror (In failure modes, this is a recovery.)
458 + job = mirror(drive0, 3, bsync3, "bitmap",
459 + bitmap="bitmap0", bitmap_mode=bsync_mode)
461 + vm.run_job(job, auto_dismiss=True, auto_finalize=False)
462 + bitmaps = vm.query_bitmaps()
464 + log({'bitmaps': bitmaps}, indent=2)
466 + if bsync_mode != 'never':
468 + ebitmap.compare(vm.get_bitmap(drive0.node, 'bitmap0', bitmaps=bitmaps))
470 + log('--- Cleanup ---\n')
471 + vm.qmp_log("block-dirty-bitmap-remove",
472 + node=drive0.node, name="bitmap0")
473 + bitmaps = vm.query_bitmaps()
474 + log({'bitmaps': bitmaps}, indent=2)
478 + log('--- Verification ---\n')
479 + compare_images(bsync1, fmirror1, baseimg=fmirror0,
480 + expected_match=failure != 'intermediate')
481 + if not failure or bsync_mode == 'always':
482 + # Always keep the last mirror on success or when using 'always'
487 + compare_images(bsync2, fmirror2, baseimg=base, expected_match=0)
488 + compare_images(bsync3, fmirror3, baseimg=bsync2)
489 + compare_images(img_path, fmirror3)
492 +def test_mirror_api():
494 + Test malformed and prohibited invocations of the mirror API.
496 + with iotests.FilePaths(['img', 'bsync1']) as \
497 + (img_path, mirror_path), \
498 + iotests.VM() as vm:
500 + log("\n=== API failure tests ===\n")
501 + log('--- Preparing image & VM ---\n')
502 + drive0 = Drive(img_path, vm=vm)
503 + drive0.img_create(iotests.imgfmt, SIZE)
504 + vm.add_device("{},id=scsi0".format(iotests.get_virtio_scsi_device()))
509 + 'filename': drive0.path
512 + drive0.node = 'drive0'
513 + vm.qmp_log('blockdev-add',
514 + filters=[iotests.filter_qmp_testfiles],
515 + node_name=drive0.node,
520 + target0 = Drive(mirror_path, vm=vm)
521 + target0.create_target("mirror_target", drive0.fmt, drive0.size)
524 + vm.qmp_log("block-dirty-bitmap-add", node=drive0.node,
525 + name="bitmap0", granularity=GRANULARITY)
528 + log('-- Testing invalid QMP commands --\n')
532 + None: ['on-success', 'always', 'never', None],
533 + 'bitmap404': ['on-success', 'always', 'never', None],
534 + 'bitmap0': ['always', 'never']
537 + None: ['on-success', 'always', 'never', None],
538 + 'bitmap404': ['on-success', 'always', 'never', None],
542 + None: ['on-success', 'always', 'never'],
543 + 'bitmap404': ['on-success', 'always', 'never', None],
544 + 'bitmap0': ['on-success', 'always', 'never', None],
547 + None: ['on-success', 'always', 'never'],
548 + 'bitmap404': ['on-success', 'always', 'never', None],
549 + 'bitmap0': ['on-success', 'always', 'never', None],
552 + None: ['on-success', 'always', 'never'],
553 + 'bitmap404': ['on-success', 'always', 'never', None],
554 + 'bitmap0': ['on-success', 'always', 'never', None],
558 + # Dicts, as always, are not stably-ordered prior to 3.7, so use tuples:
559 + for sync_mode in ('incremental', 'bitmap', 'full', 'top', 'none'):
560 + log("-- Sync mode {:s} tests --\n".format(sync_mode))
561 + for bitmap in (None, 'bitmap404', 'bitmap0'):
562 + for policy in error_cases[sync_mode][bitmap]:
563 + blockdev_mirror(drive0.vm, drive0.node, "mirror_target",
564 + sync_mode, job_id='api_job',
565 + bitmap=bitmap, bitmap_mode=policy)
570 + for bsync_mode in ("never", "on-success", "always"):
571 + for failure in ("simulated", "intermediate", None):
572 + test_bitmap_sync(bsync_mode, "bitmap", failure)
574 +# for sync_mode in ('full', 'top'):
575 +# for bsync_mode in ('on-success', 'always'):
576 +# for failure in ('simulated', 'intermediate', None):
577 +# test_bitmap_sync(bsync_mode, sync_mode, failure)
581 +if __name__ == '__main__':
582 + iotests.script_main(main, supported_fmts=['qcow2'],
583 + supported_protocols=['file'])
584 diff --git a/tests/qemu-iotests/384.out b/tests/qemu-iotests/384.out
586 index 0000000000..9b7408b6d6
588 +++ b/tests/qemu-iotests/384.out
591 +=== Mode bitmap; Bitmap Sync never with simulated failure ===
593 +--- Preparing image & VM ---
595 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
600 +write -P0x49 0x0000000 0x10000
602 +write -P0x6c 0x0100000 0x10000
604 +write -P0x6f 0x2000000 0x10000
606 +write -P0x76 0x3ff0000 0x10000
612 +--- Reference mirror #0 ---
615 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
619 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
622 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
624 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
626 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
627 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
631 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
636 +write -P0x65 0x0000000 0x10000
638 +write -P0x77 0x00f8000 0x10000
640 +write -P0x72 0x2008000 0x10000
642 +write -P0x69 0x3fe0000 0x10000
650 + "granularity": 65536,
652 + "persistent": false,
660 += Checking Bitmap bitmap0 =
661 +expecting 6 dirty sectors; have 6. OK!
663 +--- Reference mirror #1 ---
666 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
670 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
673 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
675 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
677 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
678 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
680 +--- Test mirror #1 ---
683 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
687 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
690 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
692 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
694 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
695 +{"execute": "job-cancel", "arguments": {"id": "mirror_1"}}
697 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
698 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
705 + "granularity": 65536,
707 + "persistent": false,
715 += Checking Bitmap bitmap0 =
716 +expecting 6 dirty sectors; have 6. OK!
718 +--- Reference mirror #2 ---
721 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
725 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
728 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
730 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
732 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
733 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
735 +--- Test mirror #2 ---
738 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
742 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
745 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
749 +write -P0x74 0x0010000 0x10000
751 +write -P0x69 0x00e8000 0x10000
753 +write -P0x6e 0x2018000 0x10000
755 +write -P0x67 0x3fe0000 0x20000
763 + "granularity": 65536,
764 + "persistent": false,
771 + "granularity": 65536,
773 + "persistent": false,
781 += Checking Bitmap bitmap0 =
782 +expecting 10 dirty sectors; have 10. OK!
784 += Checking Bitmap bitmap0 =
785 +expecting 10 dirty sectors; have 10. OK!
789 +write -P0xaa 0x0010000 0x30000
791 +write -P0xbb 0x00d8000 0x10000
793 +write -P0xcc 0x2028000 0x10000
795 +write -P0xdd 0x3fc0000 0x10000
803 + "granularity": 65536,
805 + "persistent": false,
813 += Checking Bitmap bitmap0 =
814 +expecting 15 dirty sectors; have 15. OK!
816 +--- Reference mirror #3 ---
819 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
823 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
826 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
828 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
830 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
831 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
833 +--- Test mirror #3 ---
836 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
840 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
843 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
845 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
847 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
848 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
850 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
851 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
858 + "granularity": 65536,
860 + "persistent": false,
868 += Checking Bitmap bitmap0 =
869 +expecting 15 dirty sectors; have 15. OK!
873 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
879 +--- Verification ---
881 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
882 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
883 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
884 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
887 +=== Mode bitmap; Bitmap Sync never with intermediate failure ===
889 +--- Preparing image & VM ---
891 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "blkdebug", "image": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "inject-error": [{"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 3}, {"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 4}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}, {"event": "read_aio", "new-state": 4, "state": 3}]}, "node-name": "drive0"}}
896 +write -P0x49 0x0000000 0x10000
898 +write -P0x6c 0x0100000 0x10000
900 +write -P0x6f 0x2000000 0x10000
902 +write -P0x76 0x3ff0000 0x10000
908 +--- Reference mirror #0 ---
911 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
915 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
918 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
920 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
922 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
923 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
927 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
932 +write -P0x65 0x0000000 0x10000
934 +write -P0x77 0x00f8000 0x10000
936 +write -P0x72 0x2008000 0x10000
938 +write -P0x69 0x3fe0000 0x10000
946 + "granularity": 65536,
948 + "persistent": false,
956 += Checking Bitmap bitmap0 =
957 +expecting 6 dirty sectors; have 6. OK!
959 +--- Reference mirror #1 ---
962 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
966 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
969 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
971 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
973 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
974 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
978 +--- Test mirror #1 ---
981 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
985 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
988 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
990 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
991 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
992 +{"data": {"device": "mirror_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
999 + "granularity": 65536,
1000 + "name": "bitmap0",
1001 + "persistent": false,
1002 + "recording": true,
1003 + "status": "active"
1009 += Checking Bitmap bitmap0 =
1010 +expecting 6 dirty sectors; have 6. OK!
1012 +--- Reference mirror #2 ---
1015 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1019 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1022 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
1024 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
1026 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1027 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1029 +--- Test mirror #2 ---
1032 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1036 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1039 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
1043 +write -P0x74 0x0010000 0x10000
1045 +write -P0x69 0x00e8000 0x10000
1047 +write -P0x6e 0x2018000 0x10000
1049 +write -P0x67 0x3fe0000 0x20000
1057 + "granularity": 65536,
1058 + "persistent": false,
1059 + "recording": true,
1060 + "status": "active"
1065 + "granularity": 65536,
1066 + "name": "bitmap0",
1067 + "persistent": false,
1068 + "recording": true,
1069 + "status": "locked"
1075 += Checking Bitmap bitmap0 =
1076 +expecting 10 dirty sectors; have 10. OK!
1078 += Checking Bitmap bitmap0 =
1079 +expecting 10 dirty sectors; have 10. OK!
1083 +write -P0xaa 0x0010000 0x30000
1085 +write -P0xbb 0x00d8000 0x10000
1087 +write -P0xcc 0x2028000 0x10000
1089 +write -P0xdd 0x3fc0000 0x10000
1097 + "granularity": 65536,
1098 + "name": "bitmap0",
1099 + "persistent": false,
1100 + "recording": true,
1101 + "status": "active"
1107 += Checking Bitmap bitmap0 =
1108 +expecting 15 dirty sectors; have 15. OK!
1110 +--- Reference mirror #3 ---
1113 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1117 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1120 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
1122 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
1124 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1125 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1127 +--- Test mirror #3 ---
1130 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1134 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1137 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
1139 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
1141 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1142 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
1144 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1145 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1152 + "granularity": 65536,
1153 + "name": "bitmap0",
1154 + "persistent": false,
1155 + "recording": true,
1156 + "status": "active"
1162 += Checking Bitmap bitmap0 =
1163 +expecting 15 dirty sectors; have 15. OK!
1167 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1173 +--- Verification ---
1175 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Mismatch, OK!
1176 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
1177 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1178 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1181 +=== Mode bitmap; Bitmap Sync never without failure ===
1183 +--- Preparing image & VM ---
1185 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
1190 +write -P0x49 0x0000000 0x10000
1192 +write -P0x6c 0x0100000 0x10000
1194 +write -P0x6f 0x2000000 0x10000
1196 +write -P0x76 0x3ff0000 0x10000
1202 +--- Reference mirror #0 ---
1205 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1209 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1212 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
1214 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
1216 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1217 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1221 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1226 +write -P0x65 0x0000000 0x10000
1228 +write -P0x77 0x00f8000 0x10000
1230 +write -P0x72 0x2008000 0x10000
1232 +write -P0x69 0x3fe0000 0x10000
1240 + "granularity": 65536,
1241 + "name": "bitmap0",
1242 + "persistent": false,
1243 + "recording": true,
1244 + "status": "active"
1250 += Checking Bitmap bitmap0 =
1251 +expecting 6 dirty sectors; have 6. OK!
1253 +--- Reference mirror #1 ---
1256 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1260 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1263 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
1265 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
1267 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1268 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1270 +--- Test mirror #1 ---
1273 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1277 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1280 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
1282 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
1284 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1285 +{"execute": "job-finalize", "arguments": {"id": "mirror_1"}}
1287 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1288 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1295 + "granularity": 65536,
1296 + "name": "bitmap0",
1297 + "persistent": false,
1298 + "recording": true,
1299 + "status": "active"
1305 += Checking Bitmap bitmap0 =
1306 +expecting 6 dirty sectors; have 6. OK!
1308 +--- Reference mirror #2 ---
1311 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1315 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1318 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
1320 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
1322 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1323 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1325 +--- Test mirror #2 ---
1328 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1332 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1335 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
1339 +write -P0x74 0x0010000 0x10000
1341 +write -P0x69 0x00e8000 0x10000
1343 +write -P0x6e 0x2018000 0x10000
1345 +write -P0x67 0x3fe0000 0x20000
1353 + "granularity": 65536,
1354 + "persistent": false,
1355 + "recording": true,
1356 + "status": "active"
1361 + "granularity": 65536,
1362 + "name": "bitmap0",
1363 + "persistent": false,
1364 + "recording": true,
1365 + "status": "locked"
1371 += Checking Bitmap bitmap0 =
1372 +expecting 10 dirty sectors; have 10. OK!
1374 += Checking Bitmap bitmap0 =
1375 +expecting 10 dirty sectors; have 10. OK!
1379 +write -P0xaa 0x0010000 0x30000
1381 +write -P0xbb 0x00d8000 0x10000
1383 +write -P0xcc 0x2028000 0x10000
1385 +write -P0xdd 0x3fc0000 0x10000
1393 + "granularity": 65536,
1394 + "name": "bitmap0",
1395 + "persistent": false,
1396 + "recording": true,
1397 + "status": "active"
1403 += Checking Bitmap bitmap0 =
1404 +expecting 15 dirty sectors; have 15. OK!
1406 +--- Reference mirror #3 ---
1409 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1413 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1416 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
1418 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
1420 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1421 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1423 +--- Test mirror #3 ---
1426 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1430 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1433 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
1435 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
1437 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1438 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
1440 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1441 +{"data": {"device": "mirror_3", "len": 983040, "offset": 983040, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1448 + "granularity": 65536,
1449 + "name": "bitmap0",
1450 + "persistent": false,
1451 + "recording": true,
1452 + "status": "active"
1458 += Checking Bitmap bitmap0 =
1459 +expecting 15 dirty sectors; have 15. OK!
1463 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1469 +--- Verification ---
1471 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
1472 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
1473 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1474 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1477 +=== Mode bitmap; Bitmap Sync on-success with simulated failure ===
1479 +--- Preparing image & VM ---
1481 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
1486 +write -P0x49 0x0000000 0x10000
1488 +write -P0x6c 0x0100000 0x10000
1490 +write -P0x6f 0x2000000 0x10000
1492 +write -P0x76 0x3ff0000 0x10000
1498 +--- Reference mirror #0 ---
1501 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1505 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1508 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
1510 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
1512 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1513 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1517 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1522 +write -P0x65 0x0000000 0x10000
1524 +write -P0x77 0x00f8000 0x10000
1526 +write -P0x72 0x2008000 0x10000
1528 +write -P0x69 0x3fe0000 0x10000
1536 + "granularity": 65536,
1537 + "name": "bitmap0",
1538 + "persistent": false,
1539 + "recording": true,
1540 + "status": "active"
1546 += Checking Bitmap bitmap0 =
1547 +expecting 6 dirty sectors; have 6. OK!
1549 +--- Reference mirror #1 ---
1552 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1556 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1559 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
1561 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
1563 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1564 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1566 +--- Test mirror #1 ---
1569 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1573 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1576 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
1578 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
1580 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1581 +{"execute": "job-cancel", "arguments": {"id": "mirror_1"}}
1583 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1584 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1591 + "granularity": 65536,
1592 + "name": "bitmap0",
1593 + "persistent": false,
1594 + "recording": true,
1595 + "status": "active"
1601 += Checking Bitmap bitmap0 =
1602 +expecting 6 dirty sectors; have 6. OK!
1604 +--- Reference mirror #2 ---
1607 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1611 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1614 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
1616 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
1618 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1619 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1621 +--- Test mirror #2 ---
1624 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1628 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1631 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
1635 +write -P0x74 0x0010000 0x10000
1637 +write -P0x69 0x00e8000 0x10000
1639 +write -P0x6e 0x2018000 0x10000
1641 +write -P0x67 0x3fe0000 0x20000
1649 + "granularity": 65536,
1650 + "persistent": false,
1651 + "recording": true,
1652 + "status": "active"
1657 + "granularity": 65536,
1658 + "name": "bitmap0",
1659 + "persistent": false,
1660 + "recording": true,
1661 + "status": "locked"
1667 += Checking Bitmap bitmap0 =
1668 +expecting 10 dirty sectors; have 10. OK!
1670 += Checking Bitmap bitmap0 =
1671 +expecting 0 dirty sectors; have 0. OK!
1675 +write -P0xaa 0x0010000 0x30000
1677 +write -P0xbb 0x00d8000 0x10000
1679 +write -P0xcc 0x2028000 0x10000
1681 +write -P0xdd 0x3fc0000 0x10000
1689 + "granularity": 65536,
1690 + "name": "bitmap0",
1691 + "persistent": false,
1692 + "recording": true,
1693 + "status": "active"
1699 += Checking Bitmap bitmap0 =
1700 +expecting 8 dirty sectors; have 8. OK!
1702 +--- Reference mirror #3 ---
1705 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1709 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1712 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
1714 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
1716 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1717 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1719 +--- Test mirror #3 ---
1722 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1726 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1729 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
1731 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
1733 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1734 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
1736 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1737 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1744 + "granularity": 65536,
1745 + "name": "bitmap0",
1746 + "persistent": false,
1747 + "recording": true,
1748 + "status": "active"
1754 += Checking Bitmap bitmap0 =
1755 +expecting 0 dirty sectors; have 0. OK!
1759 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1765 +--- Verification ---
1767 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
1768 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
1769 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1770 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
1773 +=== Mode bitmap; Bitmap Sync on-success with intermediate failure ===
1775 +--- Preparing image & VM ---
1777 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "blkdebug", "image": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "inject-error": [{"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 3}, {"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 4}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}, {"event": "read_aio", "new-state": 4, "state": 3}]}, "node-name": "drive0"}}
1782 +write -P0x49 0x0000000 0x10000
1784 +write -P0x6c 0x0100000 0x10000
1786 +write -P0x6f 0x2000000 0x10000
1788 +write -P0x76 0x3ff0000 0x10000
1794 +--- Reference mirror #0 ---
1797 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1801 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1804 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
1806 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
1808 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1809 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1813 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1818 +write -P0x65 0x0000000 0x10000
1820 +write -P0x77 0x00f8000 0x10000
1822 +write -P0x72 0x2008000 0x10000
1824 +write -P0x69 0x3fe0000 0x10000
1832 + "granularity": 65536,
1833 + "name": "bitmap0",
1834 + "persistent": false,
1835 + "recording": true,
1836 + "status": "active"
1842 += Checking Bitmap bitmap0 =
1843 +expecting 6 dirty sectors; have 6. OK!
1845 +--- Reference mirror #1 ---
1848 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1852 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1855 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
1857 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
1859 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1860 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1864 +--- Test mirror #1 ---
1867 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1871 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1874 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
1876 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1877 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1878 +{"data": {"device": "mirror_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1885 + "granularity": 65536,
1886 + "name": "bitmap0",
1887 + "persistent": false,
1888 + "recording": true,
1889 + "status": "active"
1895 += Checking Bitmap bitmap0 =
1896 +expecting 6 dirty sectors; have 6. OK!
1898 +--- Reference mirror #2 ---
1901 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1905 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1908 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
1910 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
1912 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1913 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1915 +--- Test mirror #2 ---
1918 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1922 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1925 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
1929 +write -P0x74 0x0010000 0x10000
1931 +write -P0x69 0x00e8000 0x10000
1933 +write -P0x6e 0x2018000 0x10000
1935 +write -P0x67 0x3fe0000 0x20000
1943 + "granularity": 65536,
1944 + "persistent": false,
1945 + "recording": true,
1946 + "status": "active"
1951 + "granularity": 65536,
1952 + "name": "bitmap0",
1953 + "persistent": false,
1954 + "recording": true,
1955 + "status": "locked"
1961 += Checking Bitmap bitmap0 =
1962 +expecting 10 dirty sectors; have 10. OK!
1964 += Checking Bitmap bitmap0 =
1965 +expecting 0 dirty sectors; have 0. OK!
1969 +write -P0xaa 0x0010000 0x30000
1971 +write -P0xbb 0x00d8000 0x10000
1973 +write -P0xcc 0x2028000 0x10000
1975 +write -P0xdd 0x3fc0000 0x10000
1983 + "granularity": 65536,
1984 + "name": "bitmap0",
1985 + "persistent": false,
1986 + "recording": true,
1987 + "status": "active"
1993 += Checking Bitmap bitmap0 =
1994 +expecting 8 dirty sectors; have 8. OK!
1996 +--- Reference mirror #3 ---
1999 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2003 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2006 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
2008 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
2010 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2011 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2013 +--- Test mirror #3 ---
2016 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2020 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2023 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
2025 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
2027 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2028 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
2030 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2031 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2038 + "granularity": 65536,
2039 + "name": "bitmap0",
2040 + "persistent": false,
2041 + "recording": true,
2042 + "status": "active"
2048 += Checking Bitmap bitmap0 =
2049 +expecting 0 dirty sectors; have 0. OK!
2053 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2059 +--- Verification ---
2061 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Mismatch, OK!
2062 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
2063 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2064 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2067 +=== Mode bitmap; Bitmap Sync on-success without failure ===
2069 +--- Preparing image & VM ---
2071 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2076 +write -P0x49 0x0000000 0x10000
2078 +write -P0x6c 0x0100000 0x10000
2080 +write -P0x6f 0x2000000 0x10000
2082 +write -P0x76 0x3ff0000 0x10000
2088 +--- Reference mirror #0 ---
2091 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2095 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2098 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
2100 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
2102 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2103 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2107 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2112 +write -P0x65 0x0000000 0x10000
2114 +write -P0x77 0x00f8000 0x10000
2116 +write -P0x72 0x2008000 0x10000
2118 +write -P0x69 0x3fe0000 0x10000
2126 + "granularity": 65536,
2127 + "name": "bitmap0",
2128 + "persistent": false,
2129 + "recording": true,
2130 + "status": "active"
2136 += Checking Bitmap bitmap0 =
2137 +expecting 6 dirty sectors; have 6. OK!
2139 +--- Reference mirror #1 ---
2142 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2146 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2149 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
2151 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
2153 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2154 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2156 +--- Test mirror #1 ---
2159 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2163 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2166 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
2168 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
2170 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2171 +{"execute": "job-finalize", "arguments": {"id": "mirror_1"}}
2173 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2174 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2181 + "granularity": 65536,
2182 + "name": "bitmap0",
2183 + "persistent": false,
2184 + "recording": true,
2185 + "status": "active"
2191 += Checking Bitmap bitmap0 =
2192 +expecting 0 dirty sectors; have 0. OK!
2194 +--- Reference mirror #2 ---
2197 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2201 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2204 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
2206 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
2208 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2209 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2211 +--- Test mirror #2 ---
2214 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2218 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2221 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
2225 +write -P0x74 0x0010000 0x10000
2227 +write -P0x69 0x00e8000 0x10000
2229 +write -P0x6e 0x2018000 0x10000
2231 +write -P0x67 0x3fe0000 0x20000
2239 + "granularity": 65536,
2240 + "persistent": false,
2241 + "recording": true,
2242 + "status": "active"
2247 + "granularity": 65536,
2248 + "name": "bitmap0",
2249 + "persistent": false,
2250 + "recording": true,
2251 + "status": "locked"
2257 += Checking Bitmap bitmap0 =
2258 +expecting 7 dirty sectors; have 7. OK!
2260 += Checking Bitmap bitmap0 =
2261 +expecting 0 dirty sectors; have 0. OK!
2265 +write -P0xaa 0x0010000 0x30000
2267 +write -P0xbb 0x00d8000 0x10000
2269 +write -P0xcc 0x2028000 0x10000
2271 +write -P0xdd 0x3fc0000 0x10000
2279 + "granularity": 65536,
2280 + "name": "bitmap0",
2281 + "persistent": false,
2282 + "recording": true,
2283 + "status": "active"
2289 += Checking Bitmap bitmap0 =
2290 +expecting 8 dirty sectors; have 8. OK!
2292 +--- Reference mirror #3 ---
2295 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2299 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2302 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
2304 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
2306 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2307 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2309 +--- Test mirror #3 ---
2312 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2316 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2319 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
2321 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
2323 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2324 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
2326 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2327 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2334 + "granularity": 65536,
2335 + "name": "bitmap0",
2336 + "persistent": false,
2337 + "recording": true,
2338 + "status": "active"
2344 += Checking Bitmap bitmap0 =
2345 +expecting 0 dirty sectors; have 0. OK!
2349 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2355 +--- Verification ---
2357 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
2358 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
2359 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2360 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2363 +=== Mode bitmap; Bitmap Sync always with simulated failure ===
2365 +--- Preparing image & VM ---
2367 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2372 +write -P0x49 0x0000000 0x10000
2374 +write -P0x6c 0x0100000 0x10000
2376 +write -P0x6f 0x2000000 0x10000
2378 +write -P0x76 0x3ff0000 0x10000
2384 +--- Reference mirror #0 ---
2387 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2391 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2394 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
2396 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
2398 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2399 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2403 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2408 +write -P0x65 0x0000000 0x10000
2410 +write -P0x77 0x00f8000 0x10000
2412 +write -P0x72 0x2008000 0x10000
2414 +write -P0x69 0x3fe0000 0x10000
2422 + "granularity": 65536,
2423 + "name": "bitmap0",
2424 + "persistent": false,
2425 + "recording": true,
2426 + "status": "active"
2432 += Checking Bitmap bitmap0 =
2433 +expecting 6 dirty sectors; have 6. OK!
2435 +--- Reference mirror #1 ---
2438 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2442 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2445 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
2447 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
2449 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2450 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2452 +--- Test mirror #1 ---
2455 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2459 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2462 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
2464 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
2466 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2467 +{"execute": "job-cancel", "arguments": {"id": "mirror_1"}}
2469 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2470 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2477 + "granularity": 65536,
2478 + "name": "bitmap0",
2479 + "persistent": false,
2480 + "recording": true,
2481 + "status": "active"
2487 += Checking Bitmap bitmap0 =
2488 +expecting 0 dirty sectors; have 0. OK!
2490 +--- Reference mirror #2 ---
2493 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2497 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2500 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
2502 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
2504 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2505 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2507 +--- Test mirror #2 ---
2510 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2514 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2517 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
2521 +write -P0x74 0x0010000 0x10000
2523 +write -P0x69 0x00e8000 0x10000
2525 +write -P0x6e 0x2018000 0x10000
2527 +write -P0x67 0x3fe0000 0x20000
2535 + "granularity": 65536,
2536 + "persistent": false,
2537 + "recording": true,
2538 + "status": "active"
2543 + "granularity": 65536,
2544 + "name": "bitmap0",
2545 + "persistent": false,
2546 + "recording": true,
2547 + "status": "locked"
2553 += Checking Bitmap bitmap0 =
2554 +expecting 7 dirty sectors; have 7. OK!
2556 += Checking Bitmap bitmap0 =
2557 +expecting 0 dirty sectors; have 0. OK!
2561 +write -P0xaa 0x0010000 0x30000
2563 +write -P0xbb 0x00d8000 0x10000
2565 +write -P0xcc 0x2028000 0x10000
2567 +write -P0xdd 0x3fc0000 0x10000
2575 + "granularity": 65536,
2576 + "name": "bitmap0",
2577 + "persistent": false,
2578 + "recording": true,
2579 + "status": "active"
2585 += Checking Bitmap bitmap0 =
2586 +expecting 8 dirty sectors; have 8. OK!
2588 +--- Reference mirror #3 ---
2591 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2595 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2598 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
2600 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
2602 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2603 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2605 +--- Test mirror #3 ---
2608 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2612 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2615 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
2617 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
2619 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2620 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
2622 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2623 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2630 + "granularity": 65536,
2631 + "name": "bitmap0",
2632 + "persistent": false,
2633 + "recording": true,
2634 + "status": "active"
2640 += Checking Bitmap bitmap0 =
2641 +expecting 0 dirty sectors; have 0. OK!
2645 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2651 +--- Verification ---
2653 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
2654 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
2655 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2656 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2659 +=== Mode bitmap; Bitmap Sync always with intermediate failure ===
2661 +--- Preparing image & VM ---
2663 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "blkdebug", "image": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "inject-error": [{"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 3}, {"errno": 5, "event": "read_aio", "immediately": false, "once": true, "state": 4}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}, {"event": "read_aio", "new-state": 4, "state": 3}]}, "node-name": "drive0"}}
2668 +write -P0x49 0x0000000 0x10000
2670 +write -P0x6c 0x0100000 0x10000
2672 +write -P0x6f 0x2000000 0x10000
2674 +write -P0x76 0x3ff0000 0x10000
2680 +--- Reference mirror #0 ---
2683 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2687 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2690 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
2692 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
2694 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2695 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2699 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2704 +write -P0x65 0x0000000 0x10000
2706 +write -P0x77 0x00f8000 0x10000
2708 +write -P0x72 0x2008000 0x10000
2710 +write -P0x69 0x3fe0000 0x10000
2718 + "granularity": 65536,
2719 + "name": "bitmap0",
2720 + "persistent": false,
2721 + "recording": true,
2722 + "status": "active"
2728 += Checking Bitmap bitmap0 =
2729 +expecting 6 dirty sectors; have 6. OK!
2731 +--- Reference mirror #1 ---
2734 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2738 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2741 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
2743 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
2745 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2746 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2750 +--- Test mirror #1 ---
2753 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2757 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2760 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
2762 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2763 +{"data": {"action": "report", "device": "mirror_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2764 +{"data": {"device": "mirror_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2771 + "granularity": 65536,
2772 + "name": "bitmap0",
2773 + "persistent": false,
2774 + "recording": true,
2775 + "status": "active"
2781 += Checking Bitmap bitmap0 =
2782 +expecting 5 dirty sectors; have 5. OK!
2784 +--- Reference mirror #2 ---
2787 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2791 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2794 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
2796 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
2798 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2799 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2801 +--- Test mirror #2 ---
2804 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2808 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2811 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
2815 +write -P0x74 0x0010000 0x10000
2817 +write -P0x69 0x00e8000 0x10000
2819 +write -P0x6e 0x2018000 0x10000
2821 +write -P0x67 0x3fe0000 0x20000
2829 + "granularity": 65536,
2830 + "persistent": false,
2831 + "recording": true,
2832 + "status": "active"
2837 + "granularity": 65536,
2838 + "name": "bitmap0",
2839 + "persistent": false,
2840 + "recording": true,
2841 + "status": "locked"
2847 += Checking Bitmap bitmap0 =
2848 +expecting 9 dirty sectors; have 9. OK!
2850 += Checking Bitmap bitmap0 =
2851 +expecting 0 dirty sectors; have 0. OK!
2855 +write -P0xaa 0x0010000 0x30000
2857 +write -P0xbb 0x00d8000 0x10000
2859 +write -P0xcc 0x2028000 0x10000
2861 +write -P0xdd 0x3fc0000 0x10000
2869 + "granularity": 65536,
2870 + "name": "bitmap0",
2871 + "persistent": false,
2872 + "recording": true,
2873 + "status": "active"
2879 += Checking Bitmap bitmap0 =
2880 +expecting 8 dirty sectors; have 8. OK!
2882 +--- Reference mirror #3 ---
2885 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2889 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2892 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
2894 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
2896 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2897 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2899 +--- Test mirror #3 ---
2902 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2906 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2909 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
2911 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
2913 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2914 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
2916 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2917 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2924 + "granularity": 65536,
2925 + "name": "bitmap0",
2926 + "persistent": false,
2927 + "recording": true,
2928 + "status": "active"
2934 += Checking Bitmap bitmap0 =
2935 +expecting 0 dirty sectors; have 0. OK!
2939 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2945 +--- Verification ---
2947 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Mismatch, OK!
2948 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
2949 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2950 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
2953 +=== Mode bitmap; Bitmap Sync always without failure ===
2955 +--- Preparing image & VM ---
2957 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2962 +write -P0x49 0x0000000 0x10000
2964 +write -P0x6c 0x0100000 0x10000
2966 +write -P0x6f 0x2000000 0x10000
2968 +write -P0x76 0x3ff0000 0x10000
2974 +--- Reference mirror #0 ---
2977 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2981 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2984 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_0", "sync": "full", "target": "ref_target_0"}}
2986 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_0"}}
2988 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2989 +{"data": {"device": "ref_mirror_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2993 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2998 +write -P0x65 0x0000000 0x10000
3000 +write -P0x77 0x00f8000 0x10000
3002 +write -P0x72 0x2008000 0x10000
3004 +write -P0x69 0x3fe0000 0x10000
3012 + "granularity": 65536,
3013 + "name": "bitmap0",
3014 + "persistent": false,
3015 + "recording": true,
3016 + "status": "active"
3022 += Checking Bitmap bitmap0 =
3023 +expecting 6 dirty sectors; have 6. OK!
3025 +--- Reference mirror #1 ---
3028 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3032 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3035 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_1", "sync": "full", "target": "ref_target_1"}}
3037 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_1"}}
3039 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3040 +{"data": {"device": "ref_mirror_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3042 +--- Test mirror #1 ---
3045 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3049 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3052 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_1", "sync": "bitmap", "target": "mirror_target_1"}}
3054 +{"execute": "job-complete", "arguments": {"id": "mirror_1"}}
3056 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3057 +{"execute": "job-finalize", "arguments": {"id": "mirror_1"}}
3059 +{"data": {"id": "mirror_1", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3060 +{"data": {"device": "mirror_1", "len": 393216, "offset": 393216, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3067 + "granularity": 65536,
3068 + "name": "bitmap0",
3069 + "persistent": false,
3070 + "recording": true,
3071 + "status": "active"
3077 += Checking Bitmap bitmap0 =
3078 +expecting 0 dirty sectors; have 0. OK!
3080 +--- Reference mirror #2 ---
3083 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3087 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3090 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_2", "sync": "full", "target": "ref_target_2"}}
3092 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_2"}}
3094 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3095 +{"data": {"device": "ref_mirror_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3097 +--- Test mirror #2 ---
3100 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3104 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3107 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_2", "sync": "bitmap", "target": "mirror_target_2"}}
3111 +write -P0x74 0x0010000 0x10000
3113 +write -P0x69 0x00e8000 0x10000
3115 +write -P0x6e 0x2018000 0x10000
3117 +write -P0x67 0x3fe0000 0x20000
3125 + "granularity": 65536,
3126 + "persistent": false,
3127 + "recording": true,
3128 + "status": "active"
3133 + "granularity": 65536,
3134 + "name": "bitmap0",
3135 + "persistent": false,
3136 + "recording": true,
3137 + "status": "locked"
3143 += Checking Bitmap bitmap0 =
3144 +expecting 7 dirty sectors; have 7. OK!
3146 += Checking Bitmap bitmap0 =
3147 +expecting 0 dirty sectors; have 0. OK!
3151 +write -P0xaa 0x0010000 0x30000
3153 +write -P0xbb 0x00d8000 0x10000
3155 +write -P0xcc 0x2028000 0x10000
3157 +write -P0xdd 0x3fc0000 0x10000
3165 + "granularity": 65536,
3166 + "name": "bitmap0",
3167 + "persistent": false,
3168 + "recording": true,
3169 + "status": "active"
3175 += Checking Bitmap bitmap0 =
3176 +expecting 8 dirty sectors; have 8. OK!
3178 +--- Reference mirror #3 ---
3181 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3185 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3188 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "ref_mirror_3", "sync": "full", "target": "ref_target_3"}}
3190 +{"execute": "job-complete", "arguments": {"id": "ref_mirror_3"}}
3192 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3193 +{"data": {"device": "ref_mirror_3", "len": 67108864, "offset": 67108864, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3195 +--- Test mirror #3 ---
3198 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3202 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3205 +{"execute": "blockdev-mirror", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "mirror_3", "sync": "bitmap", "target": "mirror_target_3"}}
3207 +{"execute": "job-complete", "arguments": {"id": "mirror_3"}}
3209 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_READY", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3210 +{"execute": "job-finalize", "arguments": {"id": "mirror_3"}}
3212 +{"data": {"id": "mirror_3", "type": "mirror"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3213 +{"data": {"device": "mirror_3", "len": 524288, "offset": 524288, "speed": 0, "type": "mirror"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3220 + "granularity": 65536,
3221 + "name": "bitmap0",
3222 + "persistent": false,
3223 + "recording": true,
3224 + "status": "active"
3230 += Checking Bitmap bitmap0 =
3231 +expecting 0 dirty sectors; have 0. OK!
3235 +{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
3241 +--- Verification ---
3243 +qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fmirror1" ==> Identical, OK!
3244 +qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fmirror2" ==> Mismatch, OK!
3245 +qemu_img compare "TEST_DIR/PID-bsync3" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
3246 +qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
3249 +=== API failure tests ===
3251 +--- Preparing image & VM ---
3253 +{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
3257 +{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3261 +{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3265 +{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
3268 +-- Testing invalid QMP commands --
3270 +-- Sync mode incremental tests --
3272 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3273 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3275 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3276 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3278 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3279 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3281 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3282 +{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
3284 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3285 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3287 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3288 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3290 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3291 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3293 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3294 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3296 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3297 +{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
3299 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
3300 +{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
3302 +-- Sync mode bitmap tests --
3304 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3305 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3307 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3308 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3310 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3311 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3313 +{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3314 +{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'bitmap' sync mode"}}
3316 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3317 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3319 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3320 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3322 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3323 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3325 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3326 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3328 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
3329 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3331 +-- Sync mode full tests --
3333 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3334 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3336 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3337 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3339 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3340 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3342 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3343 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3345 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3346 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3348 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3349 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3351 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3352 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3354 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3355 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3357 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3358 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3360 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3361 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3363 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
3364 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3366 +-- Sync mode top tests --
3368 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3369 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3371 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3372 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3374 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3375 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3377 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3378 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3380 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3381 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3383 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3384 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3386 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3387 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3389 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3390 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3392 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3393 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3395 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3396 +{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
3398 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
3399 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3401 +-- Sync mode none tests --
3403 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3404 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3406 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3407 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3409 +{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3410 +{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
3412 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3413 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3415 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3416 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3418 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3419 +{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
3421 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3422 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3424 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3425 +{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
3427 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3428 +{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
3430 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3431 +{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
3433 +{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
3434 +{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
3436 diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
3437 index 435dccd5af..939efd9c70 100644
3438 --- a/tests/qemu-iotests/group
3439 +++ b/tests/qemu-iotests/group
3442 254 rw backing quick