summaryrefslogtreecommitdiffstats
path: root/meta/lib
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 /meta/lib
parent41bac92fdbf893370dc830b6f810118eed25e05d (diff)
downloadopenembedded-core-contrib-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>
Diffstat (limited to 'meta/lib')
-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:
if not self.runqemu or self.runqemu.poll() is not None:
return False
if os.path.isfile(self.qemu_pidfile):
- f = open(self.qemu_pidfile, 'r')
- qemu_pid = f.read()
- f.close()
- qemupid = int(qemu_pid)
- if os.path.exists("/proc/" + str(qemupid)):
- self.qemupid = qemupid
- return True
+ # when handling pidfile, qemu creates the file, stat it, lock it and then write to it
+ # so it's possible that the file has been created but the content is empty
+ pidfile_timeout = time.time() + 3
+ while time.time() < pidfile_timeout:
+ with open(self.qemu_pidfile, 'r') as f:
+ qemu_pid = f.read().strip()
+ # file created but not yet written contents
+ if not qemu_pid:
+ time.sleep(0.5)
+ continue
+ else:
+ if os.path.exists("/proc/" + qemu_pid):
+ self.qemupid = int(qemu_pid)
+ return True
return False
def run_serial(self, command, raw=False, timeout=60):