From 7174e36c3d36210712f18901190d888106bca64b Mon Sep 17 00:00:00 2001 From: Thomas F Herbert Date: Fri, 17 Nov 2017 14:41:48 -0500 Subject: [PATCH] More reliable connection with nested qemu image. Under some circumstances on a busy server, the qga channel between the host and hte virtual guest has some garbage characters that cause the communications to fail. This has been seen on Centos 7.4 on a slow or busy server. This change sends a flush to qemu guest via the qga socket at 5 second intervals until there is a non empty response from guest before sending a guest ping. Change-Id: I6f21c205b289169aee9d6a4072ad4e6bafafa76f Signed-off-by: Thomas F Herbert --- resources/libraries/python/QemuUtils.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py index cbdfe856f0..6689e5cf96 100644 --- a/resources/libraries/python/QemuUtils.py +++ b/resources/libraries/python/QemuUtils.py @@ -300,7 +300,8 @@ class QemuUtils(object): def _wait_until_vm_boot(self, timeout=60): """Wait until QEMU VM is booted. - Ping QEMU guest agent each 5s until VM booted or timeout. + First try to flush qga until there is output. + Then ping QEMU guest agent each 5s until VM booted or timeout. :param timeout: Waiting timeout in seconds (optional, default 60s). :type timeout: int @@ -312,7 +313,20 @@ class QemuUtils(object): self._qemu_opt['disk_image'], self._node['host'])) out = None try: - self._qemu_qga_flush() + out = self._qemu_qga_flush() + except ValueError: + logger.trace('QGA qga flush unexpected output {}'.format(out)) + # Empty output - VM not booted yet + if not out: + sleep(5) + else: + break + while True: + if time() - start > timeout: + raise RuntimeError('timeout, VM {0} not booted on {1}'.format( + self._qemu_opt['disk_image'], self._node['host'])) + out = None + try: out = self._qemu_qga_exec('guest-ping') except ValueError: logger.trace('QGA guest-ping unexpected output {}'.format(out)) -- 2.16.6