From: Wander Lairson Costa <wander@redhat.com>
To: Clark Williams <williams@redhat.com>,
John Kacur <jkacur@redhat.com>,
linux-rt-users@vger.kernel.org
Cc: Juri Lelli <juri.lelli@redhat.com>,
luffyluo@tencent.com, davidlt@rivosinc.com,
Wander Lairson Costa <wander@redhat.com>
Subject: [[PATCH stalld] 25/33] tests: Extract wait_for_process_exit helper
Date: Wed, 20 May 2026 11:00:52 -0300 [thread overview]
Message-ID: <20260520140104.112142-26-wander@redhat.com> (raw)
In-Reply-To: <20260520140104.112142-1-wander@redhat.com>
The SIGTERM-poll-SIGKILL-poll termination sequence is currently
duplicated in both stop_stalld() and cleanup() with identical inline
polling loops. This refactors the teardown sequence by extracting the
polling logic into a new wait_for_process_exit() helper.
The new helper polls process_alive() at 0.1 second intervals, returning
0 on successful exit or 1 upon timeout. Utilizing this helper
eliminates the duplicated logic, removes a redundant sleep in cleanup(),
and accelerates test teardown by checking process state more frequently
than the previous one second intervals, all while maintaining the
existing five second total timeout. Furthermore, stop_stalld() is
simplified with an early return guard to reduce nesting. The helper is
explicitly exported to ensure availability across the test environment.
Signed-off-by: Wander Lairson Costa <wander@redhat.com>
---
tests/helpers/test_helpers.sh | 85 +++++++++++++++++------------------
1 file changed, 42 insertions(+), 43 deletions(-)
diff --git a/tests/helpers/test_helpers.sh b/tests/helpers/test_helpers.sh
index 7159c19..5187f0f 100755
--- a/tests/helpers/test_helpers.sh
+++ b/tests/helpers/test_helpers.sh
@@ -360,6 +360,28 @@ process_alive() {
kill -0 "$1" 2>/dev/null
}
+# Poll for a process to exit within a timeout.
+# Returns 0 if the process exits, 1 if still alive after timeout.
+#
+# Usage: wait_for_process_exit <pid> <timeout_seconds>
+wait_for_process_exit() {
+ local pid="$1"
+ local timeout="$2"
+ local elapsed=0
+
+ while process_alive "${pid}" && [ ${elapsed} -lt ${timeout} ]; do
+ for i in $(seq 1 10); do
+ sleep 0.1
+ if ! process_alive "${pid}"; then
+ return 0
+ fi
+ done
+ elapsed=$((elapsed + 1))
+ done
+
+ ! process_alive "${pid}"
+}
+
send_signal() {
kill -"$1" "$2" 2>/dev/null || true
}
@@ -537,32 +559,23 @@ start_stalld() {
# SIGKILL if needed. Guarantees the process is dead before
# returning so callers do not need post-stop sleeps.
stop_stalld() {
- if [ -n "${STALLD_PID}" ]; then
- if process_alive ${STALLD_PID}; then
- # Try graceful shutdown first (SIGTERM)
- send_signal TERM ${STALLD_PID}
-
- # Poll for graceful exit (up to 5 seconds)
- local timeout=5
- local elapsed=0
- while process_alive ${STALLD_PID} && [ ${elapsed} -lt ${timeout} ]; do
- sleep 1
- elapsed=$((elapsed + 1))
- done
+ if [ -z "${STALLD_PID}" ]; then
+ return
+ fi
+
+ if process_alive ${STALLD_PID}; then
+ # Try graceful shutdown first (SIGTERM)
+ send_signal TERM ${STALLD_PID}
+ # Poll for graceful exit (up to 5 seconds)
+ if ! wait_for_process_exit ${STALLD_PID} 5; then
# Escalate to SIGKILL if still running
- if process_alive ${STALLD_PID}; then
- send_signal KILL ${STALLD_PID}
- # Poll for forced termination (up to 5 seconds)
- elapsed=0
- while process_alive ${STALLD_PID} && [ ${elapsed} -lt ${timeout} ]; do
- sleep 1
- elapsed=$((elapsed + 1))
- done
- fi
+ send_signal KILL ${STALLD_PID}
+ # Poll for forced termination (up to 5 seconds)
+ wait_for_process_exit ${STALLD_PID} 5
fi
- STALLD_PID=""
fi
+ STALLD_PID=""
}
# Kill any existing stalld processes (cleanup from previous runs)
@@ -607,31 +620,17 @@ cleanup() {
# Stop stalld
stop_stalld
- # Small delay to let processes terminate
- sleep 0.2
-
# Kill any tracked processes
# Use SIGKILL (-9) and ignore EPERM errors (process may have different privileges)
for pid in "${CLEANUP_PIDS[@]}"; do
if [ -n "${pid}" ] && [ "${pid}" -gt 0 ] 2>/dev/null; then
# Check if process exists
- if process_alive ${pid}; then
- send_signal TERM ${pid}
-
- local timeout=5
- local elapsed=0
- while process_alive ${pid} && [ ${elapsed} -lt ${timeout} ]; do
- sleep 1
- elapsed=$((elapsed + 1))
- done
-
- if process_alive ${pid}; then
- send_signal KILL ${pid}
- elapsed=0
- while process_alive ${pid} && [ ${elapsed} -lt ${timeout} ]; do
- sleep 1
- elapsed=$((elapsed + 1))
- done
+ if process_alive "${pid}"; then
+ send_signal TERM "${pid}"
+
+ if ! wait_for_process_exit "${pid}" 5; then
+ send_signal KILL "${pid}"
+ wait_for_process_exit "${pid}" 5
fi
fi
fi
@@ -1323,7 +1322,7 @@ export -f start_test end_test test_section cleanup_scenario find_starved_child
export -f assert_starvation_detected assert_boost_detected assert_stalld_rejects assert_log_contains assert_success
export -f pass fail assert_equals assert_contains assert_not_contains
export -f assert_file_exists assert_file_not_exists
-export -f process_alive send_signal assert_process_running assert_process_not_running
+export -f process_alive wait_for_process_exit send_signal assert_process_running assert_process_not_running
export -f start_stalld stop_stalld kill_existing_stalld cleanup
export -f wait_for_log_message wait_for_stalld_ready wait_for_starvation_detected wait_for_boost_detected wait_for_n_log_matches
export -f get_thread_policy get_thread_priority
--
2.54.0
next prev parent reply other threads:[~2026-05-20 14:02 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-20 14:00 [[PATCH stalld] 00/33] Test suite hardening, correctness fixes, and BPF optimization Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 01/33] stalld: Reject --force_fifo in single-threaded mode Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 02/33] tests: Introduce test_section() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 03/33] tests: Introduce cleanup_scenario() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 04/33] tests: Introduce starvation and boost asserts Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 05/33] tests: Introduce find_starved_child() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 06/33] tests: Fix task exit timing in test_boost_restoration Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 07/33] tests: Consolidate and adopt init_functional_test() Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 08/33] tests: Introduce assert_stalld_rejects() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 09/33] tests: Fix boost verification in runtime and duration tests Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 10/33] tests: Fix subshell swallowing test results Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 11/33] tests: Fix repeated log match finding same line Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 12/33] chore: Remove legacy test infrastructure and stale docs Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 13/33] tests: Add assertions to SCHED_OTHER restoration test Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 14/33] tests: Fix CPU selection grep substring matches Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 15/33] tests: Add idle CPU skipping assertion Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 16/33] tests: Remove redundant pkill from cleanup Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 17/33] tests: Introduce and adopt assert_log_contains() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 18/33] tests: Remove weak, redundant, and assertion-free test blocks Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 19/33] tests: Introduce and adopt assert_success() helper Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 20/33] tests: Replace wait conditionals with asserts Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 21/33] tests: Remove if-wrappers around assert calls Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 22/33] tests: Abort immediately on test failure Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 23/33] tests: Remove dead code after making fail() fatal Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 24/33] tests: Introduce and adopt process helpers Wander Lairson Costa
2026-05-20 14:00 ` Wander Lairson Costa [this message]
2026-05-20 14:00 ` [[PATCH stalld] 26/33] tests: Reduce default wait timeouts Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 27/33] tests: Reduce starvation_gen durations Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 28/33] tests: Replace init sleeps in test_affinity Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 29/33] tests: Drop redundant sleeps in test_pidfile Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 30/33] tests: Remove redundant sleeps after start_stalld Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 31/33] tests: Reduce timing and replace sleeps with event waits Wander Lairson Costa
2026-05-20 14:00 ` [[PATCH stalld] 32/33] tests: Fix async-signal-unsafe handler Wander Lairson Costa
2026-05-20 14:01 ` [[PATCH stalld] 33/33] bpf: Replace linear task scan with hash map Wander Lairson Costa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260520140104.112142-26-wander@redhat.com \
--to=wander@redhat.com \
--cc=davidlt@rivosinc.com \
--cc=jkacur@redhat.com \
--cc=juri.lelli@redhat.com \
--cc=linux-rt-users@vger.kernel.org \
--cc=luffyluo@tencent.com \
--cc=williams@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.