mirror of
https://git.yoctoproject.org/poky
synced 2026-03-17 04:39:40 +01:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user