[gnome-continuous-yocto/gnomeostree-3.28-rocko: 5314/8267] qemurunner: configurable timeout for run_serial()
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-continuous-yocto/gnomeostree-3.28-rocko: 5314/8267] qemurunner: configurable timeout for run_serial()
- Date: Sun, 17 Dec 2017 03:15:57 +0000 (UTC)
commit 58e6e7c2043d7f4b48ec3b4b9daf25f5766fa5d2
Author: Patrick Ohly <patrick ohly intel com>
Date: Fri Mar 24 22:46:16 2017 +0100
qemurunner: configurable timeout for run_serial()
Some commands might need to run longer than the default timeout of
five seconds. If that occurred, run_serial() returned with a status
code of zero (sic!) and no other indication of what went wrong.
Now the timeout is configurable (with five still the default) and
an explicit warning ("<<< run_serial(): command timed out after 5 seconds without output >>>")
gets appended at the end of the data returned to the caller.
While at it, the logic for checking for the timeout was updated a bit
because both implementations could overshoot the timeout when entering
select() right before the final deadline.
(From OE-Core rev: accf0362f964cc9d6330b6e52e83d748d890521f)
Signed-off-by: Patrick Ohly <patrick ohly intel com>
Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>
meta/lib/oeqa/targetcontrol.py | 4 ++--
meta/lib/oeqa/utils/qemurunner.py | 17 ++++++++++-------
meta/lib/oeqa/utils/qemutinyrunner.py | 8 +++++---
3 files changed, 17 insertions(+), 12 deletions(-)
---
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py
index 0ad3a6b..2f071e0 100644
--- a/meta/lib/oeqa/targetcontrol.py
+++ b/meta/lib/oeqa/targetcontrol.py
@@ -206,8 +206,8 @@ class QemuTarget(BaseTarget):
else:
raise bb.build.FuncFailed("%s - FAILED to re-start qemu - check the task log and the boot log" %
self.pn)
- def run_serial(self, command):
- return self.runner.run_serial(command)
+ def run_serial(self, command, timeout=5):
+ return self.runner.run_serial(command, timeout=timeout)
class SimpleRemoteTarget(BaseTarget):
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index 9ef7629..c0abb96 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -416,7 +416,7 @@ class QemuRunner:
if "qemu-system" in basecmd and "-serial tcp" in commands[p]:
return [int(p),commands[p]]
- def run_serial(self, command, raw=False):
+ def run_serial(self, command, raw=False, timeout=5):
# We assume target system have echo to get command status
if not raw:
command = "%s; echo $?\n" % command
@@ -424,20 +424,23 @@ class QemuRunner:
data = ''
status = 0
self.server_socket.sendall(command.encode('utf-8'))
- keepreading = True
- while keepreading:
- sread, _, _ = select.select([self.server_socket],[],[],5)
+ start = time.time()
+ end = start + timeout
+ while True:
+ now = time.time()
+ if now >= end:
+ data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" %
timeout
+ break
+ sread, _, _ = select.select([self.server_socket],[],[], end - now)
if sread:
answer = self.server_socket.recv(1024)
if answer:
data += answer.decode('utf-8')
# Search the prompt to stop
if re.search("[a-zA-Z0-9]+@[a-zA-Z0-9\-]+:~#", data):
- keepreading = False
+ break
else:
raise Exception("No data on serial console socket")
- else:
- keepreading = False
if data:
if raw:
diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py b/meta/lib/oeqa/utils/qemutinyrunner.py
index ec52473..b1009a0 100644
--- a/meta/lib/oeqa/utils/qemutinyrunner.py
+++ b/meta/lib/oeqa/utils/qemutinyrunner.py
@@ -107,14 +107,14 @@ class QemuTinyRunner(QemuRunner):
return self.is_alive()
- def run_serial(self, command):
+ def run_serial(self, command, timeout=5):
self.server_socket.sendall(command+'\n')
data = ''
status = 0
stopread = False
- endtime = time.time()+5
+ endtime = time.time()+timeout
while time.time()<endtime and not stopread:
- sread, _, _ = select.select([self.server_socket],[],[],5)
+ sread, _, _ = select.select([self.server_socket],[],[],1)
for sock in sread:
answer = sock.recv(1024)
if answer:
@@ -124,6 +124,8 @@ class QemuTinyRunner(QemuRunner):
stopread = True
if not data:
status = 1
+ if not stopread:
+ data += "<<< run_serial(): command timed out after %d seconds without output >>>\r\n\r\n" %
timeout
return (status, str(data))
def find_child(self,parent_pid):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]