From ff4f92b3388d88a596ccaa45785376e507f03cd4 Mon Sep 17 00:00:00 2001 From: Lucas Alvares Gomes Date: Thu, 19 Jan 2017 16:22:30 +0000 Subject: [PATCH] Limit memory usage when running qemu-img With multiple qemu-img processes running at the same time the host machine can quickly run out of memory. This patch is limiting the memory space to 1 GiB when invoking qemu-img. Change-Id: If791452edc38c4732ba2b96220e7969c72b234dd Closes-Bug: #1657808 (cherry picked from commit 4ae48d0b212c16c8b49d4f1144c073b3a3206597) --- ironic_lib/disk_utils.py | 8 ++++++-- ironic_lib/tests/test_disk_utils.py | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ironic_lib/disk_utils.py b/ironic_lib/disk_utils.py index 3be65266..cb9e0d0b 100644 --- a/ironic_lib/disk_utils.py +++ b/ironic_lib/disk_utils.py @@ -66,6 +66,9 @@ LOG = logging.getLogger(__name__) _PARTED_PRINT_RE = re.compile(r"^(\d+):([\d\.]+)MiB:" "([\d\.]+)MiB:([\d\.]+)MiB:(\w*)::(\w*)") +# Limit the memory address space to 1 GiB when running qemu-img +QEMU_IMG_LIMITS = processutils.ProcessLimits(address_space=1 * units.Gi) + def list_partitions(device): """Get partitions information from given device. @@ -249,14 +252,15 @@ def qemu_img_info(path): return imageutils.QemuImgInfo() out, err = utils.execute('env', 'LC_ALL=C', 'LANG=C', - 'qemu-img', 'info', path) + 'qemu-img', 'info', path, + prlimit=QEMU_IMG_LIMITS) return imageutils.QemuImgInfo(out) def convert_image(source, dest, out_format, run_as_root=False): """Convert image to other format.""" cmd = ('qemu-img', 'convert', '-O', out_format, source, dest) - utils.execute(*cmd, run_as_root=run_as_root) + utils.execute(*cmd, run_as_root=run_as_root, prlimit=QEMU_IMG_LIMITS) def populate_image(src, dst): diff --git a/ironic_lib/tests/test_disk_utils.py b/ironic_lib/tests/test_disk_utils.py index 78b0d96e..d33abd26 100644 --- a/ironic_lib/tests/test_disk_utils.py +++ b/ironic_lib/tests/test_disk_utils.py @@ -601,7 +601,8 @@ class OtherFunctionTestCase(test_base.BaseTestCase): disk_utils.qemu_img_info('img') path_exists_mock.assert_called_once_with('img') execute_mock.assert_called_once_with('env', 'LC_ALL=C', 'LANG=C', - 'qemu-img', 'info', 'img') + 'qemu-img', 'info', 'img', + prlimit=mock.ANY) qemu_img_info_mock.assert_called_once_with('out') @mock.patch.object(utils, 'execute', autospec=True) @@ -609,7 +610,8 @@ class OtherFunctionTestCase(test_base.BaseTestCase): disk_utils.convert_image('source', 'dest', 'out_format') execute_mock.assert_called_once_with('qemu-img', 'convert', '-O', 'out_format', 'source', 'dest', - run_as_root=False) + run_as_root=False, + prlimit=mock.ANY) @mock.patch.object(os.path, 'getsize') @mock.patch.object(disk_utils, 'qemu_img_info')