Add a case where a bitmap spanning multiple images is missing one of the
intermediate components.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
tests/qemublocktest.c | 8 +
.../bitmap/snapshots-synthetic-broken.json | 819 ++++++++++++++++++
.../bitmap/snapshots-synthetic-broken.out | 12 +
3 files changed, 839 insertions(+)
create mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json
create mode 100644 tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out
diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c
index 133372908a..ada3608e53 100644
--- a/tests/qemublocktest.c
+++ b/tests/qemublocktest.c
@@ -1030,6 +1030,7 @@ mymain(void)
TEST_BITMAP_DETECT("synthetic");
TEST_BITMAP_DETECT("snapshots");
TEST_BITMAP_DETECT("snapshots-synthetic-checkpoint");
+ TEST_BITMAP_DETECT("snapshots-synthetic-broken");
#define TEST_BACKUP_BITMAP_CALCULATE(testname, source, incrbackup, named) \
do { \
@@ -1116,6 +1117,13 @@ mymain(void)
TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "c",
true);
TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "d",
true);
TEST_BITMAP_VALIDATE("snapshots-synthetic-checkpoint", "current",
true);
+
+ TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "a", false);
+ TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "b", true);
+ TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "c", true);
+ TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "d", false);
+ TEST_BITMAP_VALIDATE("snapshots-synthetic-broken", "current",
true);
+
cleanup:
virHashFree(diskxmljsondata.schema);
qemuTestDriverFree(&driver);
diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json
b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json
new file mode 100644
index 0000000000..bf4963494f
--- /dev/null
+++ b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.json
@@ -0,0 +1,819 @@
+[
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "backing-image": {
+ "backing-image": {
+ "backing-image": {
+ "backing-image": {
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.qcow2",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911522",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.qcow2",
+ "backing-filename": "/tmp/pull4.qcow2",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911527",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 217088,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "c",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "b",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename":
"/tmp/pull4.1575911522",
+ "backing-filename": "/tmp/pull4.1575911522",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911540",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 212992,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "d",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "c",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.1575911527",
+ "backing-filename": "/tmp/pull4.1575911527",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911550",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 212992,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "in-use",
+ "auto"
+ ],
+ "name": "current",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+ "in-use"
+ ],
+ "name": "d",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.1575911540",
+ "backing-filename": "/tmp/pull4.1575911540",
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-1-format",
+ "backing_file_depth": 4,
+ "drv": "qcow2",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "backing_file": "/tmp/pull4.1575911540",
+ "dirty-bitmaps": [
+ {
+ "name": "d",
+ "recording": false,
+ "persistent": true,
+ "busy": false,
+ "status": "disabled",
+ "granularity": 65536,
+ "count": 0
+ },
+ {
+ "name": "current",
+ "recording": true,
+ "persistent": true,
+ "busy": false,
+ "status": "active",
+ "granularity": 65536,
+ "count": 0
+ }
+ ],
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911550",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 393728,
+ "filename": "/tmp/pull4.1575911550",
+ "format": "file",
+ "actual-size": 212992,
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-1-storage",
+ "backing_file_depth": 0,
+ "drv": "file",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911550",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "backing-image": {
+ "backing-image": {
+ "backing-image": {
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.qcow2",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911522",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.qcow2",
+ "backing-filename": "/tmp/pull4.qcow2",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911527",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 217088,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "c",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "b",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.1575911522",
+ "backing-filename": "/tmp/pull4.1575911522",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911540",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 212992,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "d",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "c",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.1575911527",
+ "backing-filename": "/tmp/pull4.1575911527",
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": true,
+ "node-name": "libvirt-2-format",
+ "backing_file_depth": 3,
+ "drv": "qcow2",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "backing_file": "/tmp/pull4.1575911527",
+ "dirty-bitmaps": [
+ {
+ "name": "c",
+ "recording": false,
+ "persistent": true,
+ "busy": false,
+ "status": "disabled",
+ "granularity": 65536,
+ "count": 0
+ },
+ {
+ "name": "d",
+ "recording": true,
+ "persistent": true,
+ "busy": false,
+ "status": "active",
+ "granularity": 65536,
+ "inconsistent": true,
+ "count": 0
+ }
+ ],
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911540",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 393728,
+ "filename": "/tmp/pull4.1575911540",
+ "format": "file",
+ "actual-size": 212992,
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-2-storage",
+ "backing_file_depth": 0,
+ "drv": "file",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911540",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "backing-image": {
+ "backing-image": {
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.qcow2",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911522",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.qcow2",
+ "backing-filename": "/tmp/pull4.qcow2",
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911527",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 217088,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "c",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "b",
+ "granularity": 65536
+ },
+ {
+ "flags": [
+
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.1575911522",
+ "backing-filename": "/tmp/pull4.1575911522",
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": true,
+ "node-name": "libvirt-3-format",
+ "backing_file_depth": 2,
+ "drv": "qcow2",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "backing_file": "/tmp/pull4.1575911522",
+ "dirty-bitmaps": [
+ {
+ "name": "a",
+ "recording": false,
+ "persistent": true,
+ "busy": false,
+ "status": "disabled",
+ "granularity": 65536,
+ "count": 0
+ },
+ {
+ "name": "b",
+ "recording": true,
+ "persistent": true,
+ "busy": false,
+ "status": "disabled",
+ "granularity": 65536,
+ "count": 0
+ }
+ ],
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911527",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 459264,
+ "filename": "/tmp/pull4.1575911527",
+ "format": "file",
+ "actual-size": 217088,
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-3-storage",
+ "backing_file_depth": 0,
+ "drv": "file",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911527",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "backing-image": {
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.qcow2",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "dirty-flag": false
+ },
+ "backing-filename-format": "qcow2",
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.1575911522",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "full-backing-filename": "/tmp/pull4.qcow2",
+ "backing-filename": "/tmp/pull4.qcow2",
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": true,
+ "node-name": "libvirt-4-format",
+ "backing_file_depth": 1,
+ "drv": "qcow2",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "backing_file": "/tmp/pull4.qcow2",
+ "dirty-bitmaps": [
+ ],
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911522",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 328192,
+ "filename": "/tmp/pull4.1575911522",
+ "format": "file",
+ "actual-size": 208896,
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-4-storage",
+ "backing_file_depth": 0,
+ "drv": "file",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.1575911522",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 10485760,
+ "filename": "/tmp/pull4.qcow2",
+ "cluster-size": 65536,
+ "format": "qcow2",
+ "actual-size": 208896,
+ "format-specific": {
+ "type": "qcow2",
+ "data": {
+ "compat": "1.1",
+ "lazy-refcounts": false,
+ "bitmaps": [
+ {
+ "flags": [
+ "auto"
+ ],
+ "name": "a",
+ "granularity": 65536
+ }
+ ],
+ "refcount-bits": 16,
+ "corrupt": false
+ }
+ },
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": true,
+ "node-name": "libvirt-5-format",
+ "backing_file_depth": 0,
+ "drv": "qcow2",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "dirty-bitmaps": [
+ {
+ "name": "a",
+ "recording": true,
+ "persistent": true,
+ "busy": false,
+ "status": "active",
+ "granularity": 65536,
+ "count": 0
+ }
+ ],
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.qcow2",
+ "encryption_key_missing": false
+ },
+ {
+ "iops_rd": 0,
+ "detect_zeroes": "off",
+ "image": {
+ "virtual-size": 328192,
+ "filename": "/tmp/pull4.qcow2",
+ "format": "file",
+ "actual-size": 208896,
+ "dirty-flag": false
+ },
+ "iops_wr": 0,
+ "ro": false,
+ "node-name": "libvirt-5-storage",
+ "backing_file_depth": 0,
+ "drv": "file",
+ "iops": 0,
+ "bps_wr": 0,
+ "write_threshold": 0,
+ "encrypted": false,
+ "bps": 0,
+ "bps_rd": 0,
+ "cache": {
+ "no-flush": false,
+ "direct": false,
+ "writeback": true
+ },
+ "file": "/tmp/pull4.qcow2",
+ "encryption_key_missing": false
+ }
+]
diff --git a/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out
b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out
new file mode 100644
index 0000000000..022630bd76
--- /dev/null
+++ b/tests/qemublocktestdata/bitmap/snapshots-synthetic-broken.out
@@ -0,0 +1,12 @@
+libvirt-1-format:
+ d: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
+ current: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
+libvirt-2-format:
+ c: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
+ d: record:1 busy:0 persist:1 inconsist:1 gran:65536 dirty:0
+libvirt-3-format:
+ a: record:0 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
+ b: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
+libvirt-4-format:
+libvirt-5-format:
+ a: record:1 busy:0 persist:1 inconsist:0 gran:65536 dirty:0
--
2.24.1