[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