ptest-runner: Add several logging fixes

This change adds three patches to improve the handling of stdout/stderr and child
processes to try and improve logging reliability in ptest-runner.

(From OE-Core rev: 1c0fffc401cdb581a93d16d225f53c83359ff209)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2019-04-04 14:27:09 +01:00
parent 57933bd958
commit 65b37734c7
4 changed files with 161 additions and 1 deletions

View File

@@ -0,0 +1,45 @@
From 9b36993794c1de733c521b2477370c874c07b617 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:18:55 +0100
Subject: [PATCH 1/3] utils: Ensure stdout/stderr are flushed
There is no guarantee that the data written with fwrite will be flushed to the
buffer. If stdout and stderr are the same thing, this could lead to interleaved
writes. The common case is stdout output so flush the output pipes when writing to
stderr. Also flush stdout before the function returns.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/utils.c b/utils.c
index 504df0b..3ceb342 100644
--- a/utils.c
+++ b/utils.c
@@ -295,8 +295,11 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
}
if (pfds[1].revents != 0) {
- while ((n = read(fds[1], buf, WAIT_CHILD_BUF_MAX_SIZE)) > 0)
+ while ((n = read(fds[1], buf, WAIT_CHILD_BUF_MAX_SIZE)) > 0) {
+ fflush(fps[0]);
fwrite(buf, n, 1, fps[1]);
+ fflush(fps[1]);
+ }
}
clock_gettime(clock, &sentinel);
@@ -315,7 +318,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
break;
}
-
+ fflush(fps[0]);
return status;
}
--
2.17.1

View File

@@ -0,0 +1,35 @@
From f0c42a65633341ad048718c7a6dbd035818e9eaf Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:20:31 +0100
Subject: [PATCH 2/3] use process groups when spawning
Rather than just killing the process we've swawned, set the process group
for spawned children and then kill the group of processes.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/utils.c b/utils.c
index 3ceb342..c5b3b8d 100644
--- a/utils.c
+++ b/utils.c
@@ -309,7 +309,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
clock_gettime(clock, &time);
if ((time.tv_sec - sentinel.tv_sec) > timeout) {
*timeouted = 1;
- kill(pid, SIGKILL);
+ kill(-pid, SIGKILL);
waitflags = 0;
}
}
@@ -371,6 +371,7 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
rc = -1;
break;
} else if (child == 0) {
+ setsid();
run_child(p->run_ptest, pipefd_stdout[1], pipefd_stderr[1]);
} else {
int status;

View File

@@ -0,0 +1,76 @@
From e58e4e1a7f854953f823dc5135d35f728f253f31 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:24:14 +0100
Subject: [PATCH 3/3] utils: Ensure pipes are read after exit
There was a race in the code where the pipes may not be read after the process has exited
and data may be left behind in them. This change to ordering ensures the pipes are read
after the exit code has been read meaning no data can be left behind and the logs should
be complete.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 29 ++++++++++++++++-------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/utils.c b/utils.c
index c5b3b8d..37e88ab 100644
--- a/utils.c
+++ b/utils.c
@@ -264,6 +264,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
struct pollfd pfds[2];
struct timespec sentinel;
clockid_t clock = CLOCK_MONOTONIC;
+ int looping = 1;
int r;
int status;
@@ -281,9 +282,23 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
*timeouted = 0;
- while (1) {
+ while (looping) {
waitflags = WNOHANG;
+ if (timeout >= 0) {
+ struct timespec time;
+
+ clock_gettime(clock, &time);
+ if ((time.tv_sec - sentinel.tv_sec) > timeout) {
+ *timeouted = 1;
+ kill(-pid, SIGKILL);
+ waitflags = 0;
+ }
+ }
+
+ if (waitpid(pid, &status, waitflags) == pid)
+ looping = 0;
+
r = poll(pfds, 2, WAIT_CHILD_POLL_TIMEOUT_MS);
if (r > 0) {
char buf[WAIT_CHILD_BUF_MAX_SIZE];
@@ -303,19 +318,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
}
clock_gettime(clock, &sentinel);
- } else if (timeout >= 0) {
- struct timespec time;
-
- clock_gettime(clock, &time);
- if ((time.tv_sec - sentinel.tv_sec) > timeout) {
- *timeouted = 1;
- kill(-pid, SIGKILL);
- waitflags = 0;
- }
}
-
- if (waitpid(pid, &status, waitflags) == pid)
- break;
}
fflush(fps[0]);
--
2.17.1

View File

@@ -10,7 +10,11 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=751419260aa954499f7abaabaa882bbe"
SRCREV = "05b112bda7ac2adba8e9b0f088d6e5843b148a38"
PV = "2.3.1+git${SRCPV}"
SRC_URI = "git://git.yoctoproject.org/ptest-runner2"
SRC_URI = "git://git.yoctoproject.org/ptest-runner2 \
file://0001-utils-Ensure-stdout-stderr-are-flushed.patch \
file://0002-use-process-groups-when-spawning.patch \
file://0003-utils-Ensure-pipes-are-read-after-exit.patch"
S = "${WORKDIR}/git"
FILES_${PN} = "${bindir}/ptest-runner"