Tests: size-based rotation: implement a trace size cutoff protection
[lttng-tools.git] / tests / regression / tools / rotation / test_ust
index 08a140d9e3ac76d80a3e52c324ad2a410a0a1295..043b123bfa2f640d6edbd0cb30a29cad50ef72a2 100755 (executable)
@@ -1,19 +1,9 @@
 #!/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)/
@@ -25,9 +15,9 @@ TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
 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=150
+NUM_TESTS=152
 
 source $TESTDIR/utils/utils.sh
 source $CURDIR/rotate_utils.sh
@@ -36,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
@@ -55,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).
@@ -66,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 ()
@@ -83,7 +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
+       rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/uid/*/*/" 0
 }
 
 function test_ust_local_uid ()
@@ -92,7 +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
+       rotate_ust_test "${TRACE_PATH}/archives" "ust/uid/*/*/" 0
 }
 
 function test_ust_streaming_pid ()
@@ -102,7 +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
+       rotate_ust_test "${TRACE_PATH}/${HOSTNAME}/${SESSION_NAME}*/archives" "ust/pid/*/" 1
 }
 
 function test_ust_local_pid ()
@@ -112,7 +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
+       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 ()
@@ -123,9 +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
+       rotate_timer_test "${TRACE_PATH}/archives" 0
 }
 
 function test_ust_streaming_timer_uid ()
@@ -136,23 +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
+       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 ()
@@ -161,12 +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
+       # 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 ()
@@ -202,9 +255,53 @@ function test_incompatible_sessions ()
        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
+
+       # Cutoff at 100 times the expected size
+       trace_until_n_archives produce_n_events "$TRACE_PATH" 5 $((5 * 100 * size_threshold))
+
+       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
+
+       # Cutoff at 100 times the expected size
+       trace_until_n_archives produce_n_events "$TRACE_PATH" 3 $((3 * 100 * size_threshold))
+
+       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
@@ -213,6 +310,7 @@ 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[@]};
This page took 0.02804 seconds and 4 git commands to generate.