 f93e65ee51
			
		
	
	
		f93e65ee51
		
	
	
	
	
		
			
			As the previous commit changes the logic of "qemu-img rebase" (it's using
write alignment now), let's add a couple more test cases which would
ensure it works correctly.  In particular, the following scenarios:
024: add test case for rebase within one backing chain when the overlay
     cluster size > backings cluster size;
271: add test case for rebase images that contain subclusters.  Check
     that no extra allocations are being made.
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Reviewed-by: Hanna Czenczek <hreitz@redhat.com>
Message-ID: <20230919165804.439110-7-andrey.drobyshev@virtuozzo.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
		
	
			
		
			
				
	
	
		
			248 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| QA output created by 024
 | |
| Creating backing file
 | |
| 
 | |
| Formatting 'TEST_DIR/t.IMGFMT.base_old', fmt=IMGFMT size=1073741824
 | |
| === IO: pattern 0x11
 | |
| wrote 65536/65536 bytes at offset 0
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 131072
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 393216
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 524288
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 655360
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 786432
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 917504
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| Creating new backing file
 | |
| 
 | |
| Formatting 'TEST_DIR/t.IMGFMT.base_new', fmt=IMGFMT size=1073741824
 | |
| === IO: pattern 0x22
 | |
| wrote 131072/131072 bytes at offset 0
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 131072/131072 bytes at offset 262144
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 131072/131072 bytes at offset 524288
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 131072/131072 bytes at offset 786432
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| Creating COW image
 | |
| 
 | |
| Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824 backing_file=TEST_DIR/t.IMGFMT.base_old backing_fmt=IMGFMT
 | |
| === IO: pattern 0x33
 | |
| wrote 262144/262144 bytes at offset 0
 | |
| 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| wrote 262144/262144 bytes at offset 524288
 | |
| 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| Read before the rebase to make sure everything is set up correctly
 | |
| 
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 0
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 65536
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 131072
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 196608
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 327680
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 393216
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 458752
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 524288
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 589824
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 655360
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 720896
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 786432
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 851968
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 917504
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 983040
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Rebase and test again
 | |
| 
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 0
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 65536
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 131072
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 196608
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 327680
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 393216
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 458752
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 524288
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 589824
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 655360
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x33
 | |
| read 65536/65536 bytes at offset 720896
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 786432
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 851968
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x11
 | |
| read 65536/65536 bytes at offset 917504
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| === IO: pattern 0x00
 | |
| read 65536/65536 bytes at offset 983040
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| === Test rebase in a subdirectory of the working directory ===
 | |
| 
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=1048576
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=1048576
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=1048576 backing_file=t.IMGFMT.base_old backing_fmt=IMGFMT
 | |
| 
 | |
| wrote 131072/131072 bytes at offset 0
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 196608
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 131072/131072 bytes at offset 65536
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 196608
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| backing file: t.IMGFMT.base_new (actual path: TEST_DIR/subdir/t.IMGFMT.base_new)
 | |
| 
 | |
| read 65536/65536 bytes at offset 0
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 65536
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 131072
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 196608
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Offset          Length          File
 | |
| 0               0x30000         TEST_DIR/subdir/t.IMGFMT
 | |
| 0x30000         0x10000         TEST_DIR/subdir/t.IMGFMT.base_new
 | |
| 
 | |
| === Test rebase within one backing chain ===
 | |
| 
 | |
| Creating backing chain
 | |
| 
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=327680
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=262144 backing_file=TEST_DIR/subdir/t.IMGFMT.base_new backing_fmt=IMGFMT
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=327680 backing_file=TEST_DIR/subdir/t.IMGFMT.base_old backing_fmt=IMGFMT
 | |
| 
 | |
| Fill backing files with data
 | |
| 
 | |
| wrote 327680/327680 bytes at offset 0
 | |
| 320 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 262144/262144 bytes at offset 0
 | |
| 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Check the last cluster is zeroed in overlay before the rebase
 | |
| 
 | |
| read 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Rebase onto another image in the same chain
 | |
| 
 | |
| Verify that data is read the same before and after rebase
 | |
| 
 | |
| read 262144/262144 bytes at offset 0
 | |
| 256 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| 
 | |
| === Test rebase with different cluster sizes ===
 | |
| 
 | |
| Creating backing chain
 | |
| 
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_new', fmt=IMGFMT size=393216
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT.base_old', fmt=IMGFMT size=393216 backing_file=TEST_DIR/subdir/t.IMGFMT.base_new backing_fmt=IMGFMT
 | |
| Formatting 'TEST_DIR/subdir/t.IMGFMT', fmt=IMGFMT size=393216 backing_file=TEST_DIR/subdir/t.IMGFMT.base_old backing_fmt=IMGFMT
 | |
| image: TEST_DIR/subdir/t.IMGFMT
 | |
| file format: IMGFMT
 | |
| virtual size: 384 KiB (393216 bytes)
 | |
| cluster_size: 131072
 | |
| backing file: TEST_DIR/subdir/t.IMGFMT.base_old
 | |
| backing file format: IMGFMT
 | |
| 
 | |
| Fill backing files with data
 | |
| 
 | |
| wrote 65536/65536 bytes at offset 65536
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| wrote 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Rebase onto another image in the same chain
 | |
| 
 | |
| Verify that data is read the same before and after rebase
 | |
| 
 | |
| read 65536/65536 bytes at offset 0
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 65536
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 131072/131072 bytes at offset 131072
 | |
| 128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 262144
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| read 65536/65536 bytes at offset 327680
 | |
| 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 | |
| 
 | |
| Verify that untouched cluster remains unallocated
 | |
| 
 | |
| Offset          Length          File
 | |
| 0               0x20000         TEST_DIR/subdir/t.IMGFMT
 | |
| 0x40000         0x20000         TEST_DIR/subdir/t.IMGFMT
 | |
| 
 | |
| *** done
 |