Fix: tests: don't assume sequential cpuids
[lttng-tools.git] / tests / regression / tools / tracefile-limits / test_tracefile_count
CommitLineData
d946d662
CB
1#!/bin/bash
2#
9d16b343 3# Copyright (C) 2013 Christian Babeux <christian.babeux@efficios.com>
1f3d1fcc 4# Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com>
d946d662 5#
9d16b343 6# SPDX-License-Identifier: LGPL-2.1-only
d946d662
CB
7
8TEST_DESC="Tracefile count limits"
9
1f3d1fcc 10CURDIR=$(dirname "$0")/
d946d662
CB
11TESTDIR=$CURDIR/../../..
12
13TESTAPP_PATH="$TESTDIR/utils/testapp"
14TESTAPP_NAME="gen-ust-events"
15TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
16
17STATS_BIN="$TESTDIR/utils/babelstats.pl"
d7ee608c 18NUM_TESTS=74
d40d4ff6 19
3b0246b4 20PAGE_SIZE=$(getconf PAGE_SIZE)
1f3d1fcc 21TRACEFILE_SIZE=$PAGE_SIZE
d946d662 22
1f3d1fcc 23source "$TESTDIR"/utils/utils.sh
d946d662 24
206e6505
MJ
25NUM_CPUS=$(conf_proc_count)
26
d946d662
CB
27if [ ! -x "$TESTAPP_BIN" ]; then
28 BAIL_OUT "No UST events binary detected."
29fi
30
206e6505
MJ
31function pick_random_cpuid ()
32{
33 local cpuid=0
34
35 # On Linux pick a random available cpuid from sysfs
36 if [ -d "/sys/devices/system/cpu" ]; then
37 local cpuids=()
38
39 for i in /sys/devices/system/cpu/cpu[0-9]*; do
40 cpuids+=("${i#/sys/devices/system/cpu/cpu}")
41 done
42
43 cpuid=${cpuids[ $RANDOM % ${#cpuids[@]} ]}
44 else
45 cpuid=$((RANDOM % NUM_CPUS))
46 fi
47
48 echo $cpuid
49}
50
d946d662
CB
51function enable_lttng_channel_count_limit ()
52{
53 sess_name="$1"
54 channel_name="$2"
55 tracefile_count_limit="$3"
56
1f3d1fcc
JG
57 test_name="Enable channel \`$channel_name\` "
58 test_name+="for session \`$sess_name\`: "
d946d662
CB
59 test_name+="$tracefile_count_limit tracefiles"
60
1f3d1fcc
JG
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
d946d662
CB
66
67 ok $? "$test_name"
68}
69
1f3d1fcc 70function validate_min_max ()
d946d662
CB
71{
72 stats="$1"
73 field="$2"
74 expected_min="$3"
75 expected_max="$4"
76
77 echo $stats | grep -q -E "$field $expected_min $expected_max"
78 return $?
79}
80
1f3d1fcc 81function get_total_stream_file_size ()
d946d662 82{
1f3d1fcc
JG
83 local trace_path="$1"
84 local stream_name_pattern="$2"
85 local size
86
87 size=$(find "$trace_path" -type f -regex "$stream_name_pattern" -exec du -b -c {} + | tail -n1 | cut -f 1)
88 echo "$size"
d946d662
CB
89}
90
1f3d1fcc 91function get_stream_file_count ()
d946d662 92{
1f3d1fcc
JG
93 local trace_path="$1"
94 local stream_name_pattern="$2"
95 local count
d946d662 96
1f3d1fcc
JG
97 count=$(find "$trace_path" -type f -regex "$stream_name_pattern" | wc -l)
98 echo "$count"
99}
d946d662 100
1f3d1fcc
JG
101function test_tracefile_count_limit ()
102{
103 local count_limit="$1"
104
105 local channel_name="channel"
206e6505 106 local cpuno=$(pick_random_cpuid)
1f3d1fcc
JG
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
111 local session_name
112 local stream_pattern=".*${channel_name}_${cpuno}_[0-9]*"
113 local stream_size=0
33e55711 114 local trace_path=$(mktemp --tmpdir -d "tmp.${FUNCNAME[0]}_trace_path.XXXXXX")
d946d662 115
1f3d1fcc 116 session_name=$(randstring 16 0)
d946d662 117
1f3d1fcc 118 diag "Test tracefile count limit : CPU $cpuno, $count_limit tracefiles, expecting a maximum of $expected_size bytes per CPU"
d946d662 119
1f3d1fcc 120 create_lttng_session_ok "$session_name" "$trace_path"
d946d662 121
1f3d1fcc
JG
122 enable_lttng_channel_count_limit \
123 "$session_name" "$channel_name" "$count_limit"
124
125 enable_ust_lttng_event_ok \
126 "$session_name" "$event_name" "$channel_name"
127
128 # Run the test app until the total stream size stops changing the
129 # expected size is exceeded (error).
130 #
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
134 # in stream size.
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"
139
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"
143
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"
146 break
147 fi
148 done
d946d662 149
1f3d1fcc 150 destroy_lttng_session_ok "$session_name"
d946d662 151
1f3d1fcc
JG
152 [ "$expected_size" -eq "$stream_size" ]
153 ok $? "Total stream size of CPU $cpuno is $expected_size"
d946d662 154
1f3d1fcc
JG
155 [ "$(get_stream_file_count "$trace_path" "$stream_pattern")" -eq "$count_limit" ]
156 ok $? "Stream meets the trace file limit of $count_limit"
d946d662 157
c125de8f 158 stats=`"$BABELTRACE_BIN" $trace_path | $STATS_BIN --tracepoint $event_name`
d946d662
CB
159
160 validate_min_max "$stats" "intfield" "[0-9]+" "$expected_max"
161 ok $? "Trace validation - intfield"
162
163 validate_min_max "$stats" "netintfield" "[0-9]+" "$expected_max"
164 ok $? "Trace validation - netintfield"
165
166 validate_min_max "$stats" "longfield" "[0-9]+" "$expected_max"
167 ok $? "Trace validation - longfield"
168
1f3d1fcc 169 rm -rf "$trace_path"
d946d662
CB
170}
171
d40d4ff6
CB
172LIMITS=("1" "2" "4" "8" "10" "16" "32" "64")
173
1f3d1fcc 174plan_tests $NUM_TESTS
d946d662
CB
175
176print_test_banner "$TEST_DESC"
177
c125de8f
FD
178bail_out_if_no_babeltrace
179
d946d662
CB
180start_lttng_sessiond
181
1f3d1fcc 182for limit in "${LIMITS[@]}";
d946d662 183do
1f3d1fcc 184 test_tracefile_count_limit "$limit"
d946d662
CB
185done
186
187stop_lttng_sessiond
This page took 0.054976 seconds and 4 git commands to generate.