| 1 | QA output created by 081 |
| 2 | |
| 3 | == creating quorum files == |
| 4 | Formatting 'TEST_DIR/1.IMGFMT', fmt=IMGFMT size=10485760 |
| 5 | Formatting 'TEST_DIR/2.IMGFMT', fmt=IMGFMT size=10485760 |
| 6 | Formatting 'TEST_DIR/3.IMGFMT', fmt=IMGFMT size=10485760 |
| 7 | |
| 8 | == writing images == |
| 9 | wrote 10485760/10485760 bytes at offset 0 |
| 10 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 11 | |
| 12 | == checking quorum write == |
| 13 | read 10485760/10485760 bytes at offset 0 |
| 14 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 15 | read 10485760/10485760 bytes at offset 0 |
| 16 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 17 | read 10485760/10485760 bytes at offset 0 |
| 18 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 19 | |
| 20 | == corrupting image == |
| 21 | wrote 10485760/10485760 bytes at offset 0 |
| 22 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 23 | |
| 24 | == checking quorum correction == |
| 25 | read 10485760/10485760 bytes at offset 0 |
| 26 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 27 | |
| 28 | == checking mixed reference/option specification == |
| 29 | Testing: |
| 30 | QMP_VERSION |
| 31 | {"return": {}} |
| 32 | {"return": {}} |
| 33 | {"return": {}} |
| 34 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "QUORUM_REPORT_BAD", "data": {"node-name": "drive2", "sectors-count": 20480, "sector-num": 0, "type": "read"}} |
| 35 | read 10485760/10485760 bytes at offset 0 |
| 36 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 37 | {"return": ""} |
| 38 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 39 | {"return": {}} |
| 40 | |
| 41 | |
| 42 | == using quorum rewrite corrupted mode == |
| 43 | read 10485760/10485760 bytes at offset 0 |
| 44 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 45 | |
| 46 | == checking that quorum has corrected the corrupted file == |
| 47 | read 10485760/10485760 bytes at offset 0 |
| 48 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 49 | |
| 50 | == using quorum rewrite corrupted mode without WRITE permission == |
| 51 | -- corrupting -- |
| 52 | wrote 1048576/1048576 bytes at offset 1048576 |
| 53 | 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 54 | |
| 55 | -- running quorum -- |
| 56 | Testing: -blockdev file,node-name=file1,filename=TEST_DIR/1.IMGFMT -blockdev file,node-name=file2,filename=TEST_DIR/2.IMGFMT -blockdev file,node-name=file3,filename=TEST_DIR/3.IMGFMT -blockdev { |
| 57 | "driver": "quorum", |
| 58 | "node-name": "quorum", |
| 59 | "read-only": true, |
| 60 | "vote-threshold": 2, |
| 61 | "rewrite-corrupted": true, |
| 62 | "children": [ "file1", "file2", "file3" ] |
| 63 | } -device virtio-scsi,id=scsi -device scsi-hd,id=quorum-drive,bus=scsi.0,drive=quorum |
| 64 | QMP_VERSION |
| 65 | {"return": {}} |
| 66 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "QUORUM_REPORT_BAD", "data": {"node-name": "file2", "sectors-count": 20480, "sector-num": 0, "type": "read"}} |
| 67 | read 10485760/10485760 bytes at offset 0 |
| 68 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 69 | {"return": ""} |
| 70 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 71 | {"return": {}} |
| 72 | |
| 73 | -- checking that the image has been corrected -- |
| 74 | read 10485760/10485760 bytes at offset 0 |
| 75 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 76 | |
| 77 | == breaking quorum == |
| 78 | wrote 10485760/10485760 bytes at offset 0 |
| 79 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 80 | wrote 10485760/10485760 bytes at offset 0 |
| 81 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 82 | |
| 83 | == checking that quorum is broken == |
| 84 | qemu-io: read failed: Input/output error |
| 85 | |
| 86 | == checking the blkverify mode with broken content == |
| 87 | quorum: offset=0 bytes=10485760 contents mismatch at offset 0 |
| 88 | |
| 89 | == writing the same data to both files == |
| 90 | wrote 10485760/10485760 bytes at offset 0 |
| 91 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 92 | wrote 10485760/10485760 bytes at offset 0 |
| 93 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 94 | |
| 95 | == checking the blkverify mode with valid content == |
| 96 | read 10485760/10485760 bytes at offset 0 |
| 97 | 10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) |
| 98 | |
| 99 | == checking the blkverify mode with invalid settings == |
| 100 | qemu-io: can't open: blkverify=on can only be set if there are exactly two files and vote-threshold is 2 |
| 101 | |
| 102 | == dynamically adding a child to a quorum == |
| 103 | Testing: |
| 104 | QMP_VERSION |
| 105 | {"return": {}} |
| 106 | {"return": {}} |
| 107 | {"return": {}} |
| 108 | {"return": {}} |
| 109 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 110 | {"return": {}} |
| 111 | |
| 112 | Testing: |
| 113 | QMP_VERSION |
| 114 | {"return": {}} |
| 115 | {"return": {}} |
| 116 | {"return": {}} |
| 117 | {"error": {"class": "GenericError", "desc": "Cannot add a child to a quorum in blkverify mode"}} |
| 118 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 119 | {"return": {}} |
| 120 | |
| 121 | |
| 122 | == dynamically removing a child from a quorum == |
| 123 | Testing: |
| 124 | QMP_VERSION |
| 125 | {"return": {}} |
| 126 | {"return": {}} |
| 127 | {"return": {}} |
| 128 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 129 | {"return": {}} |
| 130 | |
| 131 | Testing: |
| 132 | QMP_VERSION |
| 133 | {"return": {}} |
| 134 | {"return": {}} |
| 135 | {"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}} |
| 136 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 137 | {"return": {}} |
| 138 | |
| 139 | Testing: |
| 140 | QMP_VERSION |
| 141 | {"return": {}} |
| 142 | {"error": {"class": "GenericError", "desc": "blkverify=on can only be set if there are exactly two files and vote-threshold is 2"}} |
| 143 | {"error": {"class": "GenericError", "desc": "Cannot find device='drive0-quorum' nor node-name='drive0-quorum'"}} |
| 144 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 145 | {"return": {}} |
| 146 | |
| 147 | Testing: |
| 148 | QMP_VERSION |
| 149 | {"return": {}} |
| 150 | {"return": {}} |
| 151 | {"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}} |
| 152 | {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} |
| 153 | {"return": {}} |
| 154 | |
| 155 | *** done |