X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Fregression%2Fust%2Fperiodical-metadata-flush%2Ftest_periodical_metadata_flush;h=56c23ff408a98b4704a0a4ff1743a66983673ad5;hb=8d5a3312b34841f1ecba2605acad3eaca79fd5e4;hp=2d984d522ada32914cd7cedfda385fa434cf5bf3;hpb=a788a3ed13e6caf984c88796b045727b820fdbc0;p=lttng-tools.git diff --git a/tests/regression/ust/periodical-metadata-flush/test_periodical_metadata_flush b/tests/regression/ust/periodical-metadata-flush/test_periodical_metadata_flush index 2d984d522..56c23ff40 100755 --- a/tests/regression/ust/periodical-metadata-flush/test_periodical_metadata_flush +++ b/tests/regression/ust/periodical-metadata-flush/test_periodical_metadata_flush @@ -1,33 +1,29 @@ #!/bin/bash # -# Copyright (C) - 2012 David Goulet +# Copyright (C) 2012 David Goulet # -# 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="UST tracer - Tracing with per UID buffers and periodical flush" CURDIR=$(dirname $0)/ TESTDIR=$CURDIR/../../.. NR_ITER=100 +NR_USEC_WAIT=100000 +TESTAPP_PATH="$TESTDIR/utils/testapp" +TESTAPP_NAME="gen-ust-events" +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" SESSION_NAME="periodical-flush" -EVENT_NAME="ust_gen_nevents:tptest" +EVENT_NAME="tp:tptest" BIN_NAME="gen-nevents" NUM_TESTS=38 +APP_TMP_FILE=$(mktemp -u -t tmp.test_periodical_metadata_flush_ust_app_tmp_file.XXXXXX) +APPS_PID= source $TESTDIR/utils/utils.sh -if [ ! -x "$CURDIR/gen-nevents" ]; then - BAIL_OUT "No UST nevents binary detected." +if [ ! -x "$TESTAPP_BIN" ]; then + BAIL_OUT "No UST events binary detected." fi # MUST set TESTDIR before calling those functions @@ -37,7 +33,16 @@ function enable_channel_per_uid() local sess_name=$1 local channel_name=$2 - $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-uid -u $channel_name -s $sess_name >/dev/null 2>&1 + $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-uid -u $channel_name -s $sess_name --switch-timer 100000 >/dev/null 2>&1 + ok $? "Enable channel $channel_name per UID for session $sess_name" +} + +function enable_channel_per_pid() +{ + local sess_name=$1 + local channel_name=$2 + + $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name --switch-timer 100000 >/dev/null 2>&1 ok $? "Enable channel $channel_name per UID for session $sess_name" } @@ -59,70 +64,144 @@ function enable_metadata_per_pid() ok $? "Enable channel $channel_name per PID for session $sess_name" } -function wait_apps +function validate_trace() { - diag "Waiting for applications to end..." - while [ -n "$(pidof $BIN_NAME)" ]; do - sleep 1 + local out + + out=$("$BABELTRACE_BIN" $TRACE_PATH | grep $EVENT_NAME | wc -l) + if [ $out -eq 0 ]; then + fail "Trace validation" + diag "No event(s) found. We are supposed to have at least one." + out=1 + else + pass "Trace validation" + diag "Found $out event(s). Coherent." + out=0 + fi + + return $out +} + +function check_app_tmp_file() +{ + # Wait for the application file to appear indicating that at least one + # tracepoint has been fired. + while [ ! -f "$APP_TMP_FILE" ]; do + sleep 0.5 + done + diag "Removing test app temporary file $APP_TMP_FILE" + rm -f $APP_TMP_FILE +} + +function start_trace_app() +{ + # Start application with a temporary file. + $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT --sync-after-first-event $APP_TMP_FILE & + ret=$? + APPS_PID="${APPS_PID} ${!}" + ok $ret "Start application to trace" +} + +function start_check_trace_app() +{ + start_trace_app + check_app_tmp_file +} + + +function wait_trace_apps() +{ + for p in ${APPS_PID}; do + wait ${p} 2>/dev/null done + APPS_PID= } test_after_app_pid() { local out + APPS_PID= + diag "Start application AFTER tracing is started" - # BEFORE application is spawned - create_lttng_session $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME $TRACE_PATH enable_metadata_per_pid $SESSION_NAME - enable_ust_lttng_channel $SESSION_NAME "channel0" - enable_ust_lttng_event $SESSION_NAME $EVENT_NAME - start_lttng_tracing $SESSION_NAME + enable_channel_per_pid $SESSION_NAME "channel0" + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + start_lttng_tracing_ok $SESSION_NAME + + # Start application after tracing + start_check_trace_app + # After this point we are sure that at least one event has been hit. + + # Make sure the application does not generate any more data, + # thus ensuring that we are not flushing a packet concurrently + # with validate_trace. + for p in ${APPS_PID}; do + kill -s SIGSTOP ${p} + done - ./$CURDIR/$BIN_NAME $NR_ITER - ok $? "Start application to trace" + # Give time to the consumer to write inflight data. + sleep 2 - stop_lttng_tracing $SESSION_NAME - destroy_lttng_session $SESSION_NAME + validate_trace + out=$? - trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH + for p in ${APPS_PID}; do + kill -s SIGKILL ${p} + wait ${p} 2>/dev/null + done + stop_lttng_tracing_ok $SESSION_NAME + destroy_lttng_session_ok $SESSION_NAME - return $? + wait_trace_apps + + return $out } test_before_app_pid() { local out + local tmp_file="/tmp/lttng_test_ust.42.file" + + APPS_PID= diag "Start application BEFORE tracing is started" - ./$CURDIR/$BIN_NAME $NR_ITER & - ok $? "Start application to trace" + start_trace_app - # BEFORE application is spawned - create_lttng_session $SESSION_NAME $TRACE_PATH + # Start application before tracing + create_lttng_session_ok $SESSION_NAME $TRACE_PATH enable_metadata_per_pid $SESSION_NAME - enable_ust_lttng_channel $SESSION_NAME "channel0" - enable_ust_lttng_event $SESSION_NAME $EVENT_NAME - start_lttng_tracing $SESSION_NAME + enable_channel_per_pid $SESSION_NAME "channel0" + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + start_lttng_tracing_ok $SESSION_NAME - # At least hit one event + check_app_tmp_file + # Let the application at least perform a flush! sleep 2 - stop_lttng_tracing $SESSION_NAME - destroy_lttng_session $SESSION_NAME + # Make sure the application does not generate any more data, + # thus ensuring that we are not flushing a packet concurrently + # with validate_trace. + for p in ${APPS_PID}; do + kill -s SIGSTOP ${p} + done - out=$(babeltrace $TRACE_PATH | grep $EVENT_NAME | wc -l) - if [ $out -eq 0 ]; then - fail "Trace validation" - diag "No event(s) found. We are supposed to have at least one." - out=1 - else - pass "Trace validation" - diag "Found $out event(s). Coherent." - out=0 - fi + # Give time to the consumer to write inflight data. + sleep 2 + + validate_trace + out=$? - wait_apps + for p in ${APPS_PID}; do + kill -s SIGKILL ${p} + wait ${p} 2>/dev/null + done + + stop_lttng_tracing_ok $SESSION_NAME + destroy_lttng_session_ok $SESSION_NAME + + wait_trace_apps return $out } @@ -130,59 +209,87 @@ test_before_app_pid() { test_after_app_uid() { local out + APPS_PID= + diag "Start application AFTER tracing is started" - # BEFORE application is spawned - create_lttng_session $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME $TRACE_PATH enable_metadata_per_uid $SESSION_NAME enable_channel_per_uid $SESSION_NAME "channel0" - enable_ust_lttng_event $SESSION_NAME $EVENT_NAME - start_lttng_tracing $SESSION_NAME + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + start_lttng_tracing_ok $SESSION_NAME + + # Start application after tracing + start_check_trace_app + # After this point we are sure that at least one event has been hit. + + # Make sure the application does not generate any more data, + # thus ensuring that we are not flushing a packet concurrently + # with validate_trace. + for p in ${APPS_PID}; do + kill -s SIGSTOP ${p} + done - ./$CURDIR/$BIN_NAME $NR_ITER - ok $? "Start application to trace" - stop_lttng_tracing $SESSION_NAME - destroy_lttng_session $SESSION_NAME + # Give time to the consumer to write inflight data. + sleep 2 + + validate_trace + out=$? - trace_matches $EVENT_NAME $NR_ITER $TRACE_PATH + for p in ${APPS_PID}; do + kill -s SIGKILL ${p} + wait ${p} 2>/dev/null + done + stop_lttng_tracing_ok $SESSION_NAME + destroy_lttng_session_ok $SESSION_NAME - return $? + wait_trace_apps + + return $out } test_before_app_uid() { local out + APPS_PID= + diag "Start application BEFORE tracing is started" - ./$CURDIR/$BIN_NAME $NR_ITER & - ok $? "Start application to trace" + # Start application before tracing + start_trace_app - # BEFORE application is spawned - create_lttng_session $SESSION_NAME $TRACE_PATH + create_lttng_session_ok $SESSION_NAME $TRACE_PATH enable_metadata_per_uid $SESSION_NAME enable_channel_per_uid $SESSION_NAME "channel0" - enable_ust_lttng_event $SESSION_NAME $EVENT_NAME - start_lttng_tracing $SESSION_NAME + enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0" + start_lttng_tracing_ok $SESSION_NAME - # At least hit one event + check_app_tmp_file + # Let the application at least perform a flush! sleep 2 - stop_lttng_tracing $SESSION_NAME - destroy_lttng_session $SESSION_NAME + # Make sure the application does not generate any more data, + # thus ensuring that we are not flushing a packet concurrently + # with validate_trace. + for p in ${APPS_PID}; do + kill -s SIGSTOP ${p} + done - out=$(babeltrace $TRACE_PATH | grep $EVENT_NAME | wc -l) - if [ $out -eq 0 ]; then - fail "Trace validation" - diag "No event(s) found. We are supposed to have at least one." - out=1 - else - pass "Trace validation" - diag "Found $out event(s). Coherent." - out=0 - fi + # Give time to the consumer to write inflight data. + sleep 2 + + validate_trace + out=$? + + for p in ${APPS_PID}; do + kill -s SIGKILL ${p} + wait ${p} 2>/dev/null + done + stop_lttng_tracing_ok $SESSION_NAME + destroy_lttng_session_ok $SESSION_NAME - wait_apps + wait_trace_apps return $out } @@ -191,6 +298,7 @@ test_before_app_uid() { plan_tests $NUM_TESTS print_test_banner "$TEST_DESC" +bail_out_if_no_babeltrace TESTS=( "test_before_app_uid" @@ -205,9 +313,9 @@ i=0 start_lttng_sessiond while [ $i -lt $TEST_COUNT ]; do - TRACE_PATH=$(mktemp -d) + TRACE_PATH=$(mktemp -d -t tmp.test_periodical_metadata_flush_ust_trace_path.XXXXXX) ${TESTS[$i]} - #rm -rf $TRACE_PATH + rm -rf $TRACE_PATH let "i++" done