[lttng-dev] [PATCH lttng-tools] Fix: tests: use SIGSTOP for crash extraction test

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Mar 10 16:13:37 UTC 2016


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



More information about the lttng-dev mailing list