summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChen Qi <Qi.Chen@windriver.com>2019-07-12 15:31:13 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-07-15 09:29:59 +0100
commit7a6b2ce603a44db60a3ba7a4a62ec3c04c1db656 (patch)
tree7d8930e0ceb8c50245f996fbcce2c1aa5c913fe8
parent41bac92fdbf893370dc830b6f810118eed25e05d (diff)
downloadpoky-7a6b2ce603a44db60a3ba7a4a62ec3c04c1db656.tar.gz
qemurunner.py: fix race condition at qemu startup
When handling pid file, qemu would first create the file, stat it, lock it and then write actually contents to it. So it's possbile that when reading the pid file, the content is empty. [YOCTO #13390] (From OE-Core rev: 170e59b203a02f8438b9aeab3a45f6fcd6608b1f) Signed-off-by: Chen Qi <Qi.Chen@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/lib/oeqa/utils/qemurunner.py21
1 files changed, 14 insertions, 7 deletions
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index c16227fc38..68684aeb8a 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -425,13 +425,20 @@ class QemuRunner:
425 if not self.runqemu or self.runqemu.poll() is not None: 425 if not self.runqemu or self.runqemu.poll() is not None:
426 return False 426 return False
427 if os.path.isfile(self.qemu_pidfile): 427 if os.path.isfile(self.qemu_pidfile):
428 f = open(self.qemu_pidfile, 'r') 428 # when handling pidfile, qemu creates the file, stat it, lock it and then write to it
429 qemu_pid = f.read() 429 # so it's possible that the file has been created but the content is empty
430 f.close() 430 pidfile_timeout = time.time() + 3
431 qemupid = int(qemu_pid) 431 while time.time() < pidfile_timeout:
432 if os.path.exists("/proc/" + str(qemupid)): 432 with open(self.qemu_pidfile, 'r') as f:
433 self.qemupid = qemupid 433 qemu_pid = f.read().strip()
434 return True 434 # file created but not yet written contents
435 if not qemu_pid:
436 time.sleep(0.5)
437 continue
438 else:
439 if os.path.exists("/proc/" + qemu_pid):
440 self.qemupid = int(qemu_pid)
441 return True
435 return False 442 return False
436 443
437 def run_serial(self, command, raw=False, timeout=60): 444 def run_serial(self, command, raw=False, timeout=60):