X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Fregression%2Ftools%2Frotation%2Ftest_ust;h=aaeee4454c7a38255bb84af162b9b4450d04a031;hb=34764ec838debdb5fdb59e178b31a44047ea7229;hp=25654714f77af4243d16b9cff6d9a272199080bd;hpb=308a89467c4dbfe218a9665bab82555dd88c07c9;p=lttng-tools.git diff --git a/tests/regression/tools/rotation/test_ust b/tests/regression/tools/rotation/test_ust index 25654714f..aaeee4454 100755 --- a/tests/regression/tools/rotation/test_ust +++ b/tests/regression/tools/rotation/test_ust @@ -1,35 +1,23 @@ #!/bin/bash # -# Copyright (C) - 2017 Julien Desfossez +# Copyright (C) 2017 Julien Desfossez # -# 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)/ TESTDIR=$CURDIR/../../.. -NR_ITER=1 NR_USEC_WAIT=0 TESTAPP_PATH="$TESTDIR/utils/testapp" TESTAPP_NAME="gen-ust-events" TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" SESSION_NAME="stream" EVENT_NAME="tp:tptest" -PID_RELAYD=0 -TRACE_PATH=$(mktemp -d) +TRACE_PATH=$(mktemp --tmpdir -d -t tmp.test_ust_rotation_trace_path.XXXXXX) -NUM_TESTS=150 +NUM_TESTS=152 source $TESTDIR/utils/utils.sh source $CURDIR/rotate_utils.sh @@ -38,6 +26,9 @@ if [ ! -x "$TESTAPP_BIN" ]; then 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 @@ -57,10 +48,10 @@ function rotate_ust_test () 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). @@ -68,15 +59,7 @@ function rotate_ust_test () destroy_lttng_session_ok $SESSION_NAME - # The tests on the chunk folder rely on the date staying the same during - # the duration of the test, if this fail we will now why the other checks - # fail afterwards. There is a short window of time where an automated test - # could fail because of that. - now=$(date +%Y%m%d) - test $today = $now - ok $? "Date did not change during the test" - - validate_test_chunks "${local_path}" $today $app_path ust $per_pid + validate_test_chunks "${local_path}" $today $app_path ust } function test_ust_streaming_uid () @@ -85,8 +68,7 @@ function test_ust_streaming_uid () 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 - clean_path $TRACE_PATH + rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/uid/*/*/" 0 } function test_ust_local_uid () @@ -95,8 +77,7 @@ 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 - clean_path $TRACE_PATH + rotate_ust_test "${TRACE_PATH}/archives" "ust/uid/*/*/" 0 } function test_ust_streaming_pid () @@ -106,8 +87,7 @@ 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 - clean_path $TRACE_PATH + rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/pid/*/" 1 } function test_ust_local_pid () @@ -117,8 +97,37 @@ 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 - clean_path $TRACE_PATH + 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 () @@ -129,10 +138,9 @@ 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 - clean_path $TRACE_PATH + rotate_timer_test "${TRACE_PATH}/archives" 0 } function test_ust_streaming_timer_uid () @@ -143,25 +151,43 @@ 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 - clean_path $TRACE_PATH + 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 - clean_path $TRACE_PATH + # 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 () @@ -170,13 +196,30 @@ 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 - clean_path $TRACE_PATH + # 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 () @@ -210,12 +253,53 @@ function test_incompatible_sessions () start_lttng_tracing_ok $SESSION_NAME rotate_session_fail $SESSION_NAME destroy_lttng_session_ok $SESSION_NAME +} + +function produce_n_events () +{ + local event_count=$1 + + $TESTAPP_BIN -i "$event_count" -w 0 > /dev/null 2>&1 +} + +function test_ust_local_size_uid () +{ + diag "Rotate uid local session every 2MiB" + local size_threshold=$((2 * 1024 * 1024)) + + diag "Test ust local with size-based session rotation per-uid" + create_lttng_session_ok $SESSION_NAME $TRACE_PATH + enable_ust_lttng_channel_ok $SESSION_NAME "channel0" --buffers-uid + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + lttng_enable_rotation_size_ok $SESSION_NAME $size_threshold + start_lttng_tracing_ok $SESSION_NAME + + trace_until_n_archives produce_n_events "$TRACE_PATH" 5 + destroy_lttng_session_ok $SESSION_NAME +} + +function test_ust_local_size_pid () +{ + diag "Rotate uid local session every 2MiB" + local size_threshold=$((2 * 1024 * 1024)) + + diag "Test ust local with size-based session rotation per-pid" + create_lttng_session_ok $SESSION_NAME $TRACE_PATH + enable_ust_lttng_channel_ok $SESSION_NAME "channel0" --buffers-pid + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + lttng_enable_rotation_size_ok $SESSION_NAME $size_threshold + start_lttng_tracing_ok $SESSION_NAME + + trace_until_n_archives produce_n_events "$TRACE_PATH" 3 + + destroy_lttng_session_ok $SESSION_NAME } plan_tests $NUM_TESTS print_test_banner "$TEST_DESC" +bail_out_if_no_babeltrace start_lttng_relayd "-o $TRACE_PATH" start_lttng_sessiond @@ -224,12 +308,14 @@ tests=( test_ust_streaming_uid test_ust_local_uid \ test_ust_streaming_pid test_ust_local_pid \ test_ust_local_timer_uid test_ust_streaming_timer_uid \ test_ust_local_timer_pid test_ust_streaming_timer_pid \ + test_ust_local_size_uid test_ust_local_size_pid \ test_incompatible_sessions ) for fct_test in ${tests[@]}; do SESSION_NAME=$(randstring 16 0) ${fct_test} + clean_path $TRACE_PATH done stop_lttng_sessiond