xref: /openbmc/qemu/tests/qemu-iotests/257.out (revision b14df228)
1
2=== Mode bitmap; Bitmap Sync never with simulated failure ===
3
4--- Preparing image & VM ---
5
6{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
7{"return": {}}
8
9--- Write #0 ---
10
11write -P0x49 0x0000000 0x10000
12{"return": ""}
13write -P0x6c 0x0100000 0x10000
14{"return": ""}
15write -P0x6f 0x2000000 0x10000
16{"return": ""}
17write -P0x76 0x3ff0000 0x10000
18{"return": ""}
19{
20  "bitmaps": {}
21}
22
23--- Reference Backup #0 ---
24
25{}
26{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
27{"return": {}}
28{}
29{}
30{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
31{"return": {}}
32{}
33{"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}}}
34{"return": {}}
35{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
36
37--- Add Bitmap ---
38
39{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
40{"return": {}}
41
42--- Write #1 ---
43
44write -P0x65 0x0000000 0x10000
45{"return": ""}
46write -P0x77 0x00f8000 0x10000
47{"return": ""}
48write -P0x72 0x2008000 0x10000
49{"return": ""}
50write -P0x69 0x3fe0000 0x10000
51{"return": ""}
52{
53  "bitmaps": {
54    "drive0": [
55      {
56        "busy": false,
57        "count": 393216,
58        "granularity": 65536,
59        "name": "bitmap0",
60        "persistent": false,
61        "recording": true
62      }
63    ]
64  }
65}
66
67= Checking Bitmap bitmap0 =
68expecting 6 dirty sectors; have 6. OK!
69
70--- Reference Backup #1 ---
71
72{}
73{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
74{"return": {}}
75{}
76{}
77{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
78{"return": {}}
79{}
80{"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}}}
81{"return": {}}
82{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
83
84--- Test Backup #1 ---
85
86{}
87{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
88{"return": {}}
89{}
90{}
91{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
92{"return": {}}
93{}
94{"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}}}
95{"return": {}}
96
97--- Write #2 ---
98
99write -P0x74 0x0010000 0x10000
100{"return": ""}
101write -P0x69 0x00e8000 0x10000
102{"return": ""}
103write -P0x6e 0x2018000 0x10000
104{"return": ""}
105write -P0x67 0x3fe0000 0x20000
106{"return": ""}
107{
108  "bitmaps": {
109    "backup-top": [
110      {
111        "busy": false,
112        "count": 67108864,
113        "granularity": 65536,
114        "persistent": false,
115        "recording": false
116      },
117      {
118        "busy": false,
119        "count": 458752,
120        "granularity": 65536,
121        "persistent": false,
122        "recording": false
123      }
124    ],
125    "drive0": [
126      {
127        "busy": false,
128        "count": 0,
129        "granularity": 65536,
130        "persistent": false,
131        "recording": false
132      },
133      {
134        "busy": false,
135        "count": 458752,
136        "granularity": 65536,
137        "persistent": false,
138        "recording": true
139      },
140      {
141        "busy": true,
142        "count": 393216,
143        "granularity": 65536,
144        "name": "bitmap0",
145        "persistent": false,
146        "recording": true
147      }
148    ]
149  }
150}
151
152= Checking Bitmap bitmap0 =
153expecting 6 dirty sectors; have 6. OK!
154
155= Checking Bitmap (anonymous) =
156expecting 7 dirty sectors; have 7. OK!
157
158{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
159{"return": {}}
160{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
161{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
162{
163  "bitmaps": {
164    "drive0": [
165      {
166        "busy": false,
167        "count": 655360,
168        "granularity": 65536,
169        "name": "bitmap0",
170        "persistent": false,
171        "recording": true
172      }
173    ]
174  }
175}
176
177= Checking Bitmap bitmap0 =
178expecting 10 dirty sectors; have 10. OK!
179
180--- Write #3 ---
181
182write -P0xaa 0x0010000 0x30000
183{"return": ""}
184write -P0xbb 0x00d8000 0x10000
185{"return": ""}
186write -P0xcc 0x2028000 0x10000
187{"return": ""}
188write -P0xdd 0x3fc0000 0x10000
189{"return": ""}
190{
191  "bitmaps": {
192    "drive0": [
193      {
194        "busy": false,
195        "count": 983040,
196        "granularity": 65536,
197        "name": "bitmap0",
198        "persistent": false,
199        "recording": true
200      }
201    ]
202  }
203}
204
205= Checking Bitmap bitmap0 =
206expecting 15 dirty sectors; have 15. OK!
207
208--- Reference Backup #2 ---
209
210{}
211{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
212{"return": {}}
213{}
214{}
215{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
216{"return": {}}
217{}
218{"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}}}
219{"return": {}}
220{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
221
222--- Test Backup #2 ---
223
224{}
225{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
226{"return": {}}
227{}
228{}
229{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
230{"return": {}}
231{}
232{"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}}}
233{"return": {}}
234{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
235{"return": {}}
236{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
237{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
238{
239  "bitmaps": {
240    "drive0": [
241      {
242        "busy": false,
243        "count": 983040,
244        "granularity": 65536,
245        "name": "bitmap0",
246        "persistent": false,
247        "recording": true
248      }
249    ]
250  }
251}
252
253= Checking Bitmap bitmap0 =
254expecting 15 dirty sectors; have 15. OK!
255
256--- Cleanup ---
257
258{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
259{"return": {}}
260{
261  "bitmaps": {}
262}
263
264--- Verification ---
265
266qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
267qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
268qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
269
270
271=== Mode bitmap; Bitmap Sync never with intermediate failure ===
272
273--- Preparing image & VM ---
274
275{"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"}}
276{"return": {}}
277
278--- Write #0 ---
279
280write -P0x49 0x0000000 0x10000
281{"return": ""}
282write -P0x6c 0x0100000 0x10000
283{"return": ""}
284write -P0x6f 0x2000000 0x10000
285{"return": ""}
286write -P0x76 0x3ff0000 0x10000
287{"return": ""}
288{
289  "bitmaps": {}
290}
291
292--- Reference Backup #0 ---
293
294{}
295{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
296{"return": {}}
297{}
298{}
299{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
300{"return": {}}
301{}
302{"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}}}
303{"return": {}}
304{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
305
306--- Add Bitmap ---
307
308{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
309{"return": {}}
310
311--- Write #1 ---
312
313write -P0x65 0x0000000 0x10000
314{"return": ""}
315write -P0x77 0x00f8000 0x10000
316{"return": ""}
317write -P0x72 0x2008000 0x10000
318{"return": ""}
319write -P0x69 0x3fe0000 0x10000
320{"return": ""}
321{
322  "bitmaps": {
323    "drive0": [
324      {
325        "busy": false,
326        "count": 393216,
327        "granularity": 65536,
328        "name": "bitmap0",
329        "persistent": false,
330        "recording": true
331      }
332    ]
333  }
334}
335
336= Checking Bitmap bitmap0 =
337expecting 6 dirty sectors; have 6. OK!
338
339--- Reference Backup #1 ---
340
341{}
342{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
343{"return": {}}
344{}
345{}
346{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
347{"return": {}}
348{}
349{"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}}}
350{"return": {}}
351{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
352
353{"return": ""}
354
355--- Test Backup #1 ---
356
357{}
358{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
359{"return": {}}
360{}
361{}
362{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
363{"return": {}}
364{}
365{"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}}}
366{"return": {}}
367{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
368{"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"}}
369{
370  "bitmaps": {
371    "drive0": [
372      {
373        "busy": false,
374        "count": 393216,
375        "granularity": 65536,
376        "name": "bitmap0",
377        "persistent": false,
378        "recording": true
379      }
380    ]
381  }
382}
383
384= Checking Bitmap bitmap0 =
385expecting 6 dirty sectors; have 6. OK!
386
387--- Write #3 ---
388
389write -P0xaa 0x0010000 0x30000
390{"return": ""}
391write -P0xbb 0x00d8000 0x10000
392{"return": ""}
393write -P0xcc 0x2028000 0x10000
394{"return": ""}
395write -P0xdd 0x3fc0000 0x10000
396{"return": ""}
397{
398  "bitmaps": {
399    "drive0": [
400      {
401        "busy": false,
402        "count": 917504,
403        "granularity": 65536,
404        "name": "bitmap0",
405        "persistent": false,
406        "recording": true
407      }
408    ]
409  }
410}
411
412= Checking Bitmap bitmap0 =
413expecting 14 dirty sectors; have 14. OK!
414
415--- Reference Backup #2 ---
416
417{}
418{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
419{"return": {}}
420{}
421{}
422{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
423{"return": {}}
424{}
425{"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}}}
426{"return": {}}
427{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
428
429--- Test Backup #2 ---
430
431{}
432{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
433{"return": {}}
434{}
435{}
436{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
437{"return": {}}
438{}
439{"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}}}
440{"return": {}}
441{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
442{"return": {}}
443{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
444{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
445{
446  "bitmaps": {
447    "drive0": [
448      {
449        "busy": false,
450        "count": 917504,
451        "granularity": 65536,
452        "name": "bitmap0",
453        "persistent": false,
454        "recording": true
455      }
456    ]
457  }
458}
459
460= Checking Bitmap bitmap0 =
461expecting 14 dirty sectors; have 14. OK!
462
463--- Cleanup ---
464
465{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
466{"return": {}}
467{
468  "bitmaps": {}
469}
470
471--- Verification ---
472
473qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
474qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
475qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
476
477
478=== Mode bitmap; Bitmap Sync never without failure ===
479
480--- Preparing image & VM ---
481
482{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
483{"return": {}}
484
485--- Write #0 ---
486
487write -P0x49 0x0000000 0x10000
488{"return": ""}
489write -P0x6c 0x0100000 0x10000
490{"return": ""}
491write -P0x6f 0x2000000 0x10000
492{"return": ""}
493write -P0x76 0x3ff0000 0x10000
494{"return": ""}
495{
496  "bitmaps": {}
497}
498
499--- Reference Backup #0 ---
500
501{}
502{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
503{"return": {}}
504{}
505{}
506{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
507{"return": {}}
508{}
509{"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}}}
510{"return": {}}
511{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
512
513--- Add Bitmap ---
514
515{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
516{"return": {}}
517
518--- Write #1 ---
519
520write -P0x65 0x0000000 0x10000
521{"return": ""}
522write -P0x77 0x00f8000 0x10000
523{"return": ""}
524write -P0x72 0x2008000 0x10000
525{"return": ""}
526write -P0x69 0x3fe0000 0x10000
527{"return": ""}
528{
529  "bitmaps": {
530    "drive0": [
531      {
532        "busy": false,
533        "count": 393216,
534        "granularity": 65536,
535        "name": "bitmap0",
536        "persistent": false,
537        "recording": true
538      }
539    ]
540  }
541}
542
543= Checking Bitmap bitmap0 =
544expecting 6 dirty sectors; have 6. OK!
545
546--- Reference Backup #1 ---
547
548{}
549{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
550{"return": {}}
551{}
552{}
553{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
554{"return": {}}
555{}
556{"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}}}
557{"return": {}}
558{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
559
560--- Test Backup #1 ---
561
562{}
563{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
564{"return": {}}
565{}
566{}
567{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
568{"return": {}}
569{}
570{"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}}}
571{"return": {}}
572
573--- Write #2 ---
574
575write -P0x74 0x0010000 0x10000
576{"return": ""}
577write -P0x69 0x00e8000 0x10000
578{"return": ""}
579write -P0x6e 0x2018000 0x10000
580{"return": ""}
581write -P0x67 0x3fe0000 0x20000
582{"return": ""}
583{
584  "bitmaps": {
585    "backup-top": [
586      {
587        "busy": false,
588        "count": 67108864,
589        "granularity": 65536,
590        "persistent": false,
591        "recording": false
592      },
593      {
594        "busy": false,
595        "count": 458752,
596        "granularity": 65536,
597        "persistent": false,
598        "recording": false
599      }
600    ],
601    "drive0": [
602      {
603        "busy": false,
604        "count": 0,
605        "granularity": 65536,
606        "persistent": false,
607        "recording": false
608      },
609      {
610        "busy": false,
611        "count": 458752,
612        "granularity": 65536,
613        "persistent": false,
614        "recording": true
615      },
616      {
617        "busy": true,
618        "count": 393216,
619        "granularity": 65536,
620        "name": "bitmap0",
621        "persistent": false,
622        "recording": true
623      }
624    ]
625  }
626}
627
628= Checking Bitmap bitmap0 =
629expecting 6 dirty sectors; have 6. OK!
630
631= Checking Bitmap (anonymous) =
632expecting 7 dirty sectors; have 7. OK!
633
634{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
635{"return": {}}
636{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
637{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
638{
639  "bitmaps": {
640    "drive0": [
641      {
642        "busy": false,
643        "count": 655360,
644        "granularity": 65536,
645        "name": "bitmap0",
646        "persistent": false,
647        "recording": true
648      }
649    ]
650  }
651}
652
653= Checking Bitmap bitmap0 =
654expecting 10 dirty sectors; have 10. OK!
655
656--- Write #3 ---
657
658write -P0xaa 0x0010000 0x30000
659{"return": ""}
660write -P0xbb 0x00d8000 0x10000
661{"return": ""}
662write -P0xcc 0x2028000 0x10000
663{"return": ""}
664write -P0xdd 0x3fc0000 0x10000
665{"return": ""}
666{
667  "bitmaps": {
668    "drive0": [
669      {
670        "busy": false,
671        "count": 983040,
672        "granularity": 65536,
673        "name": "bitmap0",
674        "persistent": false,
675        "recording": true
676      }
677    ]
678  }
679}
680
681= Checking Bitmap bitmap0 =
682expecting 15 dirty sectors; have 15. OK!
683
684--- Reference Backup #2 ---
685
686{}
687{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
688{"return": {}}
689{}
690{}
691{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
692{"return": {}}
693{}
694{"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}}}
695{"return": {}}
696{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
697
698--- Test Backup #2 ---
699
700{}
701{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
702{"return": {}}
703{}
704{}
705{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
706{"return": {}}
707{}
708{"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}}}
709{"return": {}}
710{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
711{"return": {}}
712{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
713{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
714{
715  "bitmaps": {
716    "drive0": [
717      {
718        "busy": false,
719        "count": 983040,
720        "granularity": 65536,
721        "name": "bitmap0",
722        "persistent": false,
723        "recording": true
724      }
725    ]
726  }
727}
728
729= Checking Bitmap bitmap0 =
730expecting 15 dirty sectors; have 15. OK!
731
732--- Cleanup ---
733
734{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
735{"return": {}}
736{
737  "bitmaps": {}
738}
739
740--- Verification ---
741
742qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
743qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
744qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
745
746
747=== Mode bitmap; Bitmap Sync on-success with simulated failure ===
748
749--- Preparing image & VM ---
750
751{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
752{"return": {}}
753
754--- Write #0 ---
755
756write -P0x49 0x0000000 0x10000
757{"return": ""}
758write -P0x6c 0x0100000 0x10000
759{"return": ""}
760write -P0x6f 0x2000000 0x10000
761{"return": ""}
762write -P0x76 0x3ff0000 0x10000
763{"return": ""}
764{
765  "bitmaps": {}
766}
767
768--- Reference Backup #0 ---
769
770{}
771{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
772{"return": {}}
773{}
774{}
775{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
776{"return": {}}
777{}
778{"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}}}
779{"return": {}}
780{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
781
782--- Add Bitmap ---
783
784{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
785{"return": {}}
786
787--- Write #1 ---
788
789write -P0x65 0x0000000 0x10000
790{"return": ""}
791write -P0x77 0x00f8000 0x10000
792{"return": ""}
793write -P0x72 0x2008000 0x10000
794{"return": ""}
795write -P0x69 0x3fe0000 0x10000
796{"return": ""}
797{
798  "bitmaps": {
799    "drive0": [
800      {
801        "busy": false,
802        "count": 393216,
803        "granularity": 65536,
804        "name": "bitmap0",
805        "persistent": false,
806        "recording": true
807      }
808    ]
809  }
810}
811
812= Checking Bitmap bitmap0 =
813expecting 6 dirty sectors; have 6. OK!
814
815--- Reference Backup #1 ---
816
817{}
818{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
819{"return": {}}
820{}
821{}
822{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
823{"return": {}}
824{}
825{"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}}}
826{"return": {}}
827{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
828
829--- Test Backup #1 ---
830
831{}
832{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
833{"return": {}}
834{}
835{}
836{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
837{"return": {}}
838{}
839{"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}}}
840{"return": {}}
841
842--- Write #2 ---
843
844write -P0x74 0x0010000 0x10000
845{"return": ""}
846write -P0x69 0x00e8000 0x10000
847{"return": ""}
848write -P0x6e 0x2018000 0x10000
849{"return": ""}
850write -P0x67 0x3fe0000 0x20000
851{"return": ""}
852{
853  "bitmaps": {
854    "backup-top": [
855      {
856        "busy": false,
857        "count": 67108864,
858        "granularity": 65536,
859        "persistent": false,
860        "recording": false
861      },
862      {
863        "busy": false,
864        "count": 458752,
865        "granularity": 65536,
866        "persistent": false,
867        "recording": false
868      }
869    ],
870    "drive0": [
871      {
872        "busy": false,
873        "count": 0,
874        "granularity": 65536,
875        "persistent": false,
876        "recording": false
877      },
878      {
879        "busy": false,
880        "count": 458752,
881        "granularity": 65536,
882        "persistent": false,
883        "recording": true
884      },
885      {
886        "busy": true,
887        "count": 393216,
888        "granularity": 65536,
889        "name": "bitmap0",
890        "persistent": false,
891        "recording": true
892      }
893    ]
894  }
895}
896
897= Checking Bitmap bitmap0 =
898expecting 6 dirty sectors; have 6. OK!
899
900= Checking Bitmap (anonymous) =
901expecting 7 dirty sectors; have 7. OK!
902
903{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
904{"return": {}}
905{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
906{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
907{
908  "bitmaps": {
909    "drive0": [
910      {
911        "busy": false,
912        "count": 655360,
913        "granularity": 65536,
914        "name": "bitmap0",
915        "persistent": false,
916        "recording": true
917      }
918    ]
919  }
920}
921
922= Checking Bitmap bitmap0 =
923expecting 10 dirty sectors; have 10. OK!
924
925--- Write #3 ---
926
927write -P0xaa 0x0010000 0x30000
928{"return": ""}
929write -P0xbb 0x00d8000 0x10000
930{"return": ""}
931write -P0xcc 0x2028000 0x10000
932{"return": ""}
933write -P0xdd 0x3fc0000 0x10000
934{"return": ""}
935{
936  "bitmaps": {
937    "drive0": [
938      {
939        "busy": false,
940        "count": 983040,
941        "granularity": 65536,
942        "name": "bitmap0",
943        "persistent": false,
944        "recording": true
945      }
946    ]
947  }
948}
949
950= Checking Bitmap bitmap0 =
951expecting 15 dirty sectors; have 15. OK!
952
953--- Reference Backup #2 ---
954
955{}
956{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
957{"return": {}}
958{}
959{}
960{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
961{"return": {}}
962{}
963{"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}}}
964{"return": {}}
965{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
966
967--- Test Backup #2 ---
968
969{}
970{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
971{"return": {}}
972{}
973{}
974{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
975{"return": {}}
976{}
977{"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}}}
978{"return": {}}
979{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
980{"return": {}}
981{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
982{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
983{
984  "bitmaps": {
985    "drive0": [
986      {
987        "busy": false,
988        "count": 0,
989        "granularity": 65536,
990        "name": "bitmap0",
991        "persistent": false,
992        "recording": true
993      }
994    ]
995  }
996}
997
998= Checking Bitmap bitmap0 =
999expecting 0 dirty sectors; have 0. OK!
1000
1001--- Cleanup ---
1002
1003{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1004{"return": {}}
1005{
1006  "bitmaps": {}
1007}
1008
1009--- Verification ---
1010
1011qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
1012qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1013qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1014
1015
1016=== Mode bitmap; Bitmap Sync on-success with intermediate failure ===
1017
1018--- Preparing image & VM ---
1019
1020{"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"}}
1021{"return": {}}
1022
1023--- Write #0 ---
1024
1025write -P0x49 0x0000000 0x10000
1026{"return": ""}
1027write -P0x6c 0x0100000 0x10000
1028{"return": ""}
1029write -P0x6f 0x2000000 0x10000
1030{"return": ""}
1031write -P0x76 0x3ff0000 0x10000
1032{"return": ""}
1033{
1034  "bitmaps": {}
1035}
1036
1037--- Reference Backup #0 ---
1038
1039{}
1040{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1041{"return": {}}
1042{}
1043{}
1044{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1045{"return": {}}
1046{}
1047{"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}}}
1048{"return": {}}
1049{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1050
1051--- Add Bitmap ---
1052
1053{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1054{"return": {}}
1055
1056--- Write #1 ---
1057
1058write -P0x65 0x0000000 0x10000
1059{"return": ""}
1060write -P0x77 0x00f8000 0x10000
1061{"return": ""}
1062write -P0x72 0x2008000 0x10000
1063{"return": ""}
1064write -P0x69 0x3fe0000 0x10000
1065{"return": ""}
1066{
1067  "bitmaps": {
1068    "drive0": [
1069      {
1070        "busy": false,
1071        "count": 393216,
1072        "granularity": 65536,
1073        "name": "bitmap0",
1074        "persistent": false,
1075        "recording": true
1076      }
1077    ]
1078  }
1079}
1080
1081= Checking Bitmap bitmap0 =
1082expecting 6 dirty sectors; have 6. OK!
1083
1084--- Reference Backup #1 ---
1085
1086{}
1087{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1088{"return": {}}
1089{}
1090{}
1091{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1092{"return": {}}
1093{}
1094{"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}}}
1095{"return": {}}
1096{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1097
1098{"return": ""}
1099
1100--- Test Backup #1 ---
1101
1102{}
1103{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1104{"return": {}}
1105{}
1106{}
1107{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1108{"return": {}}
1109{}
1110{"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}}}
1111{"return": {}}
1112{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1113{"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"}}
1114{
1115  "bitmaps": {
1116    "drive0": [
1117      {
1118        "busy": false,
1119        "count": 393216,
1120        "granularity": 65536,
1121        "name": "bitmap0",
1122        "persistent": false,
1123        "recording": true
1124      }
1125    ]
1126  }
1127}
1128
1129= Checking Bitmap bitmap0 =
1130expecting 6 dirty sectors; have 6. OK!
1131
1132--- Write #3 ---
1133
1134write -P0xaa 0x0010000 0x30000
1135{"return": ""}
1136write -P0xbb 0x00d8000 0x10000
1137{"return": ""}
1138write -P0xcc 0x2028000 0x10000
1139{"return": ""}
1140write -P0xdd 0x3fc0000 0x10000
1141{"return": ""}
1142{
1143  "bitmaps": {
1144    "drive0": [
1145      {
1146        "busy": false,
1147        "count": 917504,
1148        "granularity": 65536,
1149        "name": "bitmap0",
1150        "persistent": false,
1151        "recording": true
1152      }
1153    ]
1154  }
1155}
1156
1157= Checking Bitmap bitmap0 =
1158expecting 14 dirty sectors; have 14. OK!
1159
1160--- Reference Backup #2 ---
1161
1162{}
1163{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1164{"return": {}}
1165{}
1166{}
1167{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1168{"return": {}}
1169{}
1170{"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}}}
1171{"return": {}}
1172{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1173
1174--- Test Backup #2 ---
1175
1176{}
1177{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1178{"return": {}}
1179{}
1180{}
1181{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1182{"return": {}}
1183{}
1184{"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}}}
1185{"return": {}}
1186{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
1187{"return": {}}
1188{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1189{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1190{
1191  "bitmaps": {
1192    "drive0": [
1193      {
1194        "busy": false,
1195        "count": 0,
1196        "granularity": 65536,
1197        "name": "bitmap0",
1198        "persistent": false,
1199        "recording": true
1200      }
1201    ]
1202  }
1203}
1204
1205= Checking Bitmap bitmap0 =
1206expecting 0 dirty sectors; have 0. OK!
1207
1208--- Cleanup ---
1209
1210{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1211{"return": {}}
1212{
1213  "bitmaps": {}
1214}
1215
1216--- Verification ---
1217
1218qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
1219qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1220qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1221
1222
1223=== Mode bitmap; Bitmap Sync on-success without failure ===
1224
1225--- Preparing image & VM ---
1226
1227{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
1228{"return": {}}
1229
1230--- Write #0 ---
1231
1232write -P0x49 0x0000000 0x10000
1233{"return": ""}
1234write -P0x6c 0x0100000 0x10000
1235{"return": ""}
1236write -P0x6f 0x2000000 0x10000
1237{"return": ""}
1238write -P0x76 0x3ff0000 0x10000
1239{"return": ""}
1240{
1241  "bitmaps": {}
1242}
1243
1244--- Reference Backup #0 ---
1245
1246{}
1247{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1248{"return": {}}
1249{}
1250{}
1251{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1252{"return": {}}
1253{}
1254{"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}}}
1255{"return": {}}
1256{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1257
1258--- Add Bitmap ---
1259
1260{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1261{"return": {}}
1262
1263--- Write #1 ---
1264
1265write -P0x65 0x0000000 0x10000
1266{"return": ""}
1267write -P0x77 0x00f8000 0x10000
1268{"return": ""}
1269write -P0x72 0x2008000 0x10000
1270{"return": ""}
1271write -P0x69 0x3fe0000 0x10000
1272{"return": ""}
1273{
1274  "bitmaps": {
1275    "drive0": [
1276      {
1277        "busy": false,
1278        "count": 393216,
1279        "granularity": 65536,
1280        "name": "bitmap0",
1281        "persistent": false,
1282        "recording": true
1283      }
1284    ]
1285  }
1286}
1287
1288= Checking Bitmap bitmap0 =
1289expecting 6 dirty sectors; have 6. OK!
1290
1291--- Reference Backup #1 ---
1292
1293{}
1294{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1295{"return": {}}
1296{}
1297{}
1298{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1299{"return": {}}
1300{}
1301{"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}}}
1302{"return": {}}
1303{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1304
1305--- Test Backup #1 ---
1306
1307{}
1308{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1309{"return": {}}
1310{}
1311{}
1312{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1313{"return": {}}
1314{}
1315{"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}}}
1316{"return": {}}
1317
1318--- Write #2 ---
1319
1320write -P0x74 0x0010000 0x10000
1321{"return": ""}
1322write -P0x69 0x00e8000 0x10000
1323{"return": ""}
1324write -P0x6e 0x2018000 0x10000
1325{"return": ""}
1326write -P0x67 0x3fe0000 0x20000
1327{"return": ""}
1328{
1329  "bitmaps": {
1330    "backup-top": [
1331      {
1332        "busy": false,
1333        "count": 67108864,
1334        "granularity": 65536,
1335        "persistent": false,
1336        "recording": false
1337      },
1338      {
1339        "busy": false,
1340        "count": 458752,
1341        "granularity": 65536,
1342        "persistent": false,
1343        "recording": false
1344      }
1345    ],
1346    "drive0": [
1347      {
1348        "busy": false,
1349        "count": 0,
1350        "granularity": 65536,
1351        "persistent": false,
1352        "recording": false
1353      },
1354      {
1355        "busy": false,
1356        "count": 458752,
1357        "granularity": 65536,
1358        "persistent": false,
1359        "recording": true
1360      },
1361      {
1362        "busy": true,
1363        "count": 393216,
1364        "granularity": 65536,
1365        "name": "bitmap0",
1366        "persistent": false,
1367        "recording": true
1368      }
1369    ]
1370  }
1371}
1372
1373= Checking Bitmap bitmap0 =
1374expecting 6 dirty sectors; have 6. OK!
1375
1376= Checking Bitmap (anonymous) =
1377expecting 7 dirty sectors; have 7. OK!
1378
1379{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
1380{"return": {}}
1381{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1382{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1383{
1384  "bitmaps": {
1385    "drive0": [
1386      {
1387        "busy": false,
1388        "count": 458752,
1389        "granularity": 65536,
1390        "name": "bitmap0",
1391        "persistent": false,
1392        "recording": true
1393      }
1394    ]
1395  }
1396}
1397
1398= Checking Bitmap bitmap0 =
1399expecting 7 dirty sectors; have 7. OK!
1400
1401--- Write #3 ---
1402
1403write -P0xaa 0x0010000 0x30000
1404{"return": ""}
1405write -P0xbb 0x00d8000 0x10000
1406{"return": ""}
1407write -P0xcc 0x2028000 0x10000
1408{"return": ""}
1409write -P0xdd 0x3fc0000 0x10000
1410{"return": ""}
1411{
1412  "bitmaps": {
1413    "drive0": [
1414      {
1415        "busy": false,
1416        "count": 786432,
1417        "granularity": 65536,
1418        "name": "bitmap0",
1419        "persistent": false,
1420        "recording": true
1421      }
1422    ]
1423  }
1424}
1425
1426= Checking Bitmap bitmap0 =
1427expecting 12 dirty sectors; have 12. OK!
1428
1429--- Reference Backup #2 ---
1430
1431{}
1432{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1433{"return": {}}
1434{}
1435{}
1436{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1437{"return": {}}
1438{}
1439{"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}}}
1440{"return": {}}
1441{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1442
1443--- Test Backup #2 ---
1444
1445{}
1446{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1447{"return": {}}
1448{}
1449{}
1450{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1451{"return": {}}
1452{}
1453{"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}}}
1454{"return": {}}
1455{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
1456{"return": {}}
1457{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1458{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1459{
1460  "bitmaps": {
1461    "drive0": [
1462      {
1463        "busy": false,
1464        "count": 0,
1465        "granularity": 65536,
1466        "name": "bitmap0",
1467        "persistent": false,
1468        "recording": true
1469      }
1470    ]
1471  }
1472}
1473
1474= Checking Bitmap bitmap0 =
1475expecting 0 dirty sectors; have 0. OK!
1476
1477--- Cleanup ---
1478
1479{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1480{"return": {}}
1481{
1482  "bitmaps": {}
1483}
1484
1485--- Verification ---
1486
1487qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
1488qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1489qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1490
1491
1492=== Mode bitmap; Bitmap Sync always with simulated failure ===
1493
1494--- Preparing image & VM ---
1495
1496{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
1497{"return": {}}
1498
1499--- Write #0 ---
1500
1501write -P0x49 0x0000000 0x10000
1502{"return": ""}
1503write -P0x6c 0x0100000 0x10000
1504{"return": ""}
1505write -P0x6f 0x2000000 0x10000
1506{"return": ""}
1507write -P0x76 0x3ff0000 0x10000
1508{"return": ""}
1509{
1510  "bitmaps": {}
1511}
1512
1513--- Reference Backup #0 ---
1514
1515{}
1516{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1517{"return": {}}
1518{}
1519{}
1520{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1521{"return": {}}
1522{}
1523{"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}}}
1524{"return": {}}
1525{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1526
1527--- Add Bitmap ---
1528
1529{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1530{"return": {}}
1531
1532--- Write #1 ---
1533
1534write -P0x65 0x0000000 0x10000
1535{"return": ""}
1536write -P0x77 0x00f8000 0x10000
1537{"return": ""}
1538write -P0x72 0x2008000 0x10000
1539{"return": ""}
1540write -P0x69 0x3fe0000 0x10000
1541{"return": ""}
1542{
1543  "bitmaps": {
1544    "drive0": [
1545      {
1546        "busy": false,
1547        "count": 393216,
1548        "granularity": 65536,
1549        "name": "bitmap0",
1550        "persistent": false,
1551        "recording": true
1552      }
1553    ]
1554  }
1555}
1556
1557= Checking Bitmap bitmap0 =
1558expecting 6 dirty sectors; have 6. OK!
1559
1560--- Reference Backup #1 ---
1561
1562{}
1563{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1564{"return": {}}
1565{}
1566{}
1567{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1568{"return": {}}
1569{}
1570{"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}}}
1571{"return": {}}
1572{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1573
1574--- Test Backup #1 ---
1575
1576{}
1577{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1578{"return": {}}
1579{}
1580{}
1581{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1582{"return": {}}
1583{}
1584{"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}}}
1585{"return": {}}
1586
1587--- Write #2 ---
1588
1589write -P0x74 0x0010000 0x10000
1590{"return": ""}
1591write -P0x69 0x00e8000 0x10000
1592{"return": ""}
1593write -P0x6e 0x2018000 0x10000
1594{"return": ""}
1595write -P0x67 0x3fe0000 0x20000
1596{"return": ""}
1597{
1598  "bitmaps": {
1599    "backup-top": [
1600      {
1601        "busy": false,
1602        "count": 67108864,
1603        "granularity": 65536,
1604        "persistent": false,
1605        "recording": false
1606      },
1607      {
1608        "busy": false,
1609        "count": 458752,
1610        "granularity": 65536,
1611        "persistent": false,
1612        "recording": false
1613      }
1614    ],
1615    "drive0": [
1616      {
1617        "busy": false,
1618        "count": 0,
1619        "granularity": 65536,
1620        "persistent": false,
1621        "recording": false
1622      },
1623      {
1624        "busy": false,
1625        "count": 458752,
1626        "granularity": 65536,
1627        "persistent": false,
1628        "recording": true
1629      },
1630      {
1631        "busy": true,
1632        "count": 393216,
1633        "granularity": 65536,
1634        "name": "bitmap0",
1635        "persistent": false,
1636        "recording": true
1637      }
1638    ]
1639  }
1640}
1641
1642= Checking Bitmap bitmap0 =
1643expecting 6 dirty sectors; have 6. OK!
1644
1645= Checking Bitmap (anonymous) =
1646expecting 7 dirty sectors; have 7. OK!
1647
1648{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
1649{"return": {}}
1650{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1651{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1652{
1653  "bitmaps": {
1654    "drive0": [
1655      {
1656        "busy": false,
1657        "count": 458752,
1658        "granularity": 65536,
1659        "name": "bitmap0",
1660        "persistent": false,
1661        "recording": true
1662      }
1663    ]
1664  }
1665}
1666
1667= Checking Bitmap bitmap0 =
1668expecting 7 dirty sectors; have 7. OK!
1669
1670--- Write #3 ---
1671
1672write -P0xaa 0x0010000 0x30000
1673{"return": ""}
1674write -P0xbb 0x00d8000 0x10000
1675{"return": ""}
1676write -P0xcc 0x2028000 0x10000
1677{"return": ""}
1678write -P0xdd 0x3fc0000 0x10000
1679{"return": ""}
1680{
1681  "bitmaps": {
1682    "drive0": [
1683      {
1684        "busy": false,
1685        "count": 786432,
1686        "granularity": 65536,
1687        "name": "bitmap0",
1688        "persistent": false,
1689        "recording": true
1690      }
1691    ]
1692  }
1693}
1694
1695= Checking Bitmap bitmap0 =
1696expecting 12 dirty sectors; have 12. OK!
1697
1698--- Reference Backup #2 ---
1699
1700{}
1701{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1702{"return": {}}
1703{}
1704{}
1705{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1706{"return": {}}
1707{}
1708{"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}}}
1709{"return": {}}
1710{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1711
1712--- Test Backup #2 ---
1713
1714{}
1715{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1716{"return": {}}
1717{}
1718{}
1719{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1720{"return": {}}
1721{}
1722{"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}}}
1723{"return": {}}
1724{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
1725{"return": {}}
1726{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1727{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1728{
1729  "bitmaps": {
1730    "drive0": [
1731      {
1732        "busy": false,
1733        "count": 0,
1734        "granularity": 65536,
1735        "name": "bitmap0",
1736        "persistent": false,
1737        "recording": true
1738      }
1739    ]
1740  }
1741}
1742
1743= Checking Bitmap bitmap0 =
1744expecting 0 dirty sectors; have 0. OK!
1745
1746--- Cleanup ---
1747
1748{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1749{"return": {}}
1750{
1751  "bitmaps": {}
1752}
1753
1754--- Verification ---
1755
1756qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
1757qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1758qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1759
1760
1761=== Mode bitmap; Bitmap Sync always with intermediate failure ===
1762
1763--- Preparing image & VM ---
1764
1765{"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"}}
1766{"return": {}}
1767
1768--- Write #0 ---
1769
1770write -P0x49 0x0000000 0x10000
1771{"return": ""}
1772write -P0x6c 0x0100000 0x10000
1773{"return": ""}
1774write -P0x6f 0x2000000 0x10000
1775{"return": ""}
1776write -P0x76 0x3ff0000 0x10000
1777{"return": ""}
1778{
1779  "bitmaps": {}
1780}
1781
1782--- Reference Backup #0 ---
1783
1784{}
1785{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1786{"return": {}}
1787{}
1788{}
1789{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1790{"return": {}}
1791{}
1792{"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}}}
1793{"return": {}}
1794{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1795
1796--- Add Bitmap ---
1797
1798{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
1799{"return": {}}
1800
1801--- Write #1 ---
1802
1803write -P0x65 0x0000000 0x10000
1804{"return": ""}
1805write -P0x77 0x00f8000 0x10000
1806{"return": ""}
1807write -P0x72 0x2008000 0x10000
1808{"return": ""}
1809write -P0x69 0x3fe0000 0x10000
1810{"return": ""}
1811{
1812  "bitmaps": {
1813    "drive0": [
1814      {
1815        "busy": false,
1816        "count": 393216,
1817        "granularity": 65536,
1818        "name": "bitmap0",
1819        "persistent": false,
1820        "recording": true
1821      }
1822    ]
1823  }
1824}
1825
1826= Checking Bitmap bitmap0 =
1827expecting 6 dirty sectors; have 6. OK!
1828
1829--- Reference Backup #1 ---
1830
1831{}
1832{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1833{"return": {}}
1834{}
1835{}
1836{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1837{"return": {}}
1838{}
1839{"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}}}
1840{"return": {}}
1841{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1842
1843{"return": ""}
1844
1845--- Test Backup #1 ---
1846
1847{}
1848{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1849{"return": {}}
1850{}
1851{}
1852{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1853{"return": {}}
1854{}
1855{"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}}}
1856{"return": {}}
1857{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1858{"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"}}
1859{
1860  "bitmaps": {
1861    "drive0": [
1862      {
1863        "busy": false,
1864        "count": 327680,
1865        "granularity": 65536,
1866        "name": "bitmap0",
1867        "persistent": false,
1868        "recording": true
1869      }
1870    ]
1871  }
1872}
1873
1874= Checking Bitmap bitmap0 =
1875expecting 5 dirty sectors; have 5. OK!
1876
1877--- Write #3 ---
1878
1879write -P0xaa 0x0010000 0x30000
1880{"return": ""}
1881write -P0xbb 0x00d8000 0x10000
1882{"return": ""}
1883write -P0xcc 0x2028000 0x10000
1884{"return": ""}
1885write -P0xdd 0x3fc0000 0x10000
1886{"return": ""}
1887{
1888  "bitmaps": {
1889    "drive0": [
1890      {
1891        "busy": false,
1892        "count": 851968,
1893        "granularity": 65536,
1894        "name": "bitmap0",
1895        "persistent": false,
1896        "recording": true
1897      }
1898    ]
1899  }
1900}
1901
1902= Checking Bitmap bitmap0 =
1903expecting 13 dirty sectors; have 13. OK!
1904
1905--- Reference Backup #2 ---
1906
1907{}
1908{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1909{"return": {}}
1910{}
1911{}
1912{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1913{"return": {}}
1914{}
1915{"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}}}
1916{"return": {}}
1917{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1918
1919--- Test Backup #2 ---
1920
1921{}
1922{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1923{"return": {}}
1924{}
1925{}
1926{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1927{"return": {}}
1928{}
1929{"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}}}
1930{"return": {}}
1931{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
1932{"return": {}}
1933{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1934{"data": {"device": "backup_2", "len": 851968, "offset": 851968, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
1935{
1936  "bitmaps": {
1937    "drive0": [
1938      {
1939        "busy": false,
1940        "count": 0,
1941        "granularity": 65536,
1942        "name": "bitmap0",
1943        "persistent": false,
1944        "recording": true
1945      }
1946    ]
1947  }
1948}
1949
1950= Checking Bitmap bitmap0 =
1951expecting 0 dirty sectors; have 0. OK!
1952
1953--- Cleanup ---
1954
1955{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
1956{"return": {}}
1957{
1958  "bitmaps": {}
1959}
1960
1961--- Verification ---
1962
1963qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
1964qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1965qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
1966
1967
1968=== Mode bitmap; Bitmap Sync always without failure ===
1969
1970--- Preparing image & VM ---
1971
1972{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
1973{"return": {}}
1974
1975--- Write #0 ---
1976
1977write -P0x49 0x0000000 0x10000
1978{"return": ""}
1979write -P0x6c 0x0100000 0x10000
1980{"return": ""}
1981write -P0x6f 0x2000000 0x10000
1982{"return": ""}
1983write -P0x76 0x3ff0000 0x10000
1984{"return": ""}
1985{
1986  "bitmaps": {}
1987}
1988
1989--- Reference Backup #0 ---
1990
1991{}
1992{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
1993{"return": {}}
1994{}
1995{}
1996{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
1997{"return": {}}
1998{}
1999{"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}}}
2000{"return": {}}
2001{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2002
2003--- Add Bitmap ---
2004
2005{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2006{"return": {}}
2007
2008--- Write #1 ---
2009
2010write -P0x65 0x0000000 0x10000
2011{"return": ""}
2012write -P0x77 0x00f8000 0x10000
2013{"return": ""}
2014write -P0x72 0x2008000 0x10000
2015{"return": ""}
2016write -P0x69 0x3fe0000 0x10000
2017{"return": ""}
2018{
2019  "bitmaps": {
2020    "drive0": [
2021      {
2022        "busy": false,
2023        "count": 393216,
2024        "granularity": 65536,
2025        "name": "bitmap0",
2026        "persistent": false,
2027        "recording": true
2028      }
2029    ]
2030  }
2031}
2032
2033= Checking Bitmap bitmap0 =
2034expecting 6 dirty sectors; have 6. OK!
2035
2036--- Reference Backup #1 ---
2037
2038{}
2039{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2040{"return": {}}
2041{}
2042{}
2043{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2044{"return": {}}
2045{}
2046{"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}}}
2047{"return": {}}
2048{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2049
2050--- Test Backup #1 ---
2051
2052{}
2053{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2054{"return": {}}
2055{}
2056{}
2057{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2058{"return": {}}
2059{}
2060{"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}}}
2061{"return": {}}
2062
2063--- Write #2 ---
2064
2065write -P0x74 0x0010000 0x10000
2066{"return": ""}
2067write -P0x69 0x00e8000 0x10000
2068{"return": ""}
2069write -P0x6e 0x2018000 0x10000
2070{"return": ""}
2071write -P0x67 0x3fe0000 0x20000
2072{"return": ""}
2073{
2074  "bitmaps": {
2075    "backup-top": [
2076      {
2077        "busy": false,
2078        "count": 67108864,
2079        "granularity": 65536,
2080        "persistent": false,
2081        "recording": false
2082      },
2083      {
2084        "busy": false,
2085        "count": 458752,
2086        "granularity": 65536,
2087        "persistent": false,
2088        "recording": false
2089      }
2090    ],
2091    "drive0": [
2092      {
2093        "busy": false,
2094        "count": 0,
2095        "granularity": 65536,
2096        "persistent": false,
2097        "recording": false
2098      },
2099      {
2100        "busy": false,
2101        "count": 458752,
2102        "granularity": 65536,
2103        "persistent": false,
2104        "recording": true
2105      },
2106      {
2107        "busy": true,
2108        "count": 393216,
2109        "granularity": 65536,
2110        "name": "bitmap0",
2111        "persistent": false,
2112        "recording": true
2113      }
2114    ]
2115  }
2116}
2117
2118= Checking Bitmap bitmap0 =
2119expecting 6 dirty sectors; have 6. OK!
2120
2121= Checking Bitmap (anonymous) =
2122expecting 7 dirty sectors; have 7. OK!
2123
2124{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
2125{"return": {}}
2126{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2127{"data": {"device": "backup_1", "len": 393216, "offset": 393216, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2128{
2129  "bitmaps": {
2130    "drive0": [
2131      {
2132        "busy": false,
2133        "count": 458752,
2134        "granularity": 65536,
2135        "name": "bitmap0",
2136        "persistent": false,
2137        "recording": true
2138      }
2139    ]
2140  }
2141}
2142
2143= Checking Bitmap bitmap0 =
2144expecting 7 dirty sectors; have 7. OK!
2145
2146--- Write #3 ---
2147
2148write -P0xaa 0x0010000 0x30000
2149{"return": ""}
2150write -P0xbb 0x00d8000 0x10000
2151{"return": ""}
2152write -P0xcc 0x2028000 0x10000
2153{"return": ""}
2154write -P0xdd 0x3fc0000 0x10000
2155{"return": ""}
2156{
2157  "bitmaps": {
2158    "drive0": [
2159      {
2160        "busy": false,
2161        "count": 786432,
2162        "granularity": 65536,
2163        "name": "bitmap0",
2164        "persistent": false,
2165        "recording": true
2166      }
2167    ]
2168  }
2169}
2170
2171= Checking Bitmap bitmap0 =
2172expecting 12 dirty sectors; have 12. OK!
2173
2174--- Reference Backup #2 ---
2175
2176{}
2177{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2178{"return": {}}
2179{}
2180{}
2181{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2182{"return": {}}
2183{}
2184{"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}}}
2185{"return": {}}
2186{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2187
2188--- Test Backup #2 ---
2189
2190{}
2191{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2192{"return": {}}
2193{}
2194{}
2195{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2196{"return": {}}
2197{}
2198{"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}}}
2199{"return": {}}
2200{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
2201{"return": {}}
2202{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2203{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2204{
2205  "bitmaps": {
2206    "drive0": [
2207      {
2208        "busy": false,
2209        "count": 0,
2210        "granularity": 65536,
2211        "name": "bitmap0",
2212        "persistent": false,
2213        "recording": true
2214      }
2215    ]
2216  }
2217}
2218
2219= Checking Bitmap bitmap0 =
2220expecting 0 dirty sectors; have 0. OK!
2221
2222--- Cleanup ---
2223
2224{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2225{"return": {}}
2226{
2227  "bitmaps": {}
2228}
2229
2230--- Verification ---
2231
2232qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
2233qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2234qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2235
2236
2237=== Mode full; Bitmap Sync on-success with simulated failure ===
2238
2239--- Preparing image & VM ---
2240
2241{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2242{"return": {}}
2243
2244--- Write #0 ---
2245
2246write -P0x49 0x0000000 0x10000
2247{"return": ""}
2248write -P0x6c 0x0100000 0x10000
2249{"return": ""}
2250write -P0x6f 0x2000000 0x10000
2251{"return": ""}
2252write -P0x76 0x3ff0000 0x10000
2253{"return": ""}
2254{
2255  "bitmaps": {}
2256}
2257
2258--- Reference Backup #0 ---
2259
2260{}
2261{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2262{"return": {}}
2263{}
2264{}
2265{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2266{"return": {}}
2267{}
2268{"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}}}
2269{"return": {}}
2270{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2271
2272--- Add Bitmap ---
2273
2274{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2275{"return": {}}
2276
2277--- Write #1 ---
2278
2279write -P0x65 0x0000000 0x10000
2280{"return": ""}
2281write -P0x77 0x00f8000 0x10000
2282{"return": ""}
2283write -P0x72 0x2008000 0x10000
2284{"return": ""}
2285write -P0x69 0x3fe0000 0x10000
2286{"return": ""}
2287{
2288  "bitmaps": {
2289    "drive0": [
2290      {
2291        "busy": false,
2292        "count": 393216,
2293        "granularity": 65536,
2294        "name": "bitmap0",
2295        "persistent": false,
2296        "recording": true
2297      }
2298    ]
2299  }
2300}
2301
2302= Checking Bitmap bitmap0 =
2303expecting 6 dirty sectors; have 6. OK!
2304
2305--- Reference Backup #1 ---
2306
2307{}
2308{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2309{"return": {}}
2310{}
2311{}
2312{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2313{"return": {}}
2314{}
2315{"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}}}
2316{"return": {}}
2317{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2318
2319--- Test Backup #1 ---
2320
2321{}
2322{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2323{"return": {}}
2324{}
2325{}
2326{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2327{"return": {}}
2328{}
2329{"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}}}
2330{"return": {}}
2331
2332--- Write #2 ---
2333
2334write -P0x74 0x0010000 0x10000
2335{"return": ""}
2336write -P0x69 0x00e8000 0x10000
2337{"return": ""}
2338write -P0x6e 0x2018000 0x10000
2339{"return": ""}
2340write -P0x67 0x3fe0000 0x20000
2341{"return": ""}
2342{
2343  "bitmaps": {
2344    "backup-top": [
2345      {
2346        "busy": false,
2347        "count": 67108864,
2348        "granularity": 65536,
2349        "persistent": false,
2350        "recording": false
2351      },
2352      {
2353        "busy": false,
2354        "count": 458752,
2355        "granularity": 65536,
2356        "persistent": false,
2357        "recording": false
2358      }
2359    ],
2360    "drive0": [
2361      {
2362        "busy": false,
2363        "count": 0,
2364        "granularity": 65536,
2365        "persistent": false,
2366        "recording": false
2367      },
2368      {
2369        "busy": false,
2370        "count": 458752,
2371        "granularity": 65536,
2372        "persistent": false,
2373        "recording": true
2374      },
2375      {
2376        "busy": true,
2377        "count": 393216,
2378        "granularity": 65536,
2379        "name": "bitmap0",
2380        "persistent": false,
2381        "recording": true
2382      }
2383    ]
2384  }
2385}
2386
2387= Checking Bitmap bitmap0 =
2388expecting 6 dirty sectors; have 6. OK!
2389
2390= Checking Bitmap (anonymous) =
2391expecting 7 dirty sectors; have 7. OK!
2392
2393{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
2394{"return": {}}
2395{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2396{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2397{
2398  "bitmaps": {
2399    "drive0": [
2400      {
2401        "busy": false,
2402        "count": 655360,
2403        "granularity": 65536,
2404        "name": "bitmap0",
2405        "persistent": false,
2406        "recording": true
2407      }
2408    ]
2409  }
2410}
2411
2412= Checking Bitmap bitmap0 =
2413expecting 10 dirty sectors; have 10. OK!
2414
2415--- Write #3 ---
2416
2417write -P0xaa 0x0010000 0x30000
2418{"return": ""}
2419write -P0xbb 0x00d8000 0x10000
2420{"return": ""}
2421write -P0xcc 0x2028000 0x10000
2422{"return": ""}
2423write -P0xdd 0x3fc0000 0x10000
2424{"return": ""}
2425{
2426  "bitmaps": {
2427    "drive0": [
2428      {
2429        "busy": false,
2430        "count": 983040,
2431        "granularity": 65536,
2432        "name": "bitmap0",
2433        "persistent": false,
2434        "recording": true
2435      }
2436    ]
2437  }
2438}
2439
2440= Checking Bitmap bitmap0 =
2441expecting 15 dirty sectors; have 15. OK!
2442
2443--- Reference Backup #2 ---
2444
2445{}
2446{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2447{"return": {}}
2448{}
2449{}
2450{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2451{"return": {}}
2452{}
2453{"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}}}
2454{"return": {}}
2455{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2456
2457--- Test Backup #2 ---
2458
2459{}
2460{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2461{"return": {}}
2462{}
2463{}
2464{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2465{"return": {}}
2466{}
2467{"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}}}
2468{"return": {}}
2469{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
2470{"return": {}}
2471{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2472{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2473{
2474  "bitmaps": {
2475    "drive0": [
2476      {
2477        "busy": false,
2478        "count": 0,
2479        "granularity": 65536,
2480        "name": "bitmap0",
2481        "persistent": false,
2482        "recording": true
2483      }
2484    ]
2485  }
2486}
2487
2488= Checking Bitmap bitmap0 =
2489expecting 0 dirty sectors; have 0. OK!
2490
2491--- Cleanup ---
2492
2493{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2494{"return": {}}
2495{
2496  "bitmaps": {}
2497}
2498
2499--- Verification ---
2500
2501qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
2502qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2503qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2504
2505
2506=== Mode full; Bitmap Sync on-success with intermediate failure ===
2507
2508--- Preparing image & VM ---
2509
2510{"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"}}
2511{"return": {}}
2512
2513--- Write #0 ---
2514
2515write -P0x49 0x0000000 0x10000
2516{"return": ""}
2517write -P0x6c 0x0100000 0x10000
2518{"return": ""}
2519write -P0x6f 0x2000000 0x10000
2520{"return": ""}
2521write -P0x76 0x3ff0000 0x10000
2522{"return": ""}
2523{
2524  "bitmaps": {}
2525}
2526
2527--- Reference Backup #0 ---
2528
2529{}
2530{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2531{"return": {}}
2532{}
2533{}
2534{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2535{"return": {}}
2536{}
2537{"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}}}
2538{"return": {}}
2539{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2540
2541--- Add Bitmap ---
2542
2543{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2544{"return": {}}
2545
2546--- Write #1 ---
2547
2548write -P0x65 0x0000000 0x10000
2549{"return": ""}
2550write -P0x77 0x00f8000 0x10000
2551{"return": ""}
2552write -P0x72 0x2008000 0x10000
2553{"return": ""}
2554write -P0x69 0x3fe0000 0x10000
2555{"return": ""}
2556{
2557  "bitmaps": {
2558    "drive0": [
2559      {
2560        "busy": false,
2561        "count": 393216,
2562        "granularity": 65536,
2563        "name": "bitmap0",
2564        "persistent": false,
2565        "recording": true
2566      }
2567    ]
2568  }
2569}
2570
2571= Checking Bitmap bitmap0 =
2572expecting 6 dirty sectors; have 6. OK!
2573
2574--- Reference Backup #1 ---
2575
2576{}
2577{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2578{"return": {}}
2579{}
2580{}
2581{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2582{"return": {}}
2583{}
2584{"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}}}
2585{"return": {}}
2586{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2587
2588{"return": ""}
2589
2590--- Test Backup #1 ---
2591
2592{}
2593{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2594{"return": {}}
2595{}
2596{}
2597{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2598{"return": {}}
2599{}
2600{"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}}}
2601{"return": {}}
2602{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2603{"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"}}
2604{
2605  "bitmaps": {
2606    "drive0": [
2607      {
2608        "busy": false,
2609        "count": 393216,
2610        "granularity": 65536,
2611        "name": "bitmap0",
2612        "persistent": false,
2613        "recording": true
2614      }
2615    ]
2616  }
2617}
2618
2619= Checking Bitmap bitmap0 =
2620expecting 6 dirty sectors; have 6. OK!
2621
2622--- Write #3 ---
2623
2624write -P0xaa 0x0010000 0x30000
2625{"return": ""}
2626write -P0xbb 0x00d8000 0x10000
2627{"return": ""}
2628write -P0xcc 0x2028000 0x10000
2629{"return": ""}
2630write -P0xdd 0x3fc0000 0x10000
2631{"return": ""}
2632{
2633  "bitmaps": {
2634    "drive0": [
2635      {
2636        "busy": false,
2637        "count": 917504,
2638        "granularity": 65536,
2639        "name": "bitmap0",
2640        "persistent": false,
2641        "recording": true
2642      }
2643    ]
2644  }
2645}
2646
2647= Checking Bitmap bitmap0 =
2648expecting 14 dirty sectors; have 14. OK!
2649
2650--- Reference Backup #2 ---
2651
2652{}
2653{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2654{"return": {}}
2655{}
2656{}
2657{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2658{"return": {}}
2659{}
2660{"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}}}
2661{"return": {}}
2662{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2663
2664--- Test Backup #2 ---
2665
2666{}
2667{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2668{"return": {}}
2669{}
2670{}
2671{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2672{"return": {}}
2673{}
2674{"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}}}
2675{"return": {}}
2676{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
2677{"return": {}}
2678{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2679{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2680{
2681  "bitmaps": {
2682    "drive0": [
2683      {
2684        "busy": false,
2685        "count": 0,
2686        "granularity": 65536,
2687        "name": "bitmap0",
2688        "persistent": false,
2689        "recording": true
2690      }
2691    ]
2692  }
2693}
2694
2695= Checking Bitmap bitmap0 =
2696expecting 0 dirty sectors; have 0. OK!
2697
2698--- Cleanup ---
2699
2700{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2701{"return": {}}
2702{
2703  "bitmaps": {}
2704}
2705
2706--- Verification ---
2707
2708qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
2709qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2710qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2711
2712
2713=== Mode full; Bitmap Sync on-success without failure ===
2714
2715--- Preparing image & VM ---
2716
2717{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2718{"return": {}}
2719
2720--- Write #0 ---
2721
2722write -P0x49 0x0000000 0x10000
2723{"return": ""}
2724write -P0x6c 0x0100000 0x10000
2725{"return": ""}
2726write -P0x6f 0x2000000 0x10000
2727{"return": ""}
2728write -P0x76 0x3ff0000 0x10000
2729{"return": ""}
2730{
2731  "bitmaps": {}
2732}
2733
2734--- Reference Backup #0 ---
2735
2736{}
2737{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2738{"return": {}}
2739{}
2740{}
2741{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2742{"return": {}}
2743{}
2744{"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}}}
2745{"return": {}}
2746{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2747
2748--- Add Bitmap ---
2749
2750{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
2751{"return": {}}
2752
2753--- Write #1 ---
2754
2755write -P0x65 0x0000000 0x10000
2756{"return": ""}
2757write -P0x77 0x00f8000 0x10000
2758{"return": ""}
2759write -P0x72 0x2008000 0x10000
2760{"return": ""}
2761write -P0x69 0x3fe0000 0x10000
2762{"return": ""}
2763{
2764  "bitmaps": {
2765    "drive0": [
2766      {
2767        "busy": false,
2768        "count": 393216,
2769        "granularity": 65536,
2770        "name": "bitmap0",
2771        "persistent": false,
2772        "recording": true
2773      }
2774    ]
2775  }
2776}
2777
2778= Checking Bitmap bitmap0 =
2779expecting 6 dirty sectors; have 6. OK!
2780
2781--- Reference Backup #1 ---
2782
2783{}
2784{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2785{"return": {}}
2786{}
2787{}
2788{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2789{"return": {}}
2790{}
2791{"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}}}
2792{"return": {}}
2793{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2794
2795--- Test Backup #1 ---
2796
2797{}
2798{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2799{"return": {}}
2800{}
2801{}
2802{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2803{"return": {}}
2804{}
2805{"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}}}
2806{"return": {}}
2807
2808--- Write #2 ---
2809
2810write -P0x74 0x0010000 0x10000
2811{"return": ""}
2812write -P0x69 0x00e8000 0x10000
2813{"return": ""}
2814write -P0x6e 0x2018000 0x10000
2815{"return": ""}
2816write -P0x67 0x3fe0000 0x20000
2817{"return": ""}
2818{
2819  "bitmaps": {
2820    "backup-top": [
2821      {
2822        "busy": false,
2823        "count": 67108864,
2824        "granularity": 65536,
2825        "persistent": false,
2826        "recording": false
2827      },
2828      {
2829        "busy": false,
2830        "count": 458752,
2831        "granularity": 65536,
2832        "persistent": false,
2833        "recording": false
2834      }
2835    ],
2836    "drive0": [
2837      {
2838        "busy": false,
2839        "count": 0,
2840        "granularity": 65536,
2841        "persistent": false,
2842        "recording": false
2843      },
2844      {
2845        "busy": false,
2846        "count": 458752,
2847        "granularity": 65536,
2848        "persistent": false,
2849        "recording": true
2850      },
2851      {
2852        "busy": true,
2853        "count": 393216,
2854        "granularity": 65536,
2855        "name": "bitmap0",
2856        "persistent": false,
2857        "recording": true
2858      }
2859    ]
2860  }
2861}
2862
2863= Checking Bitmap bitmap0 =
2864expecting 6 dirty sectors; have 6. OK!
2865
2866= Checking Bitmap (anonymous) =
2867expecting 7 dirty sectors; have 7. OK!
2868
2869{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
2870{"return": {}}
2871{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2872{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2873{
2874  "bitmaps": {
2875    "drive0": [
2876      {
2877        "busy": false,
2878        "count": 458752,
2879        "granularity": 65536,
2880        "name": "bitmap0",
2881        "persistent": false,
2882        "recording": true
2883      }
2884    ]
2885  }
2886}
2887
2888= Checking Bitmap bitmap0 =
2889expecting 7 dirty sectors; have 7. OK!
2890
2891--- Write #3 ---
2892
2893write -P0xaa 0x0010000 0x30000
2894{"return": ""}
2895write -P0xbb 0x00d8000 0x10000
2896{"return": ""}
2897write -P0xcc 0x2028000 0x10000
2898{"return": ""}
2899write -P0xdd 0x3fc0000 0x10000
2900{"return": ""}
2901{
2902  "bitmaps": {
2903    "drive0": [
2904      {
2905        "busy": false,
2906        "count": 786432,
2907        "granularity": 65536,
2908        "name": "bitmap0",
2909        "persistent": false,
2910        "recording": true
2911      }
2912    ]
2913  }
2914}
2915
2916= Checking Bitmap bitmap0 =
2917expecting 12 dirty sectors; have 12. OK!
2918
2919--- Reference Backup #2 ---
2920
2921{}
2922{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2923{"return": {}}
2924{}
2925{}
2926{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2927{"return": {}}
2928{}
2929{"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}}}
2930{"return": {}}
2931{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2932
2933--- Test Backup #2 ---
2934
2935{}
2936{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
2937{"return": {}}
2938{}
2939{}
2940{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
2941{"return": {}}
2942{}
2943{"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}}}
2944{"return": {}}
2945{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
2946{"return": {}}
2947{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2948{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
2949{
2950  "bitmaps": {
2951    "drive0": [
2952      {
2953        "busy": false,
2954        "count": 0,
2955        "granularity": 65536,
2956        "name": "bitmap0",
2957        "persistent": false,
2958        "recording": true
2959      }
2960    ]
2961  }
2962}
2963
2964= Checking Bitmap bitmap0 =
2965expecting 0 dirty sectors; have 0. OK!
2966
2967--- Cleanup ---
2968
2969{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
2970{"return": {}}
2971{
2972  "bitmaps": {}
2973}
2974
2975--- Verification ---
2976
2977qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
2978qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2979qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
2980
2981
2982=== Mode full; Bitmap Sync always with simulated failure ===
2983
2984--- Preparing image & VM ---
2985
2986{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
2987{"return": {}}
2988
2989--- Write #0 ---
2990
2991write -P0x49 0x0000000 0x10000
2992{"return": ""}
2993write -P0x6c 0x0100000 0x10000
2994{"return": ""}
2995write -P0x6f 0x2000000 0x10000
2996{"return": ""}
2997write -P0x76 0x3ff0000 0x10000
2998{"return": ""}
2999{
3000  "bitmaps": {}
3001}
3002
3003--- Reference Backup #0 ---
3004
3005{}
3006{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3007{"return": {}}
3008{}
3009{}
3010{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3011{"return": {}}
3012{}
3013{"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}}}
3014{"return": {}}
3015{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3016
3017--- Add Bitmap ---
3018
3019{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
3020{"return": {}}
3021
3022--- Write #1 ---
3023
3024write -P0x65 0x0000000 0x10000
3025{"return": ""}
3026write -P0x77 0x00f8000 0x10000
3027{"return": ""}
3028write -P0x72 0x2008000 0x10000
3029{"return": ""}
3030write -P0x69 0x3fe0000 0x10000
3031{"return": ""}
3032{
3033  "bitmaps": {
3034    "drive0": [
3035      {
3036        "busy": false,
3037        "count": 393216,
3038        "granularity": 65536,
3039        "name": "bitmap0",
3040        "persistent": false,
3041        "recording": true
3042      }
3043    ]
3044  }
3045}
3046
3047= Checking Bitmap bitmap0 =
3048expecting 6 dirty sectors; have 6. OK!
3049
3050--- Reference Backup #1 ---
3051
3052{}
3053{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3054{"return": {}}
3055{}
3056{}
3057{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3058{"return": {}}
3059{}
3060{"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}}}
3061{"return": {}}
3062{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3063
3064--- Test Backup #1 ---
3065
3066{}
3067{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3068{"return": {}}
3069{}
3070{}
3071{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3072{"return": {}}
3073{}
3074{"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}}}
3075{"return": {}}
3076
3077--- Write #2 ---
3078
3079write -P0x74 0x0010000 0x10000
3080{"return": ""}
3081write -P0x69 0x00e8000 0x10000
3082{"return": ""}
3083write -P0x6e 0x2018000 0x10000
3084{"return": ""}
3085write -P0x67 0x3fe0000 0x20000
3086{"return": ""}
3087{
3088  "bitmaps": {
3089    "backup-top": [
3090      {
3091        "busy": false,
3092        "count": 67108864,
3093        "granularity": 65536,
3094        "persistent": false,
3095        "recording": false
3096      },
3097      {
3098        "busy": false,
3099        "count": 458752,
3100        "granularity": 65536,
3101        "persistent": false,
3102        "recording": false
3103      }
3104    ],
3105    "drive0": [
3106      {
3107        "busy": false,
3108        "count": 0,
3109        "granularity": 65536,
3110        "persistent": false,
3111        "recording": false
3112      },
3113      {
3114        "busy": false,
3115        "count": 458752,
3116        "granularity": 65536,
3117        "persistent": false,
3118        "recording": true
3119      },
3120      {
3121        "busy": true,
3122        "count": 393216,
3123        "granularity": 65536,
3124        "name": "bitmap0",
3125        "persistent": false,
3126        "recording": true
3127      }
3128    ]
3129  }
3130}
3131
3132= Checking Bitmap bitmap0 =
3133expecting 6 dirty sectors; have 6. OK!
3134
3135= Checking Bitmap (anonymous) =
3136expecting 7 dirty sectors; have 7. OK!
3137
3138{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
3139{"return": {}}
3140{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3141{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3142{
3143  "bitmaps": {
3144    "drive0": [
3145      {
3146        "busy": false,
3147        "count": 458752,
3148        "granularity": 65536,
3149        "name": "bitmap0",
3150        "persistent": false,
3151        "recording": true
3152      }
3153    ]
3154  }
3155}
3156
3157= Checking Bitmap bitmap0 =
3158expecting 7 dirty sectors; have 7. OK!
3159
3160--- Write #3 ---
3161
3162write -P0xaa 0x0010000 0x30000
3163{"return": ""}
3164write -P0xbb 0x00d8000 0x10000
3165{"return": ""}
3166write -P0xcc 0x2028000 0x10000
3167{"return": ""}
3168write -P0xdd 0x3fc0000 0x10000
3169{"return": ""}
3170{
3171  "bitmaps": {
3172    "drive0": [
3173      {
3174        "busy": false,
3175        "count": 786432,
3176        "granularity": 65536,
3177        "name": "bitmap0",
3178        "persistent": false,
3179        "recording": true
3180      }
3181    ]
3182  }
3183}
3184
3185= Checking Bitmap bitmap0 =
3186expecting 12 dirty sectors; have 12. OK!
3187
3188--- Reference Backup #2 ---
3189
3190{}
3191{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3192{"return": {}}
3193{}
3194{}
3195{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3196{"return": {}}
3197{}
3198{"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}}}
3199{"return": {}}
3200{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3201
3202--- Test Backup #2 ---
3203
3204{}
3205{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3206{"return": {}}
3207{}
3208{}
3209{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3210{"return": {}}
3211{}
3212{"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}}}
3213{"return": {}}
3214{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
3215{"return": {}}
3216{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3217{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3218{
3219  "bitmaps": {
3220    "drive0": [
3221      {
3222        "busy": false,
3223        "count": 0,
3224        "granularity": 65536,
3225        "name": "bitmap0",
3226        "persistent": false,
3227        "recording": true
3228      }
3229    ]
3230  }
3231}
3232
3233= Checking Bitmap bitmap0 =
3234expecting 0 dirty sectors; have 0. OK!
3235
3236--- Cleanup ---
3237
3238{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
3239{"return": {}}
3240{
3241  "bitmaps": {}
3242}
3243
3244--- Verification ---
3245
3246qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
3247qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3248qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3249
3250
3251=== Mode full; Bitmap Sync always with intermediate failure ===
3252
3253--- Preparing image & VM ---
3254
3255{"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"}}
3256{"return": {}}
3257
3258--- Write #0 ---
3259
3260write -P0x49 0x0000000 0x10000
3261{"return": ""}
3262write -P0x6c 0x0100000 0x10000
3263{"return": ""}
3264write -P0x6f 0x2000000 0x10000
3265{"return": ""}
3266write -P0x76 0x3ff0000 0x10000
3267{"return": ""}
3268{
3269  "bitmaps": {}
3270}
3271
3272--- Reference Backup #0 ---
3273
3274{}
3275{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3276{"return": {}}
3277{}
3278{}
3279{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3280{"return": {}}
3281{}
3282{"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}}}
3283{"return": {}}
3284{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3285
3286--- Add Bitmap ---
3287
3288{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
3289{"return": {}}
3290
3291--- Write #1 ---
3292
3293write -P0x65 0x0000000 0x10000
3294{"return": ""}
3295write -P0x77 0x00f8000 0x10000
3296{"return": ""}
3297write -P0x72 0x2008000 0x10000
3298{"return": ""}
3299write -P0x69 0x3fe0000 0x10000
3300{"return": ""}
3301{
3302  "bitmaps": {
3303    "drive0": [
3304      {
3305        "busy": false,
3306        "count": 393216,
3307        "granularity": 65536,
3308        "name": "bitmap0",
3309        "persistent": false,
3310        "recording": true
3311      }
3312    ]
3313  }
3314}
3315
3316= Checking Bitmap bitmap0 =
3317expecting 6 dirty sectors; have 6. OK!
3318
3319--- Reference Backup #1 ---
3320
3321{}
3322{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3323{"return": {}}
3324{}
3325{}
3326{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3327{"return": {}}
3328{}
3329{"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}}}
3330{"return": {}}
3331{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3332
3333{"return": ""}
3334
3335--- Test Backup #1 ---
3336
3337{}
3338{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3339{"return": {}}
3340{}
3341{}
3342{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3343{"return": {}}
3344{}
3345{"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}}}
3346{"return": {}}
3347{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3348{"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"}}
3349{
3350  "bitmaps": {
3351    "drive0": [
3352      {
3353        "busy": false,
3354        "count": 66125824,
3355        "granularity": 65536,
3356        "name": "bitmap0",
3357        "persistent": false,
3358        "recording": true
3359      }
3360    ]
3361  }
3362}
3363
3364= Checking Bitmap bitmap0 =
3365expecting 1009 dirty sectors; have 1009. OK!
3366
3367--- Write #3 ---
3368
3369write -P0xaa 0x0010000 0x30000
3370{"return": ""}
3371write -P0xbb 0x00d8000 0x10000
3372{"return": ""}
3373write -P0xcc 0x2028000 0x10000
3374{"return": ""}
3375write -P0xdd 0x3fc0000 0x10000
3376{"return": ""}
3377{
3378  "bitmaps": {
3379    "drive0": [
3380      {
3381        "busy": false,
3382        "count": 66453504,
3383        "granularity": 65536,
3384        "name": "bitmap0",
3385        "persistent": false,
3386        "recording": true
3387      }
3388    ]
3389  }
3390}
3391
3392= Checking Bitmap bitmap0 =
3393expecting 1014 dirty sectors; have 1014. OK!
3394
3395--- Reference Backup #2 ---
3396
3397{}
3398{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3399{"return": {}}
3400{}
3401{}
3402{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3403{"return": {}}
3404{}
3405{"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}}}
3406{"return": {}}
3407{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3408
3409--- Test Backup #2 ---
3410
3411{}
3412{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3413{"return": {}}
3414{}
3415{}
3416{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3417{"return": {}}
3418{}
3419{"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}}}
3420{"return": {}}
3421{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
3422{"return": {}}
3423{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3424{"data": {"device": "backup_2", "len": 66453504, "offset": 66453504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3425{
3426  "bitmaps": {
3427    "drive0": [
3428      {
3429        "busy": false,
3430        "count": 0,
3431        "granularity": 65536,
3432        "name": "bitmap0",
3433        "persistent": false,
3434        "recording": true
3435      }
3436    ]
3437  }
3438}
3439
3440= Checking Bitmap bitmap0 =
3441expecting 0 dirty sectors; have 0. OK!
3442
3443--- Cleanup ---
3444
3445{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
3446{"return": {}}
3447{
3448  "bitmaps": {}
3449}
3450
3451--- Verification ---
3452
3453qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
3454qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3455qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3456
3457
3458=== Mode full; Bitmap Sync always without failure ===
3459
3460--- Preparing image & VM ---
3461
3462{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
3463{"return": {}}
3464
3465--- Write #0 ---
3466
3467write -P0x49 0x0000000 0x10000
3468{"return": ""}
3469write -P0x6c 0x0100000 0x10000
3470{"return": ""}
3471write -P0x6f 0x2000000 0x10000
3472{"return": ""}
3473write -P0x76 0x3ff0000 0x10000
3474{"return": ""}
3475{
3476  "bitmaps": {}
3477}
3478
3479--- Reference Backup #0 ---
3480
3481{}
3482{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3483{"return": {}}
3484{}
3485{}
3486{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3487{"return": {}}
3488{}
3489{"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}}}
3490{"return": {}}
3491{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3492
3493--- Add Bitmap ---
3494
3495{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
3496{"return": {}}
3497
3498--- Write #1 ---
3499
3500write -P0x65 0x0000000 0x10000
3501{"return": ""}
3502write -P0x77 0x00f8000 0x10000
3503{"return": ""}
3504write -P0x72 0x2008000 0x10000
3505{"return": ""}
3506write -P0x69 0x3fe0000 0x10000
3507{"return": ""}
3508{
3509  "bitmaps": {
3510    "drive0": [
3511      {
3512        "busy": false,
3513        "count": 393216,
3514        "granularity": 65536,
3515        "name": "bitmap0",
3516        "persistent": false,
3517        "recording": true
3518      }
3519    ]
3520  }
3521}
3522
3523= Checking Bitmap bitmap0 =
3524expecting 6 dirty sectors; have 6. OK!
3525
3526--- Reference Backup #1 ---
3527
3528{}
3529{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3530{"return": {}}
3531{}
3532{}
3533{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3534{"return": {}}
3535{}
3536{"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}}}
3537{"return": {}}
3538{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3539
3540--- Test Backup #1 ---
3541
3542{}
3543{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3544{"return": {}}
3545{}
3546{}
3547{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3548{"return": {}}
3549{}
3550{"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}}}
3551{"return": {}}
3552
3553--- Write #2 ---
3554
3555write -P0x74 0x0010000 0x10000
3556{"return": ""}
3557write -P0x69 0x00e8000 0x10000
3558{"return": ""}
3559write -P0x6e 0x2018000 0x10000
3560{"return": ""}
3561write -P0x67 0x3fe0000 0x20000
3562{"return": ""}
3563{
3564  "bitmaps": {
3565    "backup-top": [
3566      {
3567        "busy": false,
3568        "count": 67108864,
3569        "granularity": 65536,
3570        "persistent": false,
3571        "recording": false
3572      },
3573      {
3574        "busy": false,
3575        "count": 458752,
3576        "granularity": 65536,
3577        "persistent": false,
3578        "recording": false
3579      }
3580    ],
3581    "drive0": [
3582      {
3583        "busy": false,
3584        "count": 0,
3585        "granularity": 65536,
3586        "persistent": false,
3587        "recording": false
3588      },
3589      {
3590        "busy": false,
3591        "count": 458752,
3592        "granularity": 65536,
3593        "persistent": false,
3594        "recording": true
3595      },
3596      {
3597        "busy": true,
3598        "count": 393216,
3599        "granularity": 65536,
3600        "name": "bitmap0",
3601        "persistent": false,
3602        "recording": true
3603      }
3604    ]
3605  }
3606}
3607
3608= Checking Bitmap bitmap0 =
3609expecting 6 dirty sectors; have 6. OK!
3610
3611= Checking Bitmap (anonymous) =
3612expecting 7 dirty sectors; have 7. OK!
3613
3614{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
3615{"return": {}}
3616{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3617{"data": {"device": "backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3618{
3619  "bitmaps": {
3620    "drive0": [
3621      {
3622        "busy": false,
3623        "count": 458752,
3624        "granularity": 65536,
3625        "name": "bitmap0",
3626        "persistent": false,
3627        "recording": true
3628      }
3629    ]
3630  }
3631}
3632
3633= Checking Bitmap bitmap0 =
3634expecting 7 dirty sectors; have 7. OK!
3635
3636--- Write #3 ---
3637
3638write -P0xaa 0x0010000 0x30000
3639{"return": ""}
3640write -P0xbb 0x00d8000 0x10000
3641{"return": ""}
3642write -P0xcc 0x2028000 0x10000
3643{"return": ""}
3644write -P0xdd 0x3fc0000 0x10000
3645{"return": ""}
3646{
3647  "bitmaps": {
3648    "drive0": [
3649      {
3650        "busy": false,
3651        "count": 786432,
3652        "granularity": 65536,
3653        "name": "bitmap0",
3654        "persistent": false,
3655        "recording": true
3656      }
3657    ]
3658  }
3659}
3660
3661= Checking Bitmap bitmap0 =
3662expecting 12 dirty sectors; have 12. OK!
3663
3664--- Reference Backup #2 ---
3665
3666{}
3667{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3668{"return": {}}
3669{}
3670{}
3671{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3672{"return": {}}
3673{}
3674{"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}}}
3675{"return": {}}
3676{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3677
3678--- Test Backup #2 ---
3679
3680{}
3681{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3682{"return": {}}
3683{}
3684{}
3685{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3686{"return": {}}
3687{}
3688{"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}}}
3689{"return": {}}
3690{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
3691{"return": {}}
3692{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3693{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3694{
3695  "bitmaps": {
3696    "drive0": [
3697      {
3698        "busy": false,
3699        "count": 0,
3700        "granularity": 65536,
3701        "name": "bitmap0",
3702        "persistent": false,
3703        "recording": true
3704      }
3705    ]
3706  }
3707}
3708
3709= Checking Bitmap bitmap0 =
3710expecting 0 dirty sectors; have 0. OK!
3711
3712--- Cleanup ---
3713
3714{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
3715{"return": {}}
3716{
3717  "bitmaps": {}
3718}
3719
3720--- Verification ---
3721
3722qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
3723qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3724qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3725
3726
3727=== Mode top; Bitmap Sync on-success with simulated failure ===
3728
3729--- Preparing image & VM ---
3730
3731{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
3732{"return": {}}
3733
3734--- Write #0 ---
3735
3736write -P0x49 0x0000000 0x10000
3737{"return": ""}
3738write -P0x6c 0x0100000 0x10000
3739{"return": ""}
3740write -P0x6f 0x2000000 0x10000
3741{"return": ""}
3742write -P0x76 0x3ff0000 0x10000
3743{"return": ""}
3744{
3745  "bitmaps": {}
3746}
3747
3748--- Reference Backup #0 ---
3749
3750{}
3751{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3752{"return": {}}
3753{}
3754{}
3755{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3756{"return": {}}
3757{}
3758{"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}}}
3759{"return": {}}
3760{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3761
3762--- Add Bitmap ---
3763
3764{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
3765{"return": {}}
3766
3767--- Write #1 ---
3768
3769write -P0x65 0x0000000 0x10000
3770{"return": ""}
3771write -P0x77 0x00f8000 0x10000
3772{"return": ""}
3773write -P0x72 0x2008000 0x10000
3774{"return": ""}
3775write -P0x69 0x3fe0000 0x10000
3776{"return": ""}
3777{
3778  "bitmaps": {
3779    "drive0": [
3780      {
3781        "busy": false,
3782        "count": 393216,
3783        "granularity": 65536,
3784        "name": "bitmap0",
3785        "persistent": false,
3786        "recording": true
3787      }
3788    ]
3789  }
3790}
3791
3792= Checking Bitmap bitmap0 =
3793expecting 6 dirty sectors; have 6. OK!
3794
3795--- Reference Backup #1 ---
3796
3797{}
3798{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3799{"return": {}}
3800{}
3801{}
3802{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3803{"return": {}}
3804{}
3805{"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}}}
3806{"return": {}}
3807{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3808
3809--- Test Backup #1 ---
3810
3811{}
3812{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3813{"return": {}}
3814{}
3815{}
3816{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3817{"return": {}}
3818{}
3819{"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}}}
3820{"return": {}}
3821
3822--- Write #2 ---
3823
3824write -P0x74 0x0010000 0x10000
3825{"return": ""}
3826write -P0x69 0x00e8000 0x10000
3827{"return": ""}
3828write -P0x6e 0x2018000 0x10000
3829{"return": ""}
3830write -P0x67 0x3fe0000 0x20000
3831{"return": ""}
3832{
3833  "bitmaps": {
3834    "backup-top": [
3835      {
3836        "busy": false,
3837        "count": 67108864,
3838        "granularity": 65536,
3839        "persistent": false,
3840        "recording": false
3841      },
3842      {
3843        "busy": false,
3844        "count": 458752,
3845        "granularity": 65536,
3846        "persistent": false,
3847        "recording": false
3848      }
3849    ],
3850    "drive0": [
3851      {
3852        "busy": false,
3853        "count": 0,
3854        "granularity": 65536,
3855        "persistent": false,
3856        "recording": false
3857      },
3858      {
3859        "busy": false,
3860        "count": 458752,
3861        "granularity": 65536,
3862        "persistent": false,
3863        "recording": true
3864      },
3865      {
3866        "busy": true,
3867        "count": 393216,
3868        "granularity": 65536,
3869        "name": "bitmap0",
3870        "persistent": false,
3871        "recording": true
3872      }
3873    ]
3874  }
3875}
3876
3877= Checking Bitmap bitmap0 =
3878expecting 6 dirty sectors; have 6. OK!
3879
3880= Checking Bitmap (anonymous) =
3881expecting 7 dirty sectors; have 7. OK!
3882
3883{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
3884{"return": {}}
3885{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3886{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3887{
3888  "bitmaps": {
3889    "drive0": [
3890      {
3891        "busy": false,
3892        "count": 655360,
3893        "granularity": 65536,
3894        "name": "bitmap0",
3895        "persistent": false,
3896        "recording": true
3897      }
3898    ]
3899  }
3900}
3901
3902= Checking Bitmap bitmap0 =
3903expecting 10 dirty sectors; have 10. OK!
3904
3905--- Write #3 ---
3906
3907write -P0xaa 0x0010000 0x30000
3908{"return": ""}
3909write -P0xbb 0x00d8000 0x10000
3910{"return": ""}
3911write -P0xcc 0x2028000 0x10000
3912{"return": ""}
3913write -P0xdd 0x3fc0000 0x10000
3914{"return": ""}
3915{
3916  "bitmaps": {
3917    "drive0": [
3918      {
3919        "busy": false,
3920        "count": 983040,
3921        "granularity": 65536,
3922        "name": "bitmap0",
3923        "persistent": false,
3924        "recording": true
3925      }
3926    ]
3927  }
3928}
3929
3930= Checking Bitmap bitmap0 =
3931expecting 15 dirty sectors; have 15. OK!
3932
3933--- Reference Backup #2 ---
3934
3935{}
3936{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3937{"return": {}}
3938{}
3939{}
3940{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3941{"return": {}}
3942{}
3943{"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}}}
3944{"return": {}}
3945{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3946
3947--- Test Backup #2 ---
3948
3949{}
3950{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
3951{"return": {}}
3952{}
3953{}
3954{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
3955{"return": {}}
3956{}
3957{"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}}}
3958{"return": {}}
3959{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
3960{"return": {}}
3961{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3962{"data": {"device": "backup_2", "len": 983040, "offset": 983040, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
3963{
3964  "bitmaps": {
3965    "drive0": [
3966      {
3967        "busy": false,
3968        "count": 0,
3969        "granularity": 65536,
3970        "name": "bitmap0",
3971        "persistent": false,
3972        "recording": true
3973      }
3974    ]
3975  }
3976}
3977
3978= Checking Bitmap bitmap0 =
3979expecting 0 dirty sectors; have 0. OK!
3980
3981--- Cleanup ---
3982
3983{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
3984{"return": {}}
3985{
3986  "bitmaps": {}
3987}
3988
3989--- Verification ---
3990
3991qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
3992qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3993qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
3994
3995
3996=== Mode top; Bitmap Sync on-success with intermediate failure ===
3997
3998--- Preparing image & VM ---
3999
4000{"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"}}
4001{"return": {}}
4002
4003--- Write #0 ---
4004
4005write -P0x49 0x0000000 0x10000
4006{"return": ""}
4007write -P0x6c 0x0100000 0x10000
4008{"return": ""}
4009write -P0x6f 0x2000000 0x10000
4010{"return": ""}
4011write -P0x76 0x3ff0000 0x10000
4012{"return": ""}
4013{
4014  "bitmaps": {}
4015}
4016
4017--- Reference Backup #0 ---
4018
4019{}
4020{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4021{"return": {}}
4022{}
4023{}
4024{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4025{"return": {}}
4026{}
4027{"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}}}
4028{"return": {}}
4029{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4030
4031--- Add Bitmap ---
4032
4033{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
4034{"return": {}}
4035
4036--- Write #1 ---
4037
4038write -P0x65 0x0000000 0x10000
4039{"return": ""}
4040write -P0x77 0x00f8000 0x10000
4041{"return": ""}
4042write -P0x72 0x2008000 0x10000
4043{"return": ""}
4044write -P0x69 0x3fe0000 0x10000
4045{"return": ""}
4046{
4047  "bitmaps": {
4048    "drive0": [
4049      {
4050        "busy": false,
4051        "count": 393216,
4052        "granularity": 65536,
4053        "name": "bitmap0",
4054        "persistent": false,
4055        "recording": true
4056      }
4057    ]
4058  }
4059}
4060
4061= Checking Bitmap bitmap0 =
4062expecting 6 dirty sectors; have 6. OK!
4063
4064--- Reference Backup #1 ---
4065
4066{}
4067{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4068{"return": {}}
4069{}
4070{}
4071{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4072{"return": {}}
4073{}
4074{"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}}}
4075{"return": {}}
4076{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4077
4078{"return": ""}
4079
4080--- Test Backup #1 ---
4081
4082{}
4083{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4084{"return": {}}
4085{}
4086{}
4087{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4088{"return": {}}
4089{}
4090{"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}}}
4091{"return": {}}
4092{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4093{"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"}}
4094{
4095  "bitmaps": {
4096    "drive0": [
4097      {
4098        "busy": false,
4099        "count": 393216,
4100        "granularity": 65536,
4101        "name": "bitmap0",
4102        "persistent": false,
4103        "recording": true
4104      }
4105    ]
4106  }
4107}
4108
4109= Checking Bitmap bitmap0 =
4110expecting 6 dirty sectors; have 6. OK!
4111
4112--- Write #3 ---
4113
4114write -P0xaa 0x0010000 0x30000
4115{"return": ""}
4116write -P0xbb 0x00d8000 0x10000
4117{"return": ""}
4118write -P0xcc 0x2028000 0x10000
4119{"return": ""}
4120write -P0xdd 0x3fc0000 0x10000
4121{"return": ""}
4122{
4123  "bitmaps": {
4124    "drive0": [
4125      {
4126        "busy": false,
4127        "count": 917504,
4128        "granularity": 65536,
4129        "name": "bitmap0",
4130        "persistent": false,
4131        "recording": true
4132      }
4133    ]
4134  }
4135}
4136
4137= Checking Bitmap bitmap0 =
4138expecting 14 dirty sectors; have 14. OK!
4139
4140--- Reference Backup #2 ---
4141
4142{}
4143{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4144{"return": {}}
4145{}
4146{}
4147{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4148{"return": {}}
4149{}
4150{"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}}}
4151{"return": {}}
4152{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4153
4154--- Test Backup #2 ---
4155
4156{}
4157{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4158{"return": {}}
4159{}
4160{}
4161{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4162{"return": {}}
4163{}
4164{"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}}}
4165{"return": {}}
4166{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
4167{"return": {}}
4168{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4169{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4170{
4171  "bitmaps": {
4172    "drive0": [
4173      {
4174        "busy": false,
4175        "count": 0,
4176        "granularity": 65536,
4177        "name": "bitmap0",
4178        "persistent": false,
4179        "recording": true
4180      }
4181    ]
4182  }
4183}
4184
4185= Checking Bitmap bitmap0 =
4186expecting 0 dirty sectors; have 0. OK!
4187
4188--- Cleanup ---
4189
4190{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
4191{"return": {}}
4192{
4193  "bitmaps": {}
4194}
4195
4196--- Verification ---
4197
4198qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
4199qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4200qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4201
4202
4203=== Mode top; Bitmap Sync on-success without failure ===
4204
4205--- Preparing image & VM ---
4206
4207{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
4208{"return": {}}
4209
4210--- Write #0 ---
4211
4212write -P0x49 0x0000000 0x10000
4213{"return": ""}
4214write -P0x6c 0x0100000 0x10000
4215{"return": ""}
4216write -P0x6f 0x2000000 0x10000
4217{"return": ""}
4218write -P0x76 0x3ff0000 0x10000
4219{"return": ""}
4220{
4221  "bitmaps": {}
4222}
4223
4224--- Reference Backup #0 ---
4225
4226{}
4227{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4228{"return": {}}
4229{}
4230{}
4231{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4232{"return": {}}
4233{}
4234{"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}}}
4235{"return": {}}
4236{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4237
4238--- Add Bitmap ---
4239
4240{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
4241{"return": {}}
4242
4243--- Write #1 ---
4244
4245write -P0x65 0x0000000 0x10000
4246{"return": ""}
4247write -P0x77 0x00f8000 0x10000
4248{"return": ""}
4249write -P0x72 0x2008000 0x10000
4250{"return": ""}
4251write -P0x69 0x3fe0000 0x10000
4252{"return": ""}
4253{
4254  "bitmaps": {
4255    "drive0": [
4256      {
4257        "busy": false,
4258        "count": 393216,
4259        "granularity": 65536,
4260        "name": "bitmap0",
4261        "persistent": false,
4262        "recording": true
4263      }
4264    ]
4265  }
4266}
4267
4268= Checking Bitmap bitmap0 =
4269expecting 6 dirty sectors; have 6. OK!
4270
4271--- Reference Backup #1 ---
4272
4273{}
4274{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4275{"return": {}}
4276{}
4277{}
4278{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4279{"return": {}}
4280{}
4281{"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}}}
4282{"return": {}}
4283{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4284
4285--- Test Backup #1 ---
4286
4287{}
4288{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4289{"return": {}}
4290{}
4291{}
4292{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4293{"return": {}}
4294{}
4295{"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}}}
4296{"return": {}}
4297
4298--- Write #2 ---
4299
4300write -P0x74 0x0010000 0x10000
4301{"return": ""}
4302write -P0x69 0x00e8000 0x10000
4303{"return": ""}
4304write -P0x6e 0x2018000 0x10000
4305{"return": ""}
4306write -P0x67 0x3fe0000 0x20000
4307{"return": ""}
4308{
4309  "bitmaps": {
4310    "backup-top": [
4311      {
4312        "busy": false,
4313        "count": 67108864,
4314        "granularity": 65536,
4315        "persistent": false,
4316        "recording": false
4317      },
4318      {
4319        "busy": false,
4320        "count": 458752,
4321        "granularity": 65536,
4322        "persistent": false,
4323        "recording": false
4324      }
4325    ],
4326    "drive0": [
4327      {
4328        "busy": false,
4329        "count": 0,
4330        "granularity": 65536,
4331        "persistent": false,
4332        "recording": false
4333      },
4334      {
4335        "busy": false,
4336        "count": 458752,
4337        "granularity": 65536,
4338        "persistent": false,
4339        "recording": true
4340      },
4341      {
4342        "busy": true,
4343        "count": 393216,
4344        "granularity": 65536,
4345        "name": "bitmap0",
4346        "persistent": false,
4347        "recording": true
4348      }
4349    ]
4350  }
4351}
4352
4353= Checking Bitmap bitmap0 =
4354expecting 6 dirty sectors; have 6. OK!
4355
4356= Checking Bitmap (anonymous) =
4357expecting 7 dirty sectors; have 7. OK!
4358
4359{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
4360{"return": {}}
4361{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4362{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4363{
4364  "bitmaps": {
4365    "drive0": [
4366      {
4367        "busy": false,
4368        "count": 458752,
4369        "granularity": 65536,
4370        "name": "bitmap0",
4371        "persistent": false,
4372        "recording": true
4373      }
4374    ]
4375  }
4376}
4377
4378= Checking Bitmap bitmap0 =
4379expecting 7 dirty sectors; have 7. OK!
4380
4381--- Write #3 ---
4382
4383write -P0xaa 0x0010000 0x30000
4384{"return": ""}
4385write -P0xbb 0x00d8000 0x10000
4386{"return": ""}
4387write -P0xcc 0x2028000 0x10000
4388{"return": ""}
4389write -P0xdd 0x3fc0000 0x10000
4390{"return": ""}
4391{
4392  "bitmaps": {
4393    "drive0": [
4394      {
4395        "busy": false,
4396        "count": 786432,
4397        "granularity": 65536,
4398        "name": "bitmap0",
4399        "persistent": false,
4400        "recording": true
4401      }
4402    ]
4403  }
4404}
4405
4406= Checking Bitmap bitmap0 =
4407expecting 12 dirty sectors; have 12. OK!
4408
4409--- Reference Backup #2 ---
4410
4411{}
4412{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4413{"return": {}}
4414{}
4415{}
4416{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4417{"return": {}}
4418{}
4419{"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}}}
4420{"return": {}}
4421{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4422
4423--- Test Backup #2 ---
4424
4425{}
4426{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4427{"return": {}}
4428{}
4429{}
4430{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4431{"return": {}}
4432{}
4433{"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}}}
4434{"return": {}}
4435{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
4436{"return": {}}
4437{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4438{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4439{
4440  "bitmaps": {
4441    "drive0": [
4442      {
4443        "busy": false,
4444        "count": 0,
4445        "granularity": 65536,
4446        "name": "bitmap0",
4447        "persistent": false,
4448        "recording": true
4449      }
4450    ]
4451  }
4452}
4453
4454= Checking Bitmap bitmap0 =
4455expecting 0 dirty sectors; have 0. OK!
4456
4457--- Cleanup ---
4458
4459{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
4460{"return": {}}
4461{
4462  "bitmaps": {}
4463}
4464
4465--- Verification ---
4466
4467qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
4468qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4469qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4470
4471
4472=== Mode top; Bitmap Sync always with simulated failure ===
4473
4474--- Preparing image & VM ---
4475
4476{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
4477{"return": {}}
4478
4479--- Write #0 ---
4480
4481write -P0x49 0x0000000 0x10000
4482{"return": ""}
4483write -P0x6c 0x0100000 0x10000
4484{"return": ""}
4485write -P0x6f 0x2000000 0x10000
4486{"return": ""}
4487write -P0x76 0x3ff0000 0x10000
4488{"return": ""}
4489{
4490  "bitmaps": {}
4491}
4492
4493--- Reference Backup #0 ---
4494
4495{}
4496{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4497{"return": {}}
4498{}
4499{}
4500{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4501{"return": {}}
4502{}
4503{"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}}}
4504{"return": {}}
4505{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4506
4507--- Add Bitmap ---
4508
4509{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
4510{"return": {}}
4511
4512--- Write #1 ---
4513
4514write -P0x65 0x0000000 0x10000
4515{"return": ""}
4516write -P0x77 0x00f8000 0x10000
4517{"return": ""}
4518write -P0x72 0x2008000 0x10000
4519{"return": ""}
4520write -P0x69 0x3fe0000 0x10000
4521{"return": ""}
4522{
4523  "bitmaps": {
4524    "drive0": [
4525      {
4526        "busy": false,
4527        "count": 393216,
4528        "granularity": 65536,
4529        "name": "bitmap0",
4530        "persistent": false,
4531        "recording": true
4532      }
4533    ]
4534  }
4535}
4536
4537= Checking Bitmap bitmap0 =
4538expecting 6 dirty sectors; have 6. OK!
4539
4540--- Reference Backup #1 ---
4541
4542{}
4543{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4544{"return": {}}
4545{}
4546{}
4547{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4548{"return": {}}
4549{}
4550{"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}}}
4551{"return": {}}
4552{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4553
4554--- Test Backup #1 ---
4555
4556{}
4557{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4558{"return": {}}
4559{}
4560{}
4561{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4562{"return": {}}
4563{}
4564{"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}}}
4565{"return": {}}
4566
4567--- Write #2 ---
4568
4569write -P0x74 0x0010000 0x10000
4570{"return": ""}
4571write -P0x69 0x00e8000 0x10000
4572{"return": ""}
4573write -P0x6e 0x2018000 0x10000
4574{"return": ""}
4575write -P0x67 0x3fe0000 0x20000
4576{"return": ""}
4577{
4578  "bitmaps": {
4579    "backup-top": [
4580      {
4581        "busy": false,
4582        "count": 67108864,
4583        "granularity": 65536,
4584        "persistent": false,
4585        "recording": false
4586      },
4587      {
4588        "busy": false,
4589        "count": 458752,
4590        "granularity": 65536,
4591        "persistent": false,
4592        "recording": false
4593      }
4594    ],
4595    "drive0": [
4596      {
4597        "busy": false,
4598        "count": 0,
4599        "granularity": 65536,
4600        "persistent": false,
4601        "recording": false
4602      },
4603      {
4604        "busy": false,
4605        "count": 458752,
4606        "granularity": 65536,
4607        "persistent": false,
4608        "recording": true
4609      },
4610      {
4611        "busy": true,
4612        "count": 393216,
4613        "granularity": 65536,
4614        "name": "bitmap0",
4615        "persistent": false,
4616        "recording": true
4617      }
4618    ]
4619  }
4620}
4621
4622= Checking Bitmap bitmap0 =
4623expecting 6 dirty sectors; have 6. OK!
4624
4625= Checking Bitmap (anonymous) =
4626expecting 7 dirty sectors; have 7. OK!
4627
4628{"execute": "job-cancel", "arguments": {"id": "backup_1"}}
4629{"return": {}}
4630{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4631{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_CANCELLED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4632{
4633  "bitmaps": {
4634    "drive0": [
4635      {
4636        "busy": false,
4637        "count": 458752,
4638        "granularity": 65536,
4639        "name": "bitmap0",
4640        "persistent": false,
4641        "recording": true
4642      }
4643    ]
4644  }
4645}
4646
4647= Checking Bitmap bitmap0 =
4648expecting 7 dirty sectors; have 7. OK!
4649
4650--- Write #3 ---
4651
4652write -P0xaa 0x0010000 0x30000
4653{"return": ""}
4654write -P0xbb 0x00d8000 0x10000
4655{"return": ""}
4656write -P0xcc 0x2028000 0x10000
4657{"return": ""}
4658write -P0xdd 0x3fc0000 0x10000
4659{"return": ""}
4660{
4661  "bitmaps": {
4662    "drive0": [
4663      {
4664        "busy": false,
4665        "count": 786432,
4666        "granularity": 65536,
4667        "name": "bitmap0",
4668        "persistent": false,
4669        "recording": true
4670      }
4671    ]
4672  }
4673}
4674
4675= Checking Bitmap bitmap0 =
4676expecting 12 dirty sectors; have 12. OK!
4677
4678--- Reference Backup #2 ---
4679
4680{}
4681{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4682{"return": {}}
4683{}
4684{}
4685{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4686{"return": {}}
4687{}
4688{"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}}}
4689{"return": {}}
4690{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4691
4692--- Test Backup #2 ---
4693
4694{}
4695{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4696{"return": {}}
4697{}
4698{}
4699{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4700{"return": {}}
4701{}
4702{"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}}}
4703{"return": {}}
4704{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
4705{"return": {}}
4706{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4707{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4708{
4709  "bitmaps": {
4710    "drive0": [
4711      {
4712        "busy": false,
4713        "count": 0,
4714        "granularity": 65536,
4715        "name": "bitmap0",
4716        "persistent": false,
4717        "recording": true
4718      }
4719    ]
4720  }
4721}
4722
4723= Checking Bitmap bitmap0 =
4724expecting 0 dirty sectors; have 0. OK!
4725
4726--- Cleanup ---
4727
4728{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
4729{"return": {}}
4730{
4731  "bitmaps": {}
4732}
4733
4734--- Verification ---
4735
4736qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
4737qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4738qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4739
4740
4741=== Mode top; Bitmap Sync always with intermediate failure ===
4742
4743--- Preparing image & VM ---
4744
4745{"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"}}
4746{"return": {}}
4747
4748--- Write #0 ---
4749
4750write -P0x49 0x0000000 0x10000
4751{"return": ""}
4752write -P0x6c 0x0100000 0x10000
4753{"return": ""}
4754write -P0x6f 0x2000000 0x10000
4755{"return": ""}
4756write -P0x76 0x3ff0000 0x10000
4757{"return": ""}
4758{
4759  "bitmaps": {}
4760}
4761
4762--- Reference Backup #0 ---
4763
4764{}
4765{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4766{"return": {}}
4767{}
4768{}
4769{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4770{"return": {}}
4771{}
4772{"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}}}
4773{"return": {}}
4774{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4775
4776--- Add Bitmap ---
4777
4778{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
4779{"return": {}}
4780
4781--- Write #1 ---
4782
4783write -P0x65 0x0000000 0x10000
4784{"return": ""}
4785write -P0x77 0x00f8000 0x10000
4786{"return": ""}
4787write -P0x72 0x2008000 0x10000
4788{"return": ""}
4789write -P0x69 0x3fe0000 0x10000
4790{"return": ""}
4791{
4792  "bitmaps": {
4793    "drive0": [
4794      {
4795        "busy": false,
4796        "count": 393216,
4797        "granularity": 65536,
4798        "name": "bitmap0",
4799        "persistent": false,
4800        "recording": true
4801      }
4802    ]
4803  }
4804}
4805
4806= Checking Bitmap bitmap0 =
4807expecting 6 dirty sectors; have 6. OK!
4808
4809--- Reference Backup #1 ---
4810
4811{}
4812{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4813{"return": {}}
4814{}
4815{}
4816{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4817{"return": {}}
4818{}
4819{"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}}}
4820{"return": {}}
4821{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4822
4823{"return": ""}
4824
4825--- Test Backup #1 ---
4826
4827{}
4828{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4829{"return": {}}
4830{}
4831{}
4832{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4833{"return": {}}
4834{}
4835{"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}}}
4836{"return": {}}
4837{"data": {"action": "report", "device": "backup_1", "operation": "read"}, "event": "BLOCK_JOB_ERROR", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4838{"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"}}
4839{
4840  "bitmaps": {
4841    "drive0": [
4842      {
4843        "busy": false,
4844        "count": 393216,
4845        "granularity": 65536,
4846        "name": "bitmap0",
4847        "persistent": false,
4848        "recording": true
4849      }
4850    ]
4851  }
4852}
4853
4854= Checking Bitmap bitmap0 =
4855expecting 6 dirty sectors; have 6. OK!
4856
4857--- Write #3 ---
4858
4859write -P0xaa 0x0010000 0x30000
4860{"return": ""}
4861write -P0xbb 0x00d8000 0x10000
4862{"return": ""}
4863write -P0xcc 0x2028000 0x10000
4864{"return": ""}
4865write -P0xdd 0x3fc0000 0x10000
4866{"return": ""}
4867{
4868  "bitmaps": {
4869    "drive0": [
4870      {
4871        "busy": false,
4872        "count": 917504,
4873        "granularity": 65536,
4874        "name": "bitmap0",
4875        "persistent": false,
4876        "recording": true
4877      }
4878    ]
4879  }
4880}
4881
4882= Checking Bitmap bitmap0 =
4883expecting 14 dirty sectors; have 14. OK!
4884
4885--- Reference Backup #2 ---
4886
4887{}
4888{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4889{"return": {}}
4890{}
4891{}
4892{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4893{"return": {}}
4894{}
4895{"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}}}
4896{"return": {}}
4897{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4898
4899--- Test Backup #2 ---
4900
4901{}
4902{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4903{"return": {}}
4904{}
4905{}
4906{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4907{"return": {}}
4908{}
4909{"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}}}
4910{"return": {}}
4911{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
4912{"return": {}}
4913{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4914{"data": {"device": "backup_2", "len": 917504, "offset": 917504, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4915{
4916  "bitmaps": {
4917    "drive0": [
4918      {
4919        "busy": false,
4920        "count": 0,
4921        "granularity": 65536,
4922        "name": "bitmap0",
4923        "persistent": false,
4924        "recording": true
4925      }
4926    ]
4927  }
4928}
4929
4930= Checking Bitmap bitmap0 =
4931expecting 0 dirty sectors; have 0. OK!
4932
4933--- Cleanup ---
4934
4935{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
4936{"return": {}}
4937{
4938  "bitmaps": {}
4939}
4940
4941--- Verification ---
4942
4943qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Mismatch, OK!
4944qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4945qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
4946
4947
4948=== Mode top; Bitmap Sync always without failure ===
4949
4950--- Preparing image & VM ---
4951
4952{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
4953{"return": {}}
4954
4955--- Write #0 ---
4956
4957write -P0x49 0x0000000 0x10000
4958{"return": ""}
4959write -P0x6c 0x0100000 0x10000
4960{"return": ""}
4961write -P0x6f 0x2000000 0x10000
4962{"return": ""}
4963write -P0x76 0x3ff0000 0x10000
4964{"return": ""}
4965{
4966  "bitmaps": {}
4967}
4968
4969--- Reference Backup #0 ---
4970
4971{}
4972{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
4973{"return": {}}
4974{}
4975{}
4976{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
4977{"return": {}}
4978{}
4979{"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}}}
4980{"return": {}}
4981{"data": {"device": "ref_backup_0", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
4982
4983--- Add Bitmap ---
4984
4985{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
4986{"return": {}}
4987
4988--- Write #1 ---
4989
4990write -P0x65 0x0000000 0x10000
4991{"return": ""}
4992write -P0x77 0x00f8000 0x10000
4993{"return": ""}
4994write -P0x72 0x2008000 0x10000
4995{"return": ""}
4996write -P0x69 0x3fe0000 0x10000
4997{"return": ""}
4998{
4999  "bitmaps": {
5000    "drive0": [
5001      {
5002        "busy": false,
5003        "count": 393216,
5004        "granularity": 65536,
5005        "name": "bitmap0",
5006        "persistent": false,
5007        "recording": true
5008      }
5009    ]
5010  }
5011}
5012
5013= Checking Bitmap bitmap0 =
5014expecting 6 dirty sectors; have 6. OK!
5015
5016--- Reference Backup #1 ---
5017
5018{}
5019{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
5020{"return": {}}
5021{}
5022{}
5023{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
5024{"return": {}}
5025{}
5026{"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}}}
5027{"return": {}}
5028{"data": {"device": "ref_backup_1", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5029
5030--- Test Backup #1 ---
5031
5032{}
5033{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
5034{"return": {}}
5035{}
5036{}
5037{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
5038{"return": {}}
5039{}
5040{"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}}}
5041{"return": {}}
5042
5043--- Write #2 ---
5044
5045write -P0x74 0x0010000 0x10000
5046{"return": ""}
5047write -P0x69 0x00e8000 0x10000
5048{"return": ""}
5049write -P0x6e 0x2018000 0x10000
5050{"return": ""}
5051write -P0x67 0x3fe0000 0x20000
5052{"return": ""}
5053{
5054  "bitmaps": {
5055    "backup-top": [
5056      {
5057        "busy": false,
5058        "count": 67108864,
5059        "granularity": 65536,
5060        "persistent": false,
5061        "recording": false
5062      },
5063      {
5064        "busy": false,
5065        "count": 458752,
5066        "granularity": 65536,
5067        "persistent": false,
5068        "recording": false
5069      }
5070    ],
5071    "drive0": [
5072      {
5073        "busy": false,
5074        "count": 0,
5075        "granularity": 65536,
5076        "persistent": false,
5077        "recording": false
5078      },
5079      {
5080        "busy": false,
5081        "count": 458752,
5082        "granularity": 65536,
5083        "persistent": false,
5084        "recording": true
5085      },
5086      {
5087        "busy": true,
5088        "count": 393216,
5089        "granularity": 65536,
5090        "name": "bitmap0",
5091        "persistent": false,
5092        "recording": true
5093      }
5094    ]
5095  }
5096}
5097
5098= Checking Bitmap bitmap0 =
5099expecting 6 dirty sectors; have 6. OK!
5100
5101= Checking Bitmap (anonymous) =
5102expecting 7 dirty sectors; have 7. OK!
5103
5104{"execute": "job-finalize", "arguments": {"id": "backup_1"}}
5105{"return": {}}
5106{"data": {"id": "backup_1", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5107{"data": {"device": "backup_1", "len": 458752, "offset": 458752, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5108{
5109  "bitmaps": {
5110    "drive0": [
5111      {
5112        "busy": false,
5113        "count": 458752,
5114        "granularity": 65536,
5115        "name": "bitmap0",
5116        "persistent": false,
5117        "recording": true
5118      }
5119    ]
5120  }
5121}
5122
5123= Checking Bitmap bitmap0 =
5124expecting 7 dirty sectors; have 7. OK!
5125
5126--- Write #3 ---
5127
5128write -P0xaa 0x0010000 0x30000
5129{"return": ""}
5130write -P0xbb 0x00d8000 0x10000
5131{"return": ""}
5132write -P0xcc 0x2028000 0x10000
5133{"return": ""}
5134write -P0xdd 0x3fc0000 0x10000
5135{"return": ""}
5136{
5137  "bitmaps": {
5138    "drive0": [
5139      {
5140        "busy": false,
5141        "count": 786432,
5142        "granularity": 65536,
5143        "name": "bitmap0",
5144        "persistent": false,
5145        "recording": true
5146      }
5147    ]
5148  }
5149}
5150
5151= Checking Bitmap bitmap0 =
5152expecting 12 dirty sectors; have 12. OK!
5153
5154--- Reference Backup #2 ---
5155
5156{}
5157{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
5158{"return": {}}
5159{}
5160{}
5161{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
5162{"return": {}}
5163{}
5164{"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}}}
5165{"return": {}}
5166{"data": {"device": "ref_backup_2", "len": 67108864, "offset": 67108864, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5167
5168--- Test Backup #2 ---
5169
5170{}
5171{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
5172{"return": {}}
5173{}
5174{}
5175{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
5176{"return": {}}
5177{}
5178{"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}}}
5179{"return": {}}
5180{"execute": "job-finalize", "arguments": {"id": "backup_2"}}
5181{"return": {}}
5182{"data": {"id": "backup_2", "type": "backup"}, "event": "BLOCK_JOB_PENDING", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5183{"data": {"device": "backup_2", "len": 786432, "offset": 786432, "speed": 0, "type": "backup"}, "event": "BLOCK_JOB_COMPLETED", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}}
5184{
5185  "bitmaps": {
5186    "drive0": [
5187      {
5188        "busy": false,
5189        "count": 0,
5190        "granularity": 65536,
5191        "name": "bitmap0",
5192        "persistent": false,
5193        "recording": true
5194      }
5195    ]
5196  }
5197}
5198
5199= Checking Bitmap bitmap0 =
5200expecting 0 dirty sectors; have 0. OK!
5201
5202--- Cleanup ---
5203
5204{"execute": "block-dirty-bitmap-remove", "arguments": {"name": "bitmap0", "node": "drive0"}}
5205{"return": {}}
5206{
5207  "bitmaps": {}
5208}
5209
5210--- Verification ---
5211
5212qemu_img compare "TEST_DIR/PID-bsync1" "TEST_DIR/PID-fbackup1" ==> Identical, OK!
5213qemu_img compare "TEST_DIR/PID-bsync2" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
5214qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fbackup2" ==> Identical, OK!
5215
5216
5217=== API failure tests ===
5218
5219--- Preparing image & VM ---
5220
5221{"execute": "blockdev-add", "arguments": {"driver": "qcow2", "file": {"driver": "file", "filename": "TEST_DIR/PID-img"}, "node-name": "drive0"}}
5222{"return": {}}
5223
5224{}
5225{"execute": "job-dismiss", "arguments": {"id": "bdc-file-job"}}
5226{"return": {}}
5227{}
5228{}
5229{"execute": "job-dismiss", "arguments": {"id": "bdc-fmt-job"}}
5230{"return": {}}
5231{}
5232
5233{"execute": "block-dirty-bitmap-add", "arguments": {"granularity": 65536, "name": "bitmap0", "node": "drive0"}}
5234{"return": {}}
5235
5236-- Testing invalid QMP commands --
5237
5238-- Sync mode incremental tests --
5239
5240{"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}}}
5241{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
5242
5243{"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}}}
5244{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
5245
5246{"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}}}
5247{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
5248
5249{"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}}}
5250{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'incremental' sync mode"}}
5251
5252{"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}}}
5253{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5254
5255{"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}}}
5256{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
5257
5258{"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}}}
5259{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
5260
5261{"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}}}
5262{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5263
5264{"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}}}
5265{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
5266
5267{"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}}}
5268{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
5269
5270-- Sync mode bitmap tests --
5271
5272{"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}}}
5273{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
5274
5275{"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}}}
5276{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
5277
5278{"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}}}
5279{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
5280
5281{"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}}}
5282{"error": {"class": "GenericError", "desc": "must provide a valid bitmap name for 'bitmap' sync mode"}}
5283
5284{"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}}}
5285{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5286
5287{"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}}}
5288{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5289
5290{"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}}}
5291{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5292
5293{"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}}}
5294{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5295
5296{"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}}}
5297{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
5298
5299-- Sync mode full tests --
5300
5301{"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}}}
5302{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5303
5304{"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}}}
5305{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5306
5307{"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}}}
5308{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5309
5310{"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}}}
5311{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5312
5313{"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}}}
5314{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5315
5316{"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}}}
5317{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5318
5319{"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}}}
5320{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5321
5322{"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}}}
5323{"error": {"class": "GenericError", "desc": "Bitmap sync mode 'never' has no meaningful effect when combined with sync mode 'full'"}}
5324
5325{"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}}}
5326{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
5327
5328-- Sync mode top tests --
5329
5330{"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}}}
5331{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5332
5333{"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}}}
5334{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5335
5336{"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}}}
5337{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5338
5339{"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}}}
5340{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5341
5342{"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}}}
5343{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5344
5345{"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}}}
5346{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5347
5348{"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}}}
5349{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5350
5351{"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}}}
5352{"error": {"class": "GenericError", "desc": "Bitmap sync mode 'never' has no meaningful effect when combined with sync mode 'top'"}}
5353
5354{"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}}}
5355{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
5356
5357-- Sync mode none tests --
5358
5359{"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}}}
5360{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5361
5362{"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}}}
5363{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5364
5365{"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}}}
5366{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
5367
5368{"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}}}
5369{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5370
5371{"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}}}
5372{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5373
5374{"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}}}
5375{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5376
5377{"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}}}
5378{"error": {"class": "GenericError", "desc": "Bitmap 'bitmap404' could not be found"}}
5379
5380{"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}}}
5381{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
5382
5383{"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}}}
5384{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
5385
5386{"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}}}
5387{"error": {"class": "GenericError", "desc": "sync mode 'none' does not produce meaningful bitmap outputs"}}
5388
5389{"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}}}
5390{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be given when providing a bitmap"}}
5391
5392