1QA output created by 223 2 3=== Create partially sparse image, then add dirty bitmaps === 4 5Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4194304 6wrote 2097152/2097152 bytes at offset 1048576 72 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 8Testing: 9QMP_VERSION 10{"return": {}} 11{"return": {}} 12{"return": {}} 13{"return": {}} 14{"return": {}} 15{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 16 17 18=== Write part of the file under active bitmap === 19 20wrote 512/512 bytes at offset 512 21512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 22wrote 2097152/2097152 bytes at offset 2097152 232 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 24 25=== End dirty bitmaps, and start serving image over NBD === 26 27{"execute":"qmp_capabilities"} 28{"return": {}} 29{"execute":"blockdev-add", 30 "arguments":{"driver":"IMGFMT", "node-name":"n", 31 "file":{"driver":"file", "filename":"TEST_DIR/t.IMGFMT"}}} 32{"return": {}} 33{"execute":"block-dirty-bitmap-disable", 34 "arguments":{"node":"n", "name":"b"}} 35{"return": {}} 36{"execute":"blockdev-add", 37 "arguments":{"driver":"null-co", "node-name":"null", 38 "size": 4194304}} 39{"return": {}} 40{"execute":"block-dirty-bitmap-add", 41 "arguments":{"node":"null", "name":"b3"}} 42{"return": {}} 43 44=== Set up NBD with normal access === 45 46{"execute":"nbd-server-add", 47 "arguments":{"device":"n"}} 48{"error": {"class": "GenericError", "desc": "NBD server not running"}} 49{"execute":"nbd-server-start", 50 "arguments":{"addr":{"type":"unix", 51 "data":{"path":"SOCK_DIR/nbd"}}}} 52{"return": {}} 53{"execute":"nbd-server-start", 54 "arguments":{"addr":{"type":"unix", 55 "data":{"path":"SOCK_DIR/nbd1"}}}} 56{"error": {"class": "GenericError", "desc": "NBD server already running"}} 57exports available: 0 58{"execute":"nbd-server-add", 59 "arguments":{"device":"n", "bitmap":"b"}} 60{"return": {}} 61{"execute":"nbd-server-add", 62 "arguments":{"device":"nosuch"}} 63{"error": {"class": "GenericError", "desc": "Cannot find device='nosuch' nor node-name='nosuch'"}} 64{"execute":"nbd-server-add", 65 "arguments":{"device":"n"}} 66{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}} 67{"execute":"nbd-server-add", 68 "arguments":{"device":"n", "name":"n2", 69 "bitmap":"b2"}} 70{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 71{"execute":"nbd-server-add", 72 "arguments":{"device":"n", "name":"n2", 73 "bitmap":"b3"}} 74{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 75{"execute":"nbd-server-add", 76 "arguments":{"device":"n", "name":"n2", "writable":true, 77 "description":"some text", "bitmap":"b2"}} 78{"return": {}} 79{"execute":"block-export-add", 80 "arguments":{"type": "nbd", "node-name":"n", "id":"n3", "name": "n3", 81 "bitmaps":[{"node":"null","name":"b3"}]}} 82{"return": {}} 83exports available: 3 84 export: 'n' 85 size: 4194304 86 flags: 0x158f ( readonly flush fua df multi cache block-status-payload ) 87 min block: 1 88 opt block: 4096 89 max block: 33554432 90 transaction size: 64-bit 91 available meta contexts: 2 92 base:allocation 93 qemu:dirty-bitmap:b 94 export: 'n2' 95 description: some text 96 size: 4194304 97 flags: 0x1ded ( flush fua trim zeroes df multi cache fast-zero block-status-payload ) 98 min block: 1 99 opt block: 4096 100 max block: 33554432 101 transaction size: 64-bit 102 available meta contexts: 2 103 base:allocation 104 qemu:dirty-bitmap:b2 105 export: 'n3' 106 size: 4194304 107 flags: 0x158f ( readonly flush fua df multi cache block-status-payload ) 108 min block: 1 109 opt block: 4096 110 max block: 33554432 111 transaction size: 64-bit 112 available meta contexts: 2 113 base:allocation 114 qemu:dirty-bitmap:b3 115 116=== Contrast normal status to large granularity dirty-bitmap === 117 118read 512/512 bytes at offset 512 119512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 120read 524288/524288 bytes at offset 524288 121512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 122read 1048576/1048576 bytes at offset 1048576 1231 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 124read 2097152/2097152 bytes at offset 2097152 1252 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 126[{ "start": 0, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 127{ "start": 4096, "length": 1044480, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}, 128{ "start": 1048576, "length": 3145728, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}] 129[{ "start": 0, "length": 65536, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 130{ "start": 65536, "length": 2031616, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 131{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 132 133=== Contrast to small granularity dirty-bitmap === 134 135[{ "start": 0, "length": 512, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 136{ "start": 512, "length": 512, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 137{ "start": 1024, "length": 2096128, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 138{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 139 140=== Check bitmap taken from another node === 141 142[{ "start": 0, "length": 4194304, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}] 143 144=== End qemu NBD server === 145 146{"execute":"nbd-server-remove", 147 "arguments":{"name":"n"}} 148{"return": {}} 149{"execute":"nbd-server-remove", 150 "arguments":{"name":"n2"}} 151{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}} 152{"return": {}} 153{"execute":"nbd-server-remove", 154 "arguments":{"name":"n2"}} 155{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}} 156{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 157{"execute":"nbd-server-stop"} 158{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n3"}} 159{"return": {}} 160{"execute":"nbd-server-stop"} 161{"error": {"class": "GenericError", "desc": "NBD server not running"}} 162 163=== Set up NBD with iothread access === 164 165{"execute":"x-blockdev-set-iothread", 166 "arguments":{"node-name":"n", "iothread":"io0"}} 167{"return": {}} 168{"execute":"nbd-server-add", 169 "arguments":{"device":"n"}} 170{"error": {"class": "GenericError", "desc": "NBD server not running"}} 171{"execute":"nbd-server-start", 172 "arguments":{"addr":{"type":"unix", 173 "data":{"path":"SOCK_DIR/nbd"}}}} 174{"return": {}} 175{"execute":"nbd-server-start", 176 "arguments":{"addr":{"type":"unix", 177 "data":{"path":"SOCK_DIR/nbd1"}}}} 178{"error": {"class": "GenericError", "desc": "NBD server already running"}} 179exports available: 0 180{"execute":"nbd-server-add", 181 "arguments":{"device":"n", "bitmap":"b"}} 182{"return": {}} 183{"execute":"nbd-server-add", 184 "arguments":{"device":"nosuch"}} 185{"error": {"class": "GenericError", "desc": "Cannot find device='nosuch' nor node-name='nosuch'"}} 186{"execute":"nbd-server-add", 187 "arguments":{"device":"n"}} 188{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}} 189{"execute":"nbd-server-add", 190 "arguments":{"device":"n", "name":"n2", 191 "bitmap":"b2"}} 192{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 193{"execute":"nbd-server-add", 194 "arguments":{"device":"n", "name":"n2", 195 "bitmap":"b3"}} 196{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 197{"execute":"nbd-server-add", 198 "arguments":{"device":"n", "name":"n2", "writable":true, 199 "description":"some text", "bitmap":"b2"}} 200{"return": {}} 201{"execute":"block-export-add", 202 "arguments":{"type": "nbd", "node-name":"n", "id":"n3", "name": "n3", 203 "bitmaps":[{"node":"null","name":"b3"}]}} 204{"return": {}} 205exports available: 3 206 export: 'n' 207 size: 4194304 208 flags: 0x158f ( readonly flush fua df multi cache block-status-payload ) 209 min block: 1 210 opt block: 4096 211 max block: 33554432 212 transaction size: 64-bit 213 available meta contexts: 2 214 base:allocation 215 qemu:dirty-bitmap:b 216 export: 'n2' 217 description: some text 218 size: 4194304 219 flags: 0x1ded ( flush fua trim zeroes df multi cache fast-zero block-status-payload ) 220 min block: 1 221 opt block: 4096 222 max block: 33554432 223 transaction size: 64-bit 224 available meta contexts: 2 225 base:allocation 226 qemu:dirty-bitmap:b2 227 export: 'n3' 228 size: 4194304 229 flags: 0x158f ( readonly flush fua df multi cache block-status-payload ) 230 min block: 1 231 opt block: 4096 232 max block: 33554432 233 transaction size: 64-bit 234 available meta contexts: 2 235 base:allocation 236 qemu:dirty-bitmap:b3 237 238=== Contrast normal status to large granularity dirty-bitmap === 239 240read 512/512 bytes at offset 512 241512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 242read 524288/524288 bytes at offset 524288 243512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 244read 1048576/1048576 bytes at offset 1048576 2451 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 246read 2097152/2097152 bytes at offset 2097152 2472 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 248[{ "start": 0, "length": 4096, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 249{ "start": 4096, "length": 1044480, "depth": 0, "present": true, "zero": true, "data": false, "compressed": false, "offset": OFFSET}, 250{ "start": 1048576, "length": 3145728, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}] 251[{ "start": 0, "length": 65536, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 252{ "start": 65536, "length": 2031616, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 253{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 254 255=== Contrast to small granularity dirty-bitmap === 256 257[{ "start": 0, "length": 512, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 258{ "start": 512, "length": 512, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 259{ "start": 1024, "length": 2096128, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 260{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 261 262=== Check bitmap taken from another node === 263 264[{ "start": 0, "length": 4194304, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}] 265 266=== End qemu NBD server === 267 268{"execute":"nbd-server-remove", 269 "arguments":{"name":"n"}} 270{"return": {}} 271{"execute":"nbd-server-remove", 272 "arguments":{"name":"n2"}} 273{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}} 274{"return": {}} 275{"execute":"nbd-server-remove", 276 "arguments":{"name":"n2"}} 277{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}} 278{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 279{"execute":"nbd-server-stop"} 280{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n3"}} 281{"return": {}} 282{"execute":"nbd-server-stop"} 283{"error": {"class": "GenericError", "desc": "NBD server not running"}} 284{"execute":"quit"} 285{"return": {}} 286{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 287 288=== Use qemu-nbd as server === 289 290[{ "start": 0, "length": 65536, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 291{ "start": 65536, "length": 2031616, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 292{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 293[{ "start": 0, "length": 512, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 294{ "start": 512, "length": 512, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}, 295{ "start": 1024, "length": 11321, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}] 296[{ "start": 12345, "length": 2084807, "depth": 0, "present": true, "zero": false, "data": true, "compressed": false, "offset": OFFSET}, 297{ "start": 2097152, "length": 2097152, "depth": 0, "present": false, "zero": false, "data": false, "compressed": false}] 298*** done 299