diff --git a/nova/tests/unit/virt/test_images.py b/nova/tests/unit/virt/test_images.py index 3e43224a50fa..c6864f295df9 100644 --- a/nova/tests/unit/virt/test_images.py +++ b/nova/tests/unit/virt/test_images.py @@ -16,6 +16,7 @@ import os import mock from oslo_concurrency import processutils +import six from nova import exception from nova import test @@ -54,6 +55,16 @@ class QemuTestCase(test.NoDBTestCase): 'qcow2', 'raw') + @mock.patch.object(utils, 'execute') + @mock.patch.object(os.path, 'exists', return_value=True) + def test_convert_image_with_prlimit_fail(self, path, mocked_execute): + mocked_execute.side_effect = \ + processutils.ProcessExecutionError(exit_code=-9) + exc = self.assertRaises(exception.InvalidDiskInfo, + images.qemu_img_info, + '/fake/path') + self.assertIn('qemu-img aborted by prlimits', six.text_type(exc)) + @mock.patch.object(images, 'convert_image', side_effect=exception.ImageUnacceptable) @mock.patch.object(images, 'qemu_img_info') diff --git a/nova/virt/images.py b/nova/virt/images.py index 3a4fb93df945..1c837a68af41 100644 --- a/nova/virt/images.py +++ b/nova/virt/images.py @@ -39,7 +39,7 @@ CONF = nova.conf.CONF IMAGE_API = image.API() QEMU_IMG_LIMITS = processutils.ProcessLimits( - cpu_time=2, + cpu_time=8, address_space=1 * units.Gi) @@ -62,8 +62,13 @@ def qemu_img_info(path, format=None): cmd = cmd + ('-f', format) out, err = utils.execute(*cmd, prlimit=QEMU_IMG_LIMITS) except processutils.ProcessExecutionError as exp: - msg = (_("qemu-img failed to execute on %(path)s : %(exp)s") % - {'path': path, 'exp': exp}) + # this means we hit prlimits, make the exception more specific + if exp.exit_code == -9: + msg = (_("qemu-img aborted by prlimits when inspecting " + "%(path)s : %(exp)s") % {'path': path, 'exp': exp}) + else: + msg = (_("qemu-img failed to execute on %(path)s : %(exp)s") % + {'path': path, 'exp': exp}) raise exception.InvalidDiskInfo(reason=msg) if not out: