diff mbox series

[ptest-runner,4/4] Change test timeout to be total elapsed time

Message ID 20230717142831.1634172-5-JPEWhacker@gmail.com
State New
Headers show
Series Stop running ptests in parallel | expand

Commit Message

Joshua Watt July 17, 2023, 2:28 p.m. UTC
Changes the way that tests time out to be the total elapsed time for the
test, not just the time between receiving output from the test. This
matches the implementation before 8259375 ("runner: Remove threads and
mutexes").

Also update the timeout test case to test for this correctly.

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
 tests/data/hang/ptest/run-ptest |  1 +
 tests/utils.c                   |  2 +-
 utils.c                         | 23 ++++++++++++-----------
 3 files changed, 14 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/tests/data/hang/ptest/run-ptest b/tests/data/hang/ptest/run-ptest
index 738041d..9031be3 100755
--- a/tests/data/hang/ptest/run-ptest
+++ b/tests/data/hang/ptest/run-ptest
@@ -3,5 +3,6 @@ 
 echo "hang" 1>&2
 echo "hang"
 while true; do
+	echo "hang"
 	sleep 1
 done
diff --git a/tests/utils.c b/tests/utils.c
index d82b90e..849a412 100644
--- a/tests/utils.c
+++ b/tests/utils.c
@@ -224,7 +224,7 @@  search_for_timeout_and_duration(const int rp, FILE *fp_stdout)
 START_TEST(test_run_timeout_duration_ptest)
 {
 	struct ptest_list *head = get_available_ptests(opts_directory);
-	unsigned int timeout = 1;
+	unsigned int timeout = 3;
 
 	test_ptest_expected_failure(head, timeout, "hang", search_for_timeout_and_duration);
 
diff --git a/utils.c b/utils.c
index 34ca2f0..353d6dc 100644
--- a/utils.c
+++ b/utils.c
@@ -403,7 +403,8 @@  run_ptests(struct ptest_list *head, const struct ptest_options opts,
 	pid_t child;
 	int pipefd_stdout[2] = {-1, -1};
 	int pipefd_stderr[2] = {-1, -1};
-	time_t sttime, entime;
+	time_t sttime, entime, now;
+	time_t timeout_deadline;
 	time_t duration;
 	int slave;
 	int pgid = -1;
@@ -489,6 +490,7 @@  run_ptests(struct ptest_list *head, const struct ptest_options opts,
 				}
 
 				sttime = time(NULL);
+				timeout_deadline = sttime + opts.timeout;
 				fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE, sttime));
 				fprintf(fp, "BEGIN: %s\n", ptest_dir);
 
@@ -519,18 +521,17 @@  run_ptests(struct ptest_list *head, const struct ptest_options opts,
 					if (done) {
 						break;
 					}
-
-					int ret = poll(pfds, 2, _child_reader.timeout*1000);
-
-					if (ret == 0 && !_child_reader.timeouted) {
-						/* kill the child if we haven't
-						 * already. Note that we
-						 * continue to read data from
-						 * the pipes until EOF to make
-						 * sure we get all the output
-						 */
+					now = time(NULL);
+					if (now >= timeout_deadline) {
 						kill(-child, SIGKILL);
 						_child_reader.timeouted = 1;
+						break;
+					}
+
+					int ret = poll(pfds, 2, (timeout_deadline - now) * 1000);
+
+					if (ret == 0) {
+						continue;
 					}
 
 					for (int i = 0; i < 2; i++) {