3 # Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
4 # Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com>
6 # SPDX-License-Identifier: LGPL-2.1-only
8 TEST_DESC
="Tracefile count limits"
10 CURDIR
=$
(dirname "$0")/
11 TESTDIR
=$CURDIR/..
/..
/..
13 TESTAPP_PATH
="$TESTDIR/utils/testapp"
14 TESTAPP_NAME
="gen-ust-events"
15 TESTAPP_BIN
="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
17 STATS_BIN
="$TESTDIR/utils/babelstats.pl"
20 PAGE_SIZE
=$
(getconf PAGE_SIZE
)
21 TRACEFILE_SIZE
=$PAGE_SIZE
23 source "$TESTDIR"/utils
/utils.sh
25 NUM_CPUS
=$
(conf_proc_count
)
27 if [ ! -x "$TESTAPP_BIN" ]; then
28 BAIL_OUT
"No UST events binary detected."
31 function pick_random_cpuid
()
35 # On Linux pick a random available cpuid from sysfs
36 if [ -d "/sys/devices/system/cpu" ]; then
39 for i
in /sys
/devices
/system
/cpu
/cpu
[0-9]*; do
40 cpuids
+=("${i#/sys/devices/system/cpu/cpu}")
43 cpuid
=${cpuids[ $RANDOM % ${#cpuids[@]} ]}
45 cpuid
=$
((RANDOM
% NUM_CPUS
))
51 function enable_lttng_channel_count_limit
()
55 tracefile_count_limit
="$3"
57 test_name
="Enable channel \`$channel_name\` "
58 test_name
+="for session \`$sess_name\`: "
59 test_name
+="$tracefile_count_limit tracefiles"
61 "$TESTDIR"/..
/src
/bin
/lttng
/"$LTTNG_BIN" enable-channel \
62 -u "$channel_name" -s "$sess_name" \
63 --subbuf-size "$PAGE_SIZE" \
64 --tracefile-size "$TRACEFILE_SIZE" \
65 --tracefile-count "$tracefile_count_limit" >/dev
/null
2>&1
70 function validate_min_max
()
77 echo $stats |
grep -q -E "$field $expected_min $expected_max"
81 function get_total_stream_file_size
()
84 local stream_name_pattern
="$2"
87 size
=$
(find "$trace_path" -type f
-regex "$stream_name_pattern" -exec du
-b -c {} + |
tail -n1 | cut
-f 1)
91 function get_stream_file_count
()
94 local stream_name_pattern
="$2"
97 count
=$
(find "$trace_path" -type f
-regex "$stream_name_pattern" |
wc -l)
101 function test_tracefile_count_limit
()
103 local count_limit
="$1"
105 local channel_name
="channel"
106 local cpuno
=$
(pick_random_cpuid
)
107 local event_name
="tp:tptest"
108 local expected_size
=$
((count_limit
* TRACEFILE_SIZE
))
109 local num_iter
=100000
110 local previous_stream_size
=-1
112 local stream_pattern
=".*${channel_name}_${cpuno}_[0-9]*"
114 local trace_path
=$
(mktemp
-d -t "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
116 session_name
=$
(randstring
16 0)
118 diag
"Test tracefile count limit : CPU $cpuno, $count_limit tracefiles, expecting a maximum of $expected_size bytes per CPU"
120 create_lttng_session_ok
"$session_name" "$trace_path"
122 enable_lttng_channel_count_limit \
123 "$session_name" "$channel_name" "$count_limit"
125 enable_ust_lttng_event_ok \
126 "$session_name" "$event_name" "$channel_name"
128 # Run the test app until the total stream size stops changing the
129 # expected size is exceeded (error).
131 # The `$stream_size` will not stabilize until the trace file count
132 # limit is reached. This is guaranteed by the use of start/produce/stop
133 # cycles forcing the consumption of buffers, preventing unwanted stall
135 while [ "$stream_size" -ne "$previous_stream_size" ]; do
136 start_lttng_tracing_notap
"$session_name"
137 taskset
-c "$cpuno" "$TESTAPP_BIN" -i "$num_iter" >/dev
/null
2>&1
138 stop_lttng_tracing_notap
"$session_name"
140 previous_stream_size
="$stream_size"
141 stream_size
=$
(get_total_stream_file_size
"$trace_path" "$stream_pattern")
142 diag
"Completed an iteration: previous size = $previous_stream_size bytes, new size = $stream_size bytes"
144 if [ "$stream_size" -gt "$expected_size" ]; then
145 diag
"Total size for CPU $cpuno exceeds expected size: stream size = $stream_size bytes, expected size = $expected_size"
150 destroy_lttng_session_ok
"$session_name"
152 [ "$expected_size" -eq "$stream_size" ]
153 ok $?
"Total stream size of CPU $cpuno is $expected_size"
155 [ "$(get_stream_file_count "$trace_path" "$stream_pattern")" -eq "$count_limit" ]
156 ok $?
"Stream meets the trace file limit of $count_limit"
158 stats
=`"$BABELTRACE_BIN" $trace_path | $STATS_BIN --tracepoint $event_name`
160 validate_min_max
"$stats" "intfield" "[0-9]+" "$expected_max"
161 ok $?
"Trace validation - intfield"
163 validate_min_max
"$stats" "netintfield" "[0-9]+" "$expected_max"
164 ok $?
"Trace validation - netintfield"
166 validate_min_max
"$stats" "longfield" "[0-9]+" "$expected_max"
167 ok $?
"Trace validation - longfield"
172 LIMITS
=("1" "2" "4" "8" "10" "16" "32" "64")
174 plan_tests
$NUM_TESTS
176 print_test_banner
"$TEST_DESC"
178 bail_out_if_no_babeltrace
182 for limit
in "${LIMITS[@]}";
184 test_tracefile_count_limit
"$limit"