libvirt: Report the allocated size of preallocated file based disks
At present the Libvirt driver can preallocate file based disks using the
fallocate command and importantly the `-n` option. This option allocates
blocks on the filesystem past the initial EOF of a given file:
This results in a miscalculation of the total disk overcommit for file
based (excluding ploop) disks as os.path.getsize is currently used to
determine the allocated size of these disks:
```
>>> import os
>>> os.path.getsize('test.img')
0
```
Using the above example the disk overcommit would be reported as 1.0M as
the disk appears empty yet will report a potential (virtual) size of 1.0M.
However as the required blocks have already been allocated on the
filesystem the host will report disk_available_least as missing an
additional 1.0M, essentially doubling the allocation for each disk.
To correct this the allocated size of file based (excluding ploop) disks
is reported using `disk_size` from the `qemu-img info` command. This
should ensure blocks allocated past the EOF of the file are taken into
account and correctly reported as allocated.
A future change should ultimately remove the use of the `-n` option with
fallocate, however as this would not help disks that have already been
allocated this has not been included in this change to simplify backports.
Change-Id: If642e51a4e186833349a8e30b04224a3687f5594
Closes-bug: #1764489
(cherry picked from commit 23bd8f62634707fc9896a38ff4dae606c89c6c4b)
Reviewed: https:/ /review. openstack. org/562074 /git.openstack. org/cgit/ openstack/ nova/commit/ ?id=2d50f6e7854 543849c4cb7641a e6b88fe04cb6f6
Committed: https:/
Submitter: Zuul
Branch: stable/queens
commit 2d50f6e78545438 49c4cb7641ae6b8 8fe04cb6f6
Author: Lee Yarwood <email address hidden>
Date: Mon Apr 16 18:08:56 2018 +0100
libvirt: Report the allocated size of preallocated file based disks
At present the Libvirt driver can preallocate file based disks using the
fallocate command and importantly the `-n` option. This option allocates
blocks on the filesystem past the initial EOF of a given file:
```
$ touch test.img ; fallocate -n -l $(( 1024 * 1024 )) test.img
$ ll -lah test.img
-rw-rw-r--. 1 stack stack 0 Apr 16 13:28 test.img
$ du -h test.img
1.0M test.img
```
This results in a miscalculation of the total disk overcommit for file
based (excluding ploop) disks as os.path.getsize is currently used to
determine the allocated size of these disks:
``` getsize( 'test.img' )
>>> import os
>>> os.path.
0
```
Using the above example the disk overcommit would be reported as 1.0M as
the disk appears empty yet will report a potential (virtual) size of 1.0M.
However as the required blocks have already been allocated on the least as missing an
filesystem the host will report disk_available_
additional 1.0M, essentially doubling the allocation for each disk.
To correct this the allocated size of file based (excluding ploop) disks
is reported using `disk_size` from the `qemu-img info` command. This
should ensure blocks allocated past the EOF of the file are taken into
account and correctly reported as allocated.
A future change should ultimately remove the use of the `-n` option with
fallocate, however as this would not help disks that have already been
allocated this has not been included in this change to simplify backports.
Change-Id: If642e51a4e1868 33349a8e30b0422 4a3687f5594 c9896a38ff4dae6 06c89c6c4b)
Closes-bug: #1764489
(cherry picked from commit 23bd8f62634707f