qemu/tests/qemu-iotests/257.out
Vladimir Sementsov-Ogievskiy af5bcd775f block: copy-before-write: realize snapshot-access API
Current scheme of image fleecing looks like this:

[guest]                    [NBD export]
  |                              |
  |root                          | root
  v                              v
[copy-before-write] -----> [temp.qcow2]
  |                 target  |
  |file                     |backing
  v                         |
[active disk] <-------------+

 - On guest writes copy-before-write filter copies old data from active
   disk to temp.qcow2. So fleecing client (NBD export) when reads
   changed regions from temp.qcow2 image and unchanged from active disk
   through backing link.

This patch makes possible new image fleecing scheme:

[guest]                   [NBD export]
   |                            |
   | root                       | root
   v                 file       v
[copy-before-write]<------[snapshot-access]
   |           |
   | file      | target
   v           v
[active-disk] [temp.img]

 - copy-before-write does CBW operations and also provides
   snapshot-access API. The API may be accessed through
   snapshot-access driver.

Benefits of new scheme:

1. Access control: if remote client try to read data that not covered
   by original dirty bitmap used on copy-before-write open, client gets
   -EACCES.

2. Discard support: if remote client do DISCARD, this additionally to
   discarding data in temp.img informs block-copy process to not copy
   these clusters. Next read from discarded area will return -EACCES.
   This is significant thing: when fleecing user reads data that was
   not yet copied to temp.img, we can avoid copying it on further guest
   write.

3. Synchronisation between client reads and block-copy write is more
   efficient. In old scheme we just rely on BDRV_REQ_SERIALISING flag
   used for writes to temp.qcow2. New scheme is less blocking:
     - fleecing reads are never blocked: if data region is untouched or
       in-flight, we just read from active-disk, otherwise we read from
       temp.img
     - writes to temp.img are not blocked by fleecing reads
     - still, guest writes of-course are blocked by in-flight fleecing
       reads, that currently read from active-disk - it's the minimum
       necessary blocking

4. Temporary image may be of any format, as we don't rely on backing
   feature.

5. Permission relation are simplified. With old scheme we have to share
   write permission on target child of copy-before-write, otherwise
   backing link conflicts with copy-before-write file child write
   permissions. With new scheme we don't have backing link, and
   copy-before-write node may have unshared access to temporary node.
   (Not realized in this commit, will be in future).

6. Having control on fleecing reads we'll be able to implement
   alternative behavior on failed copy-before-write operations.
   Currently we just break guest request (that's a historical behavior
   of backup). But in some scenarios it's a bad behavior: better
   is to drop the backup as failed but don't break guest request.
   With new scheme we can simply unset some bits in a bitmap on CBW
   failure and further fleecing reads will -EACCES, or something like
   this. (Not implemented in this commit, will be in future)
   Additional application for this is implementing timeout for CBW
   operations.

Iotest 257 output is updated, as two more bitmaps now live in
copy-before-write filter.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20220303194349.2304213-13-vsementsov@virtuozzo.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
2022-03-07 09:33:31 +01:00

5392 lines
161 KiB
Plaintext

=== Mode bitmap; Bitmap Sync never with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 655360,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 10 dirty sectors; have 10. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync never with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync never without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 655360,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 10 dirty sectors; have 10. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync on-success with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 655360,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 10 dirty sectors; have 10. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync on-success with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync on-success without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync always with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync always with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 393216, "offset": 65536, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 327680,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 5 dirty sectors; have 5. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 851968,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 13 dirty sectors; have 13. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 851968, "offset": 851968, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode bitmap; Bitmap Sync always without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "bitmap", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync on-success with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 655360,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 10 dirty sectors; have 10. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync on-success with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 67108864, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync on-success without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync always with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync always with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 67108864, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 66125824,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 1009 dirty sectors; have 1009. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 66453504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 1014 dirty sectors; have 1014. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 66453504, "offset": 66453504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode full; Bitmap Sync always without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "full", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync on-success with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 655360,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 10 dirty sectors; have 10. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 983040,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 15 dirty sectors; have 15. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync on-success with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 458752, "offset": 65536, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync on-success without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync always with simulated failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync always with intermediate failure ===
--- Preparing image & VM ---
{"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}], "set-state": [{"event": "flush_to_disk", "new-state": 2, "state": 1}, {"event": "read_aio", "new-state": 3, "state": 2}]}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"return": ""}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "error": "Input/output error", "len": 458752, "offset": 65536, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 917504,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 14 dirty sectors; have 14. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== Mode top; Bitmap Sync always without failure ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
--- Write #0 ---
write -P0x49 0x0000000 0x10000
{"return": ""}
write -P0x6c 0x0100000 0x10000
{"return": ""}
write -P0x6f 0x2000000 0x10000
{"return": ""}
write -P0x76 0x3ff0000 0x10000
{"return": ""}
{
"bitmaps": {}
}
--- Reference Backup #0 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_0", "sync": "full", "target": "ref_target_0", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Add Bitmap ---
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
--- Write #1 ---
write -P0x65 0x0000000 0x10000
{"return": ""}
write -P0x77 0x00f8000 0x10000
{"return": ""}
write -P0x72 0x2008000 0x10000
{"return": ""}
write -P0x69 0x3fe0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
--- Reference Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_1", "sync": "full", "target": "ref_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #1 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_1", "sync": "top", "target": "backup_target_1", "x-perf": {"max-workers": 1}}}
{"return": {}}
--- Write #2 ---
write -P0x74 0x0010000 0x10000
{"return": ""}
write -P0x69 0x00e8000 0x10000
{"return": ""}
write -P0x6e 0x2018000 0x10000
{"return": ""}
write -P0x67 0x3fe0000 0x20000
{"return": ""}
{
"bitmaps": {
"backup-top": [
{
"busy": false,
"count": 67108864,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": false
}
],
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"persistent": false,
"recording": false
},
{
"busy": false,
"count": 458752,
"granularity": 65536,
"persistent": false,
"recording": true
},
{
"busy": true,
"count": 393216,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 6 dirty sectors; have 6. OK!
= Checking Bitmap (anonymous) =
expecting 7 dirty sectors; have 7. OK!
{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
{"return": {}}
{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 458752,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 7 dirty sectors; have 7. OK!
--- Write #3 ---
write -P0xaa 0x0010000 0x30000
{"return": ""}
write -P0xbb 0x00d8000 0x10000
{"return": ""}
write -P0xcc 0x2028000 0x10000
{"return": ""}
write -P0xdd 0x3fc0000 0x10000
{"return": ""}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 786432,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 12 dirty sectors; have 12. OK!
--- Reference Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "ref_backup_2", "sync": "full", "target": "ref_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
--- Test Backup #2 ---
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "blockdev-backup", "arguments": {"auto-finalize": false, "bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "backup_2", "sync": "bitmap", "target": "backup_target_2", "x-perf": {"max-workers": 1}}}
{"return": {}}
{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
{"return": {}}
{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
{
"bitmaps": {
"drive0": [
{
"busy": false,
"count": 0,
"granularity": 65536,
"name": "bitmap0",
"persistent": false,
"recording": true
}
]
}
}
= Checking Bitmap bitmap0 =
expecting 0 dirty sectors; have 0. OK!
--- Cleanup ---
{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
{"return": {}}
{
"bitmaps": {}
}
--- Verification ---
qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
=== API failure tests ===
--- Preparing image & VM ---
{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
{"return": {}}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
{"return": {}}
{}
{}
{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
{"return": {}}
{}
{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
{"return": {}}
-- Testing invalid QMP commands --
-- Sync mode incremental tests --
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "incremental", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
-- Sync mode bitmap tests --
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "bitmap", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
-- Sync mode full tests --
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode 'never' has no meaningful effect when combined with sync mode 'full'"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "full", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
-- Sync mode top tests --
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode 'never' has no meaningful effect when combined with sync mode 'top'"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "top", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
-- Sync mode none tests --
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
{"execute": "blockdev-backup", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "backup-top", "job-id": "api_job", "sync": "none", "target": "backup_target", "x-perf": {"max-workers": 1}}}
{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}