Comment 9 for bug 1764489

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to nova (stable/ocata)

Reviewed: https://review.openstack.org/562078
Committed: https://git.openstack.org/cgit/openstack/nova/commit/?id=caca71376fbc2c1195cda71608c8d2a70ef9a678
Submitter: Zuul
Branch: stable/ocata

commit caca71376fbc2c1195cda71608c8d2a70ef9a678
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:

    ```
    >>> 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.

    Conflicts:
            nova/tests/unit/virt/libvirt/test_driver.py

    NOTE(lyarwood): I11e329ac5f5fe4b9819fefbcc32ff1ee504fc58b made
    get_domain private in Queens.

    Change-Id: If642e51a4e186833349a8e30b04224a3687f5594
    Closes-bug: #1764489
    (cherry picked from commit 23bd8f62634707fc9896a38ff4dae606c89c6c4b)
    (cherry picked from commit 2d50f6e7854543849c4cb7641ae6b88fe04cb6f6)
    (cherry picked from commit d88b75e81eabfbd463007f6a4f27e6966a466530)