3 # Copyright (C) 2013 Julien Desfossez <jdesfossez@efficios.com>
5 # SPDX-License-Identifier: LGPL-2.1-only
7 TEST_DESC
="Snapshots - UST tracing"
9 CURDIR
=$
(dirname "$0")/
10 TESTDIR
="$CURDIR/../../.."
11 EVENT_NAME
="tp:tptest"
13 CHANNEL_NAME
="snapchan"
14 TESTAPP_PATH
="$TESTDIR/utils/testapp"
15 TESTAPP_NAME
="gen-ust-events"
16 TESTAPP_BIN
="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
21 TRACE_PATH
=$
(mktemp
-d -t tmp.test_snapshots_ust_trace_path.XXXXXX
)
23 # shellcheck source-path=SCRIPTDIR/../../../
24 source "$TESTDIR/utils/utils.sh"
26 if [ ! -x "$TESTAPP_BIN" ]; then
27 BAIL_OUT
"No UST events binary detected"
30 # Need the number of snapshot to do.
32 BAIL_OUT
"A number of snapshot is needed"
36 NUM_TESTS
=$
((NUM_TESTS
+ (NR_SNAPSHOT
* 3)))
38 function start_test_app
()
41 tmp_file
=$
(mktemp
-u -t "tmp.${FUNCNAME[0]}_tmp_file.XXXXXX")
43 # Start application with a temporary file.
44 $TESTAPP_BIN -i "$NR_ITER" -w "$NR_USEC_WAIT" --sync-after-first-event "$tmp_file" &
47 ok
$ret "Start application to trace"
49 # Wait for the application file to appear indicating that at least one
50 # tracepoint has been fired.
51 while [ ! -f "$tmp_file" ]; do
54 diag
"Removing test app temporary file $tmp_file"
58 function wait_test_apps
()
60 diag
"Waiting for $TESTAPP_NAME"
61 wait "${APPS_PID[@]}" 2>/dev
/null
64 function stop_test_apps
()
66 diag
"Stopping $TESTAPP_NAME"
72 function snapshot_add_output
()
80 if [ -n "$name" ]; then
81 extra_opt
+=(-n "$name")
84 if [ -n "$max_size" ]; then
85 extra_opt
+=(-m "$max_size")
88 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" snapshot add-output \
89 -s "$sess_name" "${extra_opt[@]}" "$trace_path" > /dev
/null
2>&1
91 ok $?
"Added snapshot output $trace_path (${extra_opt[*]})"
94 function snapshot_del_output
()
99 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" snapshot del-output \
100 -s "$sess_name" "$name" > /dev
/null
2>&1
102 ok $?
"Deleted snapshot output named $name"
105 function enable_mmap_overwrite_subbuf_ust_channel
()
110 local subbuf_count
=$4
112 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-channel
-s "$sess_name" \
113 "$chan_name" -u --output mmap
--overwrite \
114 --num-subbuf="$subbuf_count" \
115 --subbuf-size "$subbuf_size" > /dev
/null
2>&1
117 ok $?
"Enable channel $channel_name for session $sess_name with subbuf size $subbuf_size"
120 function enable_mmap_small_discard_ust_channel
()
125 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-channel
-s "$sess_name" \
126 "$chan_name" -u --output mmap
--discard \
127 --subbuf-size "$(getconf PAGE_SIZE)" --num-subbuf 2 \
130 ok $?
"Enable channel $channel_name for session $sess_name with small discard buffers"
133 function enable_mmap_small_overwrite_ust_channel
()
138 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-channel
-s "$sess_name" \
139 "$chan_name" -u --output mmap
--overwrite \
140 --subbuf-size "$(getconf PAGE_SIZE)" --num-subbuf 2 \
143 ok $?
"Enable channel $channel_name for session $sess_name with small discard buffers"
146 function test_ust_list_output
()
148 output_names
=("randomname" "somesnapshot")
150 diag
"Test UST snapshot output listing"
151 create_lttng_session_no_output
"$SESSION_NAME"
152 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
153 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
155 start_lttng_tracing_ok
"$SESSION_NAME"
157 snapshot_add_output
"$SESSION_NAME" "file://$TRACE_PATH" "${output_names[0]}"
159 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" snapshot list-output \
160 -s "$SESSION_NAME" 2>&1 |
grep "${output_names[0]}" > /dev
/null
161 ok $?
"Snapshot named ${output_names[0]} present in list-output listing"
163 snapshot_del_output
"$SESSION_NAME" "${output_names[0]}"
165 snapshot_add_output
"$SESSION_NAME" "file://$TRACE_PATH" "${output_names[1]}"
167 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" snapshot list-output \
168 -s "$SESSION_NAME" 2>&1 |
grep "${output_names[1]}" > /dev
/null
170 ok $?
"Snapshot named ${output_names[1]} present in list-output listing"
172 stop_lttng_tracing_ok
"$SESSION_NAME"
173 destroy_lttng_session_ok
"$SESSION_NAME"
176 function test_ust_local_snapshot
()
181 diag
"Test local UST snapshots"
182 create_lttng_session_no_output
"$SESSION_NAME"
183 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
184 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
185 start_lttng_tracing_ok
"$SESSION_NAME"
186 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
188 # Returns once the application has at least fired ONE tracepoint.
191 lttng_snapshot_record
"$SESSION_NAME"
192 stop_lttng_tracing_ok
"$SESSION_NAME"
193 destroy_lttng_session_ok
"$SESSION_NAME"
196 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
197 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
198 # Only delete if successful
205 function test_ust_local_snapshot_small_discard_buffers
()
209 OLDCPUSET
=$
(taskset
-p $$
)
211 diag
"Test local UST snapshots with small discard buffers"
212 taskset
-cp "$(get_any_available_cpu)" $$
1>/dev
/null
2>&1
213 ok $?
"Set current process CPU affinity"
214 create_lttng_session_no_output
"$SESSION_NAME"
215 enable_mmap_small_discard_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
216 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
217 start_lttng_tracing_ok
"$SESSION_NAME"
218 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
220 # Run test apps, wait for them to complete.
224 # Take first snapshot, remember first line.
225 lttng_snapshot_record
"$SESSION_NAME"
226 FIRST_LINE
="$(trace_first_line "$TRACE_PATH/")"
227 diag
"First line (1st snapshot): $FIRST_LINE"
228 rm -rf "${TRACE_PATH:?}/"
230 # Run test apps, wait for them to complete.
234 # Take second snapshot, remember first line.
235 lttng_snapshot_record
"$SESSION_NAME"
236 FIRST_LINE_2
="$(trace_first_line "$TRACE_PATH/")"
237 diag
"First line (2nd snapshot): $FIRST_LINE_2"
238 rm -rf "${TRACE_PATH:?}/"
240 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
241 fail
"First snapshot event do not match"
243 pass
"First snapshot event match"
246 stop_lttng_tracing_ok
"$SESSION_NAME"
247 destroy_lttng_session_ok
"$SESSION_NAME"
248 taskset
-p "$OLDCPUSET" $$
1>/dev
/null
2>&1
251 function test_ust_local_snapshot_small_overwrite_buffers
()
255 OLDCPUSET
=$
(taskset
-p $$
)
257 diag
"Test local UST snapshots with small overwrite buffers"
258 taskset
-cp "$(get_any_available_cpu)" $$
1>/dev
/null
2>&1
259 ok $?
"Set current process CPU affinity"
260 create_lttng_session_no_output
"$SESSION_NAME"
261 enable_mmap_small_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
262 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
263 start_lttng_tracing_ok
"$SESSION_NAME"
264 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
266 # Run test apps, wait for them to complete.
270 # Take first snapshot, remember first line.
271 lttng_snapshot_record
"$SESSION_NAME"
272 FIRST_LINE
="$(trace_first_line "$TRACE_PATH/")"
273 diag
"First line (1st snapshot): $FIRST_LINE"
274 rm -rf "${TRACE_PATH:?}/"
276 # Run test apps, wait for them to complete.
280 # Take second snapshot, remember first line.
281 lttng_snapshot_record
"$SESSION_NAME"
282 FIRST_LINE_2
="$(trace_first_line "$TRACE_PATH/")"
283 diag
"First line (2nd snapshot): $FIRST_LINE_2"
284 rm -rf "${TRACE_PATH:?}/"
286 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
287 pass
"First snapshot event do not match"
289 fail
"First snapshot event match"
292 stop_lttng_tracing_ok
"$SESSION_NAME"
293 destroy_lttng_session_ok
"$SESSION_NAME"
294 taskset
-p "$OLDCPUSET" $$
1>/dev
/null
2>&1
297 function test_ust_local_snapshot_max_size
()
303 local snapshot_max_size
304 local channel_max_size_per_cpu
306 IFS
=" " read -r -a cpus_list
<<< "$(get_online_cpus)"
308 possible_cpus
=$
(get_possible_cpus_count
)
309 subbuf_size
=$
(getconf PAGE_SIZE
)
311 snapshot_max_size
=$
((subbuf_size
*possible_cpus
))
312 channel_max_size_per_cpu
=$
((subbuf_size
*subbuf_count
))
314 diag
"Test local UST snapshots with max size $max_size"
315 create_lttng_session_no_output
"$SESSION_NAME"
317 enable_mmap_overwrite_subbuf_ust_channel \
318 "$SESSION_NAME" "$CHANNEL_NAME" \
319 "$subbuf_size" "$subbuf_count"
321 enable_ust_lttng_event_ok
"$SESSION_NAME" "$EVENT_NAME" "$CHANNEL_NAME"
322 start_lttng_tracing_ok
"$SESSION_NAME"
324 snapshot_add_output
"$SESSION_NAME" "file://$TRACE_PATH" "" "$snapshot_max_size"
326 # Fill all ring-buffers of the channel; assuming event size of at least one
328 for cpu
in "${cpus_list[@]}";
330 diag
"setting affinity to $cpu"
331 taskset
--cpu-list "$cpu" "$TESTAPP_BIN" \
332 --iter "$channel_max_size_per_cpu"
334 diag
"Filled channel ring-buffers"
336 lttng_snapshot_record
"$SESSION_NAME"
340 snapshot_size
=$
(find "$TRACE_PATH" -name "${CHANNEL_NAME}_*" \
341 -exec stat
-c '%s' {} \
; | \
342 awk '{s = s + $1}END{print s}')
344 if [ "$snapshot_size" -eq "$snapshot_max_size" ]; then
345 pass
"Tracefiles size sum validation"
347 fail
"Tracefiles size sum validation"
348 diag
"Tracefiles size sum: $snapshot_size Expected max: $snapshot_max_size"
351 stop_lttng_tracing_ok
"$SESSION_NAME"
352 destroy_lttng_session_ok
"$SESSION_NAME"
355 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
357 if validate_trace
"$EVENT_NAME" "$TRACE_PATH/"; then
358 # Only delete if successful
365 function test_ust_local_snapshot_large_metadata
()
367 LM_EVENT
="tp:tptest1,tp:tptest2,tp:tptest3,tp:tptest4,tp:tptest5"
368 LM_PATH
="$TESTDIR/utils/testapp"
369 LM_NAME
="gen-ust-nevents"
370 LM_BIN
="$LM_PATH/$LM_NAME/$LM_NAME"
372 diag
"Test local UST snapshots with > 4kB metadata"
373 create_lttng_session_no_output
"$SESSION_NAME"
374 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
375 enable_ust_lttng_event_ok
"$SESSION_NAME" $LM_EVENT $CHANNEL_NAME
376 start_lttng_tracing_ok
"$SESSION_NAME"
377 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
378 $LM_BIN --iter 1 --wait 1
379 ok $?
"Start application to trace"
380 lttng_snapshot_record
"$SESSION_NAME"
381 stop_lttng_tracing_ok
"$SESSION_NAME"
382 destroy_lttng_session_ok
"$SESSION_NAME"
385 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
386 if validate_trace
$LM_EVENT "$TRACE_PATH/" ; then
387 # Only delete if successful
388 rm -rf "${TRACE_PATH:?}/"
392 function enable_channel_per_uid_mmap_overwrite
()
397 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-channel
--buffers-uid -u "$channel_name" -s "$sess_name" --output mmap
--overwrite >/dev
/null
2>&1
398 ok $?
"Enable channel $channel_name per UID for session $sess_name"
401 function test_ust_per_uid_local_snapshot
()
405 diag
"Test per-uid local UST snapshots"
406 create_lttng_session_no_output
"$SESSION_NAME"
407 enable_channel_per_uid_mmap_overwrite
"$SESSION_NAME" $CHANNEL_NAME
408 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
409 start_lttng_tracing_ok
"$SESSION_NAME"
410 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
412 # Returns once the application has at least fired ONE tracepoint.
415 lttng_snapshot_record
"$SESSION_NAME"
416 stop_lttng_tracing_ok
"$SESSION_NAME"
417 destroy_lttng_session_ok
"$SESSION_NAME"
420 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
421 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
422 # Only delete if successful
423 rm -rf "${TRACE_PATH:?}/"
429 function test_ust_per_uid_local_snapshot_post_mortem
()
434 diag
"Test local UST snapshots post-mortem"
435 create_lttng_session_no_output
"$SESSION_NAME"
436 enable_channel_per_uid_mmap_overwrite
"$SESSION_NAME" $CHANNEL_NAME
437 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
438 start_lttng_tracing_ok
"$SESSION_NAME"
439 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
441 # Returns once the application has at least fired ONE tracepoint.
445 lttng_snapshot_record
"$SESSION_NAME"
446 stop_lttng_tracing_ok
"$SESSION_NAME"
447 destroy_lttng_session_ok
"$SESSION_NAME"
450 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
451 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
452 # Only delete if successful
453 rm -rf "${TRACE_PATH:?}/"
457 function test_ust_local_snapshots
()
462 diag
"Test $NR_SNAPSHOT local UST snapshots"
463 create_lttng_session_no_output
"$SESSION_NAME"
464 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
465 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
466 start_lttng_tracing_ok
"$SESSION_NAME"
467 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
469 # Returns once the application has at least fired ONE tracepoint.
472 for i
in $
(seq 1 "$NR_SNAPSHOT"); do
473 diag
"Snapshot $i/$NR_SNAPSHOT"
474 rm -rf "$TRACE_PATH/snapshot/*" 2>/dev
/null
475 lttng_snapshot_record
"$SESSION_NAME"
477 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" $
((i
- 1))
478 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
479 # Only delete if successful
480 rm -rf "${TRACE_PATH:?}/"
483 stop_lttng_tracing_ok
"$SESSION_NAME"
484 destroy_lttng_session_ok
"$SESSION_NAME"
489 plan_tests
$NUM_TESTS
491 print_test_banner
"$TEST_DESC"
493 bail_out_if_no_babeltrace
495 # shellcheck disable=SC2119
497 tests
=( test_ust_list_output
498 test_ust_local_snapshot
499 test_ust_local_snapshot_max_size
500 test_ust_per_uid_local_snapshot
501 test_ust_per_uid_local_snapshot_post_mortem
502 test_ust_local_snapshot_large_metadata
503 test_ust_local_snapshots
504 test_ust_local_snapshot_small_discard_buffers
505 test_ust_local_snapshot_small_overwrite_buffers
508 for fct_test
in "${tests[@]}";
510 SESSION_NAME
=$
(randstring
16 0)
514 # shellcheck disable=SC2119