On Wed, May 21, 2025 at 11:54:03AM +0200, Fiona Ebner wrote:
> Hi,
> 
> Am 15.05.25 um 04:28 schrieb Eric Blake:
> > +do_test full ignore off full
> 
> for me, this one fails irregularly (more than 50% of the time) with:
> -Destination is full; expected full
> +Destination is unknown; expected full
> 
> My file system is ext4 inside a virtual machine.
> > [I] febner@dev8 ~/repos/qemu/build/tests/qemu-iotests (master) [1]> findmnt 
> > --target .
> > TARGET             SOURCE   FSTYPE OPTIONS
> > /home/febner/repos /dev/sdb ext4   rw,relatime
> 
> The virtual disk is an LVM image. When the test fails, I consistently
> get 20975616 bytes rather than 20971520 bytes as the result of
> disk_usage(), i.e. it has one 4 KiB block more. ls -l will still report
> 20971520 bytes as the length, qemu-img compare succeeds.

Odd, but should be something I can cater to by treating any value >=
20M (rather than exactly 20M) as fully allocated (the test still does
the qemu-img compare to ensure that the actual length compares
correctly, even if the allocated length was slightly overallocated due
to filesystem magic).

> 
> After the image creation, i.e. job1, the allocation is still as expected:
> > +20971520   
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> > +-rw-r--r-- 1 febner febner 20971520 May 21 11:18 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> 
> Only after mirroring, i.e. job2, it will be larger:
> > +20975616   
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> > +-rw-r--r-- 1 febner febner 20971520 May 21 11:18 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw

Weird, but filesystems have been known to do weird things.  So the
test should be updated to tolerate it.

> 
> Some more information:
> 
> > [I] febner@dev8 ~/repos/qemu/tests/qemu-iotests/tests (master)> sudo 
> > filefrag 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> >  -e
> > Filesystem type is: ef53
> > File size of 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> >  is 20971520 (5120 blocks of 4096 bytes)
> >  ext:     logical_offset:        physical_offset: length:   expected: flags:
> >    0:        0..      15:   36233216..  36233231:     16:            
> >    1:       16..    2047:   36233232..  36235263:   2032:             
> > unwritten
> >    2:     2048..    2559:   36239360..  36239871:    512:   36235264:
> >    3:     2560..    4095:   36239872..  36241407:   1536:             
> > unwritten
> >    4:     4096..    5119:   33792000..  33793023:   1024:   36241408: 
> > last,unwritten,eof
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw:
> >  3 extents found
> 
> Note that one of the offsets is not 4KiB-aligned:
> > 36239360%4096
> > 2048
> 
> I suppose that is the reason?
> 
> > [I] febner@dev8 ~/repos/qemu/tests/qemu-iotests/tests (master)> stat 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> >   File: 
> > /home/febner/repos/qemu/build/tests/qemu-iotests/scratch/raw-file-mirror-sparse/t.raw
> >   Size: 20971520    Blocks: 40968      IO Block: 4096   regular file
> > Device: 8,16        Inode: 4866541     Links: 1
> > Access: (0644/-rw-r--r--)  Uid: ( 1000/  febner)   Gid: ( 1000/  febner)
> > Access: 2025-05-21 11:18:37.622692254 +0200
> > Modify: 2025-05-21 11:18:37.540686997 +0200
> > Change: 2025-05-21 11:18:37.540686997 +0200
> >  Birth: 2025-05-21 11:18:37.463682059 +0200
> 
> I also tried it on my host, where the filesystem is ZFS using
> compression, and there, 'du' will already report a lower value after
> creating the image, because of compression. And even without compression
> it seems that preallocation=full on ZFS is somehow async :/
> 
> > [I] febner@enia ~/qemu/build/tests/qemu-iotests (master)> qemu-img create 
> > my.raw 20M -f raw -o preallocation=full
> > Formatting 'my.raw', fmt=raw size=20971520 preallocation=full
> > [I] febner@enia ~/qemu/build/tests/qemu-iotests (master)> du --block-size=1 
> > my.raw
> > 512 my.raw
> > [I] febner@enia ~/qemu/build/tests/qemu-iotests (master)> du --block-size=1 
> > my.raw
> > 20980224    my.raw

That one may be a bit harder to work around, but I'll give it a shot
while I'm patching the first one.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.
Virtualization:  qemu.org | libguestfs.org


Reply via email to