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 4ae48d0b21)
This commit is contained in:
Lucas Alvares Gomes 2017-01-19 16:22:30 +00:00 committed by Jim Rollenhagen
parent cd650ce748
commit ff4f92b338
2 changed files with 10 additions and 4 deletions

View File

@ -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):

View File

@ -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')