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 37=== Set up NBD with normal access === 38 39{"execute":"nbd-server-add", 40 "arguments":{"device":"n"}} 41{"error": {"class": "GenericError", "desc": "NBD server not running"}} 42{"execute":"nbd-server-start", 43 "arguments":{"addr":{"type":"unix", 44 "data":{"path":"SOCK_DIR/nbd"}}}} 45{"return": {}} 46{"execute":"nbd-server-start", 47 "arguments":{"addr":{"type":"unix", 48 "data":{"path":"SOCK_DIR/nbd1"}}}} 49{"error": {"class": "GenericError", "desc": "NBD server already running"}} 50exports available: 0 51{"execute":"nbd-server-add", 52 "arguments":{"device":"n", "bitmap":"b"}} 53{"return": {}} 54{"execute":"nbd-server-add", 55 "arguments":{"device":"nosuch"}} 56{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}} 57{"execute":"nbd-server-add", 58 "arguments":{"device":"n"}} 59{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}} 60{"execute":"nbd-server-add", 61 "arguments":{"device":"n", "name":"n2", 62 "bitmap":"b2"}} 63{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 64{"execute":"nbd-server-add", 65 "arguments":{"device":"n", "name":"n2", 66 "bitmap":"b3"}} 67{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 68{"execute":"nbd-server-add", 69 "arguments":{"device":"n", "name":"n2", "writable":true, 70 "description":"some text", "bitmap":"b2"}} 71{"return": {}} 72exports available: 2 73 export: 'n' 74 size: 4194304 75 flags: 0x58f ( readonly flush fua df multi cache ) 76 min block: 1 77 opt block: 4096 78 max block: 33554432 79 available meta contexts: 2 80 base:allocation 81 qemu:dirty-bitmap:b 82 export: 'n2' 83 description: some text 84 size: 4194304 85 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 86 min block: 1 87 opt block: 4096 88 max block: 33554432 89 available meta contexts: 2 90 base:allocation 91 qemu:dirty-bitmap:b2 92 93=== Contrast normal status to large granularity dirty-bitmap === 94 95read 512/512 bytes at offset 512 96512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 97read 524288/524288 bytes at offset 524288 98512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 99read 1048576/1048576 bytes at offset 1048576 1001 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 101read 2097152/2097152 bytes at offset 2097152 1022 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 103[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 104{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 105{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 106[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 107{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 108{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 109 110=== Contrast to small granularity dirty-bitmap === 111 112[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 113{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 114{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 115{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 116 117=== End qemu NBD server === 118 119{"execute":"nbd-server-remove", 120 "arguments":{"name":"n"}} 121{"return": {}} 122{"execute":"nbd-server-remove", 123 "arguments":{"name":"n2"}} 124{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}} 125{"return": {}} 126{"execute":"nbd-server-remove", 127 "arguments":{"name":"n2"}} 128{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}} 129{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 130{"execute":"nbd-server-stop"} 131{"return": {}} 132{"execute":"nbd-server-stop"} 133{"error": {"class": "GenericError", "desc": "NBD server not running"}} 134 135=== Set up NBD with iothread access === 136 137{"execute":"x-blockdev-set-iothread", 138 "arguments":{"node-name":"n", "iothread":"io0"}} 139{"return": {}} 140{"execute":"nbd-server-add", 141 "arguments":{"device":"n"}} 142{"error": {"class": "GenericError", "desc": "NBD server not running"}} 143{"execute":"nbd-server-start", 144 "arguments":{"addr":{"type":"unix", 145 "data":{"path":"SOCK_DIR/nbd"}}}} 146{"return": {}} 147{"execute":"nbd-server-start", 148 "arguments":{"addr":{"type":"unix", 149 "data":{"path":"SOCK_DIR/nbd1"}}}} 150{"error": {"class": "GenericError", "desc": "NBD server already running"}} 151exports available: 0 152{"execute":"nbd-server-add", 153 "arguments":{"device":"n", "bitmap":"b"}} 154{"return": {}} 155{"execute":"nbd-server-add", 156 "arguments":{"device":"nosuch"}} 157{"error": {"class": "GenericError", "desc": "Cannot find device=nosuch nor node_name=nosuch"}} 158{"execute":"nbd-server-add", 159 "arguments":{"device":"n"}} 160{"error": {"class": "GenericError", "desc": "Block export id 'n' is already in use"}} 161{"execute":"nbd-server-add", 162 "arguments":{"device":"n", "name":"n2", 163 "bitmap":"b2"}} 164{"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2' incompatible with readonly export"}} 165{"execute":"nbd-server-add", 166 "arguments":{"device":"n", "name":"n2", 167 "bitmap":"b3"}} 168{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}} 169{"execute":"nbd-server-add", 170 "arguments":{"device":"n", "name":"n2", "writable":true, 171 "description":"some text", "bitmap":"b2"}} 172{"return": {}} 173exports available: 2 174 export: 'n' 175 size: 4194304 176 flags: 0x58f ( readonly flush fua df multi cache ) 177 min block: 1 178 opt block: 4096 179 max block: 33554432 180 available meta contexts: 2 181 base:allocation 182 qemu:dirty-bitmap:b 183 export: 'n2' 184 description: some text 185 size: 4194304 186 flags: 0xced ( flush fua trim zeroes df cache fast-zero ) 187 min block: 1 188 opt block: 4096 189 max block: 33554432 190 available meta contexts: 2 191 base:allocation 192 qemu:dirty-bitmap:b2 193 194=== Contrast normal status to large granularity dirty-bitmap === 195 196read 512/512 bytes at offset 512 197512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 198read 524288/524288 bytes at offset 524288 199512 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 200read 1048576/1048576 bytes at offset 1048576 2011 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 202read 2097152/2097152 bytes at offset 2097152 2032 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 204[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 205{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}, 206{ "start": 1048576, "length": 3145728, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 207[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 208{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 209{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 210 211=== Contrast to small granularity dirty-bitmap === 212 213[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 214{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 215{ "start": 1024, "length": 2096128, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 216{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 217 218=== End qemu NBD server === 219 220{"execute":"nbd-server-remove", 221 "arguments":{"name":"n"}} 222{"return": {}} 223{"execute":"nbd-server-remove", 224 "arguments":{"name":"n2"}} 225{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n"}} 226{"return": {}} 227{"execute":"nbd-server-remove", 228 "arguments":{"name":"n2"}} 229{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_EXPORT_DELETED", "data": {"id": "n2"}} 230{"error": {"class": "GenericError", "desc": "Export 'n2' is not found"}} 231{"execute":"nbd-server-stop"} 232{"return": {}} 233{"execute":"nbd-server-stop"} 234{"error": {"class": "GenericError", "desc": "NBD server not running"}} 235{"execute":"quit"} 236{"return": {}} 237{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false, "reason": "host-qmp-quit"}} 238 239=== Use qemu-nbd as server === 240 241[{ "start": 0, "length": 65536, "depth": 0, "zero": false, "data": false}, 242{ "start": 65536, "length": 2031616, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 243{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 244[{ "start": 0, "length": 512, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 245{ "start": 512, "length": 512, "depth": 0, "zero": false, "data": false}, 246{ "start": 1024, "length": 11321, "depth": 0, "zero": false, "data": true, "offset": OFFSET}] 247[{ "start": 12345, "length": 2084807, "depth": 0, "zero": false, "data": true, "offset": OFFSET}, 248{ "start": 2097152, "length": 2097152, "depth": 0, "zero": false, "data": false}] 249*** done 250