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