From 8490897a08bcb2e38d78ccae01fe00e50f2f8bd8 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 10 Mar 2016 11:13:37 -0500 Subject: [PATCH] Fix: tests: use SIGSTOP for crash extraction test MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Ensure that SIGKILL being received only by some consumer processes don't trigger clean shutdown of other consumer processes (due to hang up of communication FD by the session daemon). Fix this by invoking a SIGSTOP on both sessiond and consumerd, and wait until we see those process state change to "stopped" before proceeding to send the SIGKILL. Signed-off-by: Mathieu Desnoyers CC: Jonathan Rajotte CC: Jérémie Galarneau Signed-off-by: Jérémie Galarneau --- tests/regression/tools/crash/test_crash | 5 +- tests/utils/utils.sh | 117 +++++++++++++++++++++++- 2 files changed, 119 insertions(+), 3 deletions(-) diff --git a/tests/regression/tools/crash/test_crash b/tests/regression/tools/crash/test_crash index be61cda2f..5b9a27c58 100755 --- a/tests/regression/tools/crash/test_crash +++ b/tests/regression/tools/crash/test_crash @@ -31,7 +31,7 @@ NR_ITER=-1 # Temp file output OUTPUT_DIR=$(mktemp -d) -NUM_TESTS=71 +NUM_TESTS=73 source $TESTDIR/utils/utils.sh @@ -360,6 +360,9 @@ function test_lttng_crash_extraction_sigkill() # Generate 10 events $TESTAPP_BIN 10 0 + sigstop_lttng_sessiond + sigstop_lttng_consumerd + # Kill the consumers then sessiond with sigkill stop_lttng_consumerd SIGKILL stop_lttng_sessiond SIGKILL diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index 3964e3b12..2cadd5800 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -416,7 +416,9 @@ function stop_lttng_sessiond_opt() if [ -n "$2" ]; then kill_opt="$kill_opt -s $signal" fi - + if [ $withtap -eq "1" ]; then + diag "Killing lt-$SESSIOND_BIN pids: $(echo $PID_SESSIOND | tr '\n' ' ')" + fi kill $kill_opt $PID_SESSIOND 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST if [ $? -eq 1 ]; then @@ -450,6 +452,62 @@ function stop_lttng_sessiond_notap() stop_lttng_sessiond_opt 0 "$@" } +function sigstop_lttng_sessiond_opt() +{ + local withtap=$1 + local signal=SIGSTOP + local kill_opt="" + + if [ -n $TEST_NO_SESSIOND ] && [ "$TEST_NO_SESSIOND" == "1" ]; then + # Env variable requested no session daemon + return + fi + + PID_SESSIOND=`pgrep --full lt-$SESSIOND_BIN` + + kill_opt="$kill_opt -s $signal" + + if [ $withtap -eq "1" ]; then + diag "Sending SIGSTOP to lt-$SESSIOND_BIN pids: $(echo $PID_SESSIOND | tr '\n' ' ')" + fi + kill $kill_opt $PID_SESSIOND 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + + if [ $? -eq 1 ]; then + if [ $withtap -eq "1" ]; then + fail "Sending SIGSTOP to session daemon" + fi + else + out=1 + while [ $out -ne 0 ]; do + pid=$(pgrep --full lt-$SESSIOND_BIN) + + # Wait until state becomes stopped for session + # daemon(s). + out=0 + for sessiond_pid in $pid; do + state=$(ps -p $sessiond_pid -o state= ) + if [[ -n "$state" && "$state" != "T" ]]; then + out=1 + fi + done + sleep 0.5 + done + if [ $withtap -eq "1" ]; then + pass "Sending SIGSTOP to session daemon" + fi + fi +} + +function sigstop_lttng_sessiond() +{ + sigstop_lttng_sessiond_opt 1 "$@" +} + +function sigstop_lttng_sessiond_notap() +{ + sigstop_lttng_sessiond_opt 0 "$@" +} + function stop_lttng_consumerd_opt() { local withtap=$1 @@ -463,7 +521,7 @@ function stop_lttng_consumerd_opt() fi if [ $withtap -eq "1" ]; then - diag "Killing lttng-consumerd (pid: $PID_CONSUMERD)" + diag "Killing $CONSUMERD_BIN pids: $(echo $PID_CONSUMERD | tr '\n' ' ')" fi kill $kill_opt $PID_CONSUMERD 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST retval=$? @@ -507,6 +565,61 @@ function stop_lttng_consumerd_notap() stop_lttng_consumerd_opt 0 "$@" } +function sigstop_lttng_consumerd_opt() +{ + local withtap=$1 + local signal=SIGSTOP + local kill_opt="" + + PID_CONSUMERD=`pgrep --full $CONSUMERD_BIN` + + kill_opt="$kill_opt -s $signal" + + if [ $withtap -eq "1" ]; then + diag "Sending SIGSTOP to $CONSUMERD_BIN pids: $(echo $PID_CONSUMERD | tr '\n' ' ')" + fi + kill $kill_opt $PID_CONSUMERD 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST + retval=$? + set +x + + if [ $? -eq 1 ]; then + if [ $withtap -eq "1" ]; then + fail "Sending SIGSTOP to consumer daemon" + fi + return 1 + else + out=1 + while [ $out -ne 0 ]; do + pid=$(pgrep --full $CONSUMERD_BIN) + + # Wait until state becomes stopped for all + # consumers. + out=0 + for consumer_pid in $pid; do + state=$(ps -p $consumer_pid -o state= ) + if [[ -n "$state" && "$state" != "T" ]]; then + out=1 + fi + done + sleep 0.5 + done + if [ $withtap -eq "1" ]; then + pass "Sending SIGSTOP to consumer daemon" + fi + fi + return $retval +} + +function sigstop_lttng_consumerd() +{ + sigstop_lttng_consumerd_opt 1 "$@" +} + +function sigstop_lttng_consumerd_notap() +{ + sigstop_lttng_consumerd_opt 0 "$@" +} + function list_lttng_with_opts () { local opts=$1 -- 2.34.1