3 # Copyright (C) 2020 Francis Deslauriers <francis.deslauriers@efficios.com>
5 # SPDX-License-Identifier: LGPL-2.1-only
7 CURDIR
=$
(dirname "$0")/
8 TESTDIR
=$CURDIR/..
/..
/..
/
12 TESTAPP_PATH
="$TESTDIR/utils/testapp"
13 TESTAPP_NAME
="gen-ust-events"
14 TESTAPP_BIN
="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
16 TESTPOINT_BASE_PATH
=$
(readlink
-f "$TMPDIR/lttng.t_p_n")
17 TESTPOINT_PIPE_PATH
=$
(mktemp
-u "${TESTPOINT_BASE_PATH}.XXXXXX")
18 TESTPOINT
=$
(readlink
-f "${CURDIR}/.libs/libpause_sessiond.so")
22 # shellcheck source=../../../utils/utils.sh
23 source "$TESTDIR/utils/utils.sh"
24 # shellcheck source=./util_event_generator.sh
25 source "$CURDIR/util_event_generator.sh"
27 FULL_LTTNG_BIN
="${TESTDIR}/../src/bin/lttng/${LTTNG_BIN}"
28 FULL_LTTNG_SESSIOND_BIN
="${TESTDIR}/../src/bin/lttng-sessiond/lttng-sessiond"
32 NUM_TESTS
=$
(($UST_NUM_TESTS + $KERNEL_NUM_TESTS))
36 function test_kernel_notifier_discarded_count
38 local sessiond_pipe
=()
39 local trigger_name
="my_trigger"
40 local list_triggers_stdout
=$
(mktemp
-t list_triggers_stdout.XXXXXX
)
42 # Used on sessiond launch.
43 LTTNG_SESSIOND_ENV_VARS
="LTTNG_TESTPOINT_ENABLE=1 \
44 NOTIFIER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} \
45 LD_PRELOAD=${TESTPOINT}"
47 diag
"Kernel event notifer error counter"
49 start_lttng_sessiond_notap
51 # This is needed since the testpoint creates a pipe with the sessiond
53 for f
in "$TESTPOINT_BASE_PATH"*; do
57 lttng_add_trigger_ok
"$trigger_name" \
58 --condition on-event
--kernel lttng_test_filter_event \
61 "$FULL_LTTNG_BIN" list-triggers
> "$list_triggers_stdout"
63 # Confirm that the discarded notification line is not present.
64 cat "$list_triggers_stdout" |
grep -v --quiet "discarded tracer messages"
65 ok $?
"No discarded tracer notification message"
67 tail -n 1 "$list_triggers_stdout" |
grep --quiet "errors: none"
68 ok $?
"Trigger 'errors: none' notification message"
70 # Stop consumption of notifier tracer notifications.
71 diag
"Pause consumption of tracer messages"
72 echo -n 1 > $sessiond_pipe
74 # The notifier ring buffer configuration is currently made of 16 4096
75 # bytes subbuffers. Each kernel notification is at least 42 bytes long.
76 # To fill it, we need to generate (16 * 4096)/42 = 1561 notifications.
77 # That number is a bit larger than what we need since some of the space
78 # is lost in subbuffer boundaries.
79 echo -n "200000" > /proc
/lttng-test-filter-event
81 "$FULL_LTTNG_BIN" list-triggers
> "$list_triggers_stdout"
83 # Confirm that the discarded notification line is present. To avoid
85 cat "$list_triggers_stdout" |
grep --quiet "discarded tracer messages"
86 ok $?
"Tracer notification discarded line printed"
88 # Confirm that the number of dicarded tracer messages is not zero.
89 cat "$list_triggers_stdout" |
grep --quiet "discarded tracer messages: 0"
90 isnt $?
0 "Discarded tracer notification number non-zero as expected"
92 lttng_remove_trigger_ok
"$trigger_name"
94 # Confirm that no notifier is enabled.
95 list_triggers_line_count
=$
("$FULL_LTTNG_BIN" list-triggers |
wc -l)
96 is
"$list_triggers_line_count" "0" "No \`on-event\` kernel notifier enabled as expected"
98 # Enable another notifier and list it to confirm the counter was cleared.
99 lttng_add_trigger_ok
"$trigger_name" \
100 --condition on-event
--kernel lttng_test_filter_event \
103 # Confirm that the discarded notification line is not present.
104 cat "$list_triggers_stdout" |
grep -v --quiet "discarded tracer messages"
105 ok $?
"No discarded tracer notification message"
107 tail -n 1 "$list_triggers_stdout" |
grep --quiet "errors: none"
108 ok $?
"Trigger 'errors: none' notification message"
110 lttng_remove_trigger_ok
"$trigger_name"
112 stop_lttng_sessiond_notap
114 unset LTTNG_SESSIOND_ENV_VARS
116 rm -f "$list_triggers_stdout"
119 function test_kernel_notifier_discarded_count_max_bucket
121 start_lttng_sessiond
"" "--event-notifier-error-number-of-bucket=3"
123 diag
"Kernel event notifer error counter bucket limit"
124 for i
in $
(seq 3); do
125 lttng_add_trigger_ok
"$i" \
126 --condition on-event
--kernel my_event_that_doesnt_need_to_really_exist_
$i \
130 for i
in $
(seq 4 5); do
131 lttng_add_trigger_fail
"$i" \
132 --condition on-event
--kernel my_event_that_doesnt_need_to_really_exist_
$i \
136 stop_lttng_sessiond_notap
139 function test_ust_notifier_discarded_count
141 local sessiond_pipe
=()
142 local trigger_name
="my_trigger"
143 local list_triggers_stdout
=$
(mktemp
-t list_triggers_stdout.XXXXXX
)
148 diag
"UST event notifer error counter"
150 PIPE_SIZE
=$
("$CURDIR"/default_pipe_size_getter
)
151 if [ $?
-ne 0 ]; then
152 BAIL_OUT
"Failed to get system default pipe size"
154 diag
"Default system pipe size: $PIPE_SIZE bytes"
157 # Find the number of events needed to overflow the event notification
158 # pipe buffer. Each LTTng-UST notification is at least 42 bytes long.
159 # Double that number to ensure enough events are created to overflow
161 NR_ITER
=$
(( (PIPE_SIZE
/ 42) * 2 ))
162 diag
"Test application will emit $NR_ITER events"
164 # Used on sessiond launch.
165 LTTNG_SESSIOND_ENV_VARS
="LTTNG_TESTPOINT_ENABLE=1 \
166 NOTIFIER_PAUSE_PIPE_PATH=${TESTPOINT_PIPE_PATH} \
167 LD_PRELOAD=${TESTPOINT}"
169 start_lttng_sessiond_notap
171 # This is needed since the testpoint create a pipe with the sessiond
173 for f
in "$TESTPOINT_BASE_PATH"*; do
174 sessiond_pipe
+=("$f")
177 lttng_add_trigger_ok
"$trigger_name" \
178 --condition on-event
--userspace tp
:tptest \
181 "$FULL_LTTNG_BIN" list-triggers
> "$list_triggers_stdout"
183 # Confirm that the discarded notification line is not present.
184 cat "$list_triggers_stdout" |
grep -v --quiet "discarded tracer messages"
185 ok $?
"No discarded tracer notification message"
187 tail -n 1 "$list_triggers_stdout" |
grep --quiet "errors: none"
188 ok $?
"Trigger 'errors: none' notification message"
190 # Stop consumption of notifier tracer notifications.
191 diag
"Pause consumption of tracer messages"
192 echo -n 1 > $sessiond_pipe
194 $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT
195 ok $?
"Generating $NR_ITER tracer notifications"
197 "$FULL_LTTNG_BIN" list-triggers
> "$list_triggers_stdout"
199 # Confirm that the discarded notification line is present. To avoid
201 cat "$list_triggers_stdout" |
grep --quiet "discarded tracer messages"
202 ok $?
"Tracer notification discarded line printed"
204 # Confirm that the number of discarded tracer messages is not zero.
205 cat "$list_triggers_stdout" |
grep --quiet "discarded tracer messages: 0"
206 isnt $?
0 "Discarded tracer notification number non-zero as expected"
208 # Remove the notifier.
209 lttng_remove_trigger_ok
"$trigger_name"
211 # Confirm that no notifier is enabled.
212 list_triggers_line_count
=$
("$FULL_LTTNG_BIN" list-triggers |
wc -l)
213 is
"$list_triggers_line_count" "0" "No \`on-event\` userspace notifier enabled as expected"
215 # Enable another notifier and list it to confirm the counter was cleared.
216 lttng_add_trigger_ok
"$trigger_name" \
217 --condition on-event
--userspace tp
:tptest \
220 # Confirm that the discarded notification line is not present.
221 "$FULL_LTTNG_BIN" list-triggers
> "$list_triggers_stdout"
223 # Confirm that the discarded notification line is not present.
224 cat "$list_triggers_stdout" |
grep -v --quiet "discarded tracer messages"
225 ok $?
"No discarded tracer notification message"
227 tail -n 1 "$list_triggers_stdout" |
grep --quiet "errors: none"
228 ok $?
"Trigger 'errors: none' notification message"
230 lttng_remove_trigger_ok
"$trigger_name"
232 stop_lttng_sessiond_notap
234 unset LTTNG_SESSIOND_ENV_VARS
236 rm -f "$list_triggers_stdout"
238 function test_ust_notifier_discarded_count_max_bucket
240 start_lttng_sessiond
"" "--event-notifier-error-number-of-bucket=3"
242 diag
"UST event notifer error counter bucket limit"
243 for i
in $
(seq 3); do
244 lttng_add_trigger_ok
"$i" \
245 --condition on-event
--userspace my_event_that_doesnt_need_to_really_exist_
$i \
249 for i
in $
(seq 4 5); do
250 lttng_add_trigger_fail
"$i" \
251 --condition on-event
--userspace my_event_that_doesnt_need_to_really_exist_
$i \
255 stop_lttng_sessiond_notap
258 test_ust_notifier_discarded_count
259 test_ust_notifier_discarded_count_max_bucket
261 if [ "$(id -u)" == "0" ]; then
263 validate_lttng_modules_present
267 test_kernel_notifier_discarded_count
269 test_kernel_notifier_discarded_count_max_bucket
271 modprobe
--remove lttng-test
273 rm -rf "${sessiond_pipe[@]}" 2> /dev
/null
275 # Kernel tests are skipped.
276 skip
0 "Root access is needed. Skipping all kernel notification tests." $KERNEL_NUM_TESTS