#!/bin/bash
#
-# Copyright (C) - 2017 Julien Desfossez <jdesfossez@efficios.com>
+# Copyright (C) 2017 Julien Desfossez <jdesfossez@efficios.com>
#
-# This library is free software; you can redistribute it and/or modify it under
-# the terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation; version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with this library; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# SPDX-License-Identifier: LGPL-2.1-only
+
TEST_DESC="Rotation - User space tracing"
CURDIR=$(dirname $0)/
SESSION_NAME="stream"
EVENT_NAME="tp:tptest"
-TRACE_PATH=$(mktemp -d)
+TRACE_PATH=$(mktemp --tmpdir -d -t tmp.test_ust_rotation_trace_path.XXXXXX)
-NUM_TESTS=142
+NUM_TESTS=138
source $TESTDIR/utils/utils.sh
source $CURDIR/rotate_utils.sh
BAIL_OUT "No UST events binary detected."
fi
+XPATH_CMD_OUTPUT="//lttng:command/lttng:output"
+XPATH_PID="$XPATH_CMD_OUTPUT/lttng:domains/lttng:domain[./lttng:type = 'UST']/lttng:pids/lttng:pid/lttng:id"
+
function enable_channel_per_pid ()
{
sess_name=$1
start_lttng_tracing_ok $SESSION_NAME
today=$(date +%Y%m%d)
- $TESTAPP_BIN 10 $NR_USEC_WAIT /dev/null 2>&1
+ $TESTAPP_BIN -i 10 -w $NR_USEC_WAIT > /dev/null 2>&1
rotate_session_ok $SESSION_NAME
- $TESTAPP_BIN 20 $NR_USEC_WAIT /dev/null 2>&1
+ $TESTAPP_BIN -i 20 -w $NR_USEC_WAIT > /dev/null 2>&1
stop_lttng_tracing_ok $SESSION_NAME
# Third chunk contains no event (rotate after stop).
create_lttng_session_uri $SESSION_NAME net://localhost
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
- rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" "ust/uid/*/*/" 0
+ rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/uid/*/*/" 0
}
function test_ust_local_uid ()
create_lttng_session_ok $SESSION_NAME $TRACE_PATH
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
- rotate_ust_test "${TRACE_PATH}" "ust/uid/*/*/" 0
+ rotate_ust_test "${TRACE_PATH}/archives" "ust/uid/*/*/" 0
}
function test_ust_streaming_pid ()
enable_channel_per_pid $SESSION_NAME "channel0"
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
- rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" "ust/pid/*/" 1
+ rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/pid/*/" 1
}
function test_ust_local_pid ()
enable_channel_per_pid $SESSION_NAME "channel0"
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
- rotate_ust_test "${TRACE_PATH}" "ust/pid/*/" 1
+ rotate_ust_test "${TRACE_PATH}/archives" "ust/pid/*/" 1
+}
+
+function wait_until_app_unregistration ()
+{
+ local pid=$1
+ local mi_output
+ local value=1
+
+ mi_output=$(mktemp)
+
+ while [ $value -ne 0 ]; do
+ # Extract from lttng list tracepoint the registered apps.
+ # This should give us enough guarantee since that if the app is not
+ # present it is unregistered from lttng-sessiond point of view.
+ LTTNG_BIN="lttng --mi xml" OUTPUT_DEST="$mi_output" list_lttng_notap -u
+ if ! $MI_VALIDATE "$mi_output"; then
+ return 1
+ fi
+
+ value=$("$MI_VALIDATE" "$mi_output" "$XPATH_PID" | wc -l)
+ if [ $value -ne 0 ]; then
+ diag "At least one app is still registred from lttng-sessiond point of view"
+ sleep 1
+ else
+ # No app present on listing.
+ break;
+ fi
+ done
+
+ return 0
}
function test_ust_local_timer_uid ()
lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
start_lttng_tracing_ok $SESSION_NAME
# We just want the app to register, no event generated
- $TESTAPP_BIN 0 0 /dev/null 2>&1
+ $TESTAPP_BIN -i 0 -w 0 > /dev/null 2>&1
- rotate_timer_test "${TRACE_PATH}" 0
+ rotate_timer_test "${TRACE_PATH}/archives" 0
}
function test_ust_streaming_timer_uid ()
lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
start_lttng_tracing_ok $SESSION_NAME
# We just want the app to register, no event generated
- $TESTAPP_BIN 0 0 /dev/null 2>&1
+ $TESTAPP_BIN -i 0 -w 0 > /dev/null 2>&1
- rotate_timer_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" 0
+ rotate_timer_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" 0
}
function test_ust_local_timer_pid ()
{
+ local app_pid
+
diag "Test ust local with session rotation timer per-pid"
create_lttng_session_ok $SESSION_NAME $TRACE_PATH
enable_channel_per_pid $SESSION_NAME "channel0"
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
- lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
start_lttng_tracing_ok $SESSION_NAME
- # We just want the app to register, no event generated
- $TESTAPP_BIN 0 0 /dev/null 2>&1
- rotate_timer_test "${TRACE_PATH}" 1
+ # We just want the app to register, no event generated.
+ # But we want the pid for the app since we need to validate its
+ # unregistration on lttng listing.
+ $TESTAPP_BIN -i 0 -w 0 > /dev/null 2>&1 &
+ app_pid=$!
+ wait $app_pid
+
+ wait_until_app_unregistration $app_pid
+ ok $? "App is un-registered"
+
+ # Set the rotation after that the app is done and that it was
+ # unregistered from lttng-sessiond.
+ # This is necessary since the rotate_timer_test function expects the
+ # second rotation archive to be empty. On slow machine it can take more
+ # than 500ms for the lttng-sessiond to receive and handle an app
+ # termination. This can lead to situation where the second rotation
+ # archive still have the channels for the pid for the app since that
+ # from the point of view of the lttng-sessiond/consumer the app is still
+ # "alive" and "kicking". This is a problem only for per-pid testing.
+ lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
+
+ rotate_timer_test "${TRACE_PATH}/archives" 1
}
function test_ust_streaming_timer_pid ()
create_lttng_session_uri $SESSION_NAME net://localhost
enable_channel_per_pid $SESSION_NAME "channel0"
enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
- lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
start_lttng_tracing_ok $SESSION_NAME
- # We just want the app to register, no event generated
- $TESTAPP_BIN 0 0 /dev/null 2>&1
- rotate_timer_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*" 1
+ # We just want the app to register, no event generated.
+ # But we want the pid for the app since we need to validate its
+ # unregistration on lttng listing.
+ $TESTAPP_BIN -i 0 -w 0 > /dev/null 2>&1 &
+ app_pid=$!
+ wait $app_pid
+
+ wait_until_app_unregistration $app_pid
+ ok $? "App is un-registered"
+
+ # Set the rotation after that the app is done and that it was
+ # unregistered from lttng-sessiond.
+ # This is necessary since the rotate_timer_test function expects the
+ # second rotation archive to be empty. On slow machine it can take more
+ # than 500ms for the lttng-sessiond to receive and handle an app
+ # termination. This can lead to situation where the second rotation
+ # archive still have the channels for the pid for the app since that
+ # from the point of view of the lttng-sessiond/consumer the app is still
+ # "alive" and "kicking". This is a problem only for per-pid testing.
+ lttng_enable_rotation_timer_ok $SESSION_NAME 500ms
+
+ rotate_timer_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" 1
}
function test_incompatible_sessions ()
plan_tests $NUM_TESTS
print_test_banner "$TEST_DESC"
+bail_out_if_no_babeltrace
start_lttng_relayd "-o $TRACE_PATH"
start_lttng_sessiond