[lttng-dev] [PATCH lttng-tools] Fix: tests: use SIGSTOP for crash extraction test
Jérémie Galarneau
jeremie.galarneau at efficios.com
Thu Mar 10 22:42:29 UTC 2016
Merged in master and stable-2.7, thanks!
Jérémie
On Thu, Mar 10, 2016 at 11:13 AM, Mathieu Desnoyers
<mathieu.desnoyers at efficios.com> wrote:
> 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 <mathieu.desnoyers at efficios.com>
> CC: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> CC: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
> 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 be61cda..5b9a27c 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 3964e3b..2cadd58 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.1.4
>
--
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list