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
-c "$(get_any_available_cpu)" -p $$
1>/dev
/null
2>&1
213 create_lttng_session_no_output
"$SESSION_NAME"
214 enable_mmap_small_discard_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
215 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
216 start_lttng_tracing_ok
"$SESSION_NAME"
217 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
219 # Run test apps, wait for them to complete.
223 # Take first snapshot, remember first line.
224 lttng_snapshot_record
"$SESSION_NAME"
225 FIRST_LINE
="$(trace_first_line "$TRACE_PATH/")"
226 diag
"First line (1st snapshot): $FIRST_LINE"
227 rm -rf "${TRACE_PATH:?}/"
229 # Run test apps, wait for them to complete.
233 # Take second snapshot, remember first line.
234 lttng_snapshot_record
"$SESSION_NAME"
235 FIRST_LINE_2
="$(trace_first_line "$TRACE_PATH/")"
236 diag
"First line (2nd snapshot): $FIRST_LINE_2"
237 rm -rf "${TRACE_PATH:?}/"
239 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
240 fail
"First snapshot event do not match"
242 pass
"First snapshot event match"
245 stop_lttng_tracing_ok
"$SESSION_NAME"
246 destroy_lttng_session_ok
"$SESSION_NAME"
247 taskset
-p "$OLDCPUSET" $$
1>/dev
/null
2>&1
250 function test_ust_local_snapshot_small_overwrite_buffers
()
254 OLDCPUSET
=$
(taskset
-p $$
)
256 diag
"Test local UST snapshots with small overwrite buffers"
257 taskset
-p "$(get_any_available_cpu)" $$
1>/dev
/null
2>&1
258 create_lttng_session_no_output
"$SESSION_NAME"
259 enable_mmap_small_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
260 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
261 start_lttng_tracing_ok
"$SESSION_NAME"
262 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
264 # Run test apps, wait for them to complete.
268 # Take first snapshot, remember first line.
269 lttng_snapshot_record
"$SESSION_NAME"
270 FIRST_LINE
="$(trace_first_line "$TRACE_PATH/")"
271 diag
"First line (1st snapshot): $FIRST_LINE"
272 rm -rf "${TRACE_PATH:?}/"
274 # Run test apps, wait for them to complete.
278 # Take second snapshot, remember first line.
279 lttng_snapshot_record
"$SESSION_NAME"
280 FIRST_LINE_2
="$(trace_first_line "$TRACE_PATH/")"
281 diag
"First line (2nd snapshot): $FIRST_LINE_2"
282 rm -rf "${TRACE_PATH:?}/"
284 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
285 pass
"First snapshot event do not match"
287 fail
"First snapshot event match"
290 stop_lttng_tracing_ok
"$SESSION_NAME"
291 destroy_lttng_session_ok
"$SESSION_NAME"
292 taskset
-p "$OLDCPUSET" $$
1>/dev
/null
2>&1
295 function test_ust_local_snapshot_max_size
()
301 local snapshot_max_size
302 local channel_max_size_per_cpu
304 IFS
=" " read -r -a cpus_list
<<< "$(get_online_cpus)"
306 possible_cpus
=$
(get_possible_cpus_count
)
307 subbuf_size
=$
(getconf PAGE_SIZE
)
309 snapshot_max_size
=$
((subbuf_size
*possible_cpus
))
310 channel_max_size_per_cpu
=$
((subbuf_size
*subbuf_count
))
312 diag
"Test local UST snapshots with max size $max_size"
313 create_lttng_session_no_output
"$SESSION_NAME"
315 enable_mmap_overwrite_subbuf_ust_channel \
316 "$SESSION_NAME" "$CHANNEL_NAME" \
317 "$subbuf_size" "$subbuf_count"
319 enable_ust_lttng_event_ok
"$SESSION_NAME" "$EVENT_NAME" "$CHANNEL_NAME"
320 start_lttng_tracing_ok
"$SESSION_NAME"
322 snapshot_add_output
"$SESSION_NAME" "file://$TRACE_PATH" "" "$snapshot_max_size"
324 # Fill all ring-buffers of the channel; assuming event size of at least one
326 for cpu
in "${cpus_list[@]}";
328 diag
"setting affinity to $cpu"
329 taskset
--cpu-list "$cpu" "$TESTAPP_BIN" \
330 --iter "$channel_max_size_per_cpu"
332 diag
"Filled channel ring-buffers"
334 lttng_snapshot_record
"$SESSION_NAME"
338 snapshot_size
=$
(find "$TRACE_PATH" -name "${CHANNEL_NAME}_*" \
339 -exec stat
-c '%s' {} \
; | \
340 awk '{s = s + $1}END{print s}')
342 if [ "$snapshot_size" -eq "$snapshot_max_size" ]; then
343 pass
"Tracefiles size sum validation"
345 fail
"Tracefiles size sum validation"
346 diag
"Tracefiles size sum: $snapshot_size Expected max: $snapshot_max_size"
349 stop_lttng_tracing_ok
"$SESSION_NAME"
350 destroy_lttng_session_ok
"$SESSION_NAME"
353 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
355 if validate_trace
"$EVENT_NAME" "$TRACE_PATH/"; then
356 # Only delete if successful
363 function test_ust_local_snapshot_large_metadata
()
365 LM_EVENT
="tp:tptest1,tp:tptest2,tp:tptest3,tp:tptest4,tp:tptest5"
366 LM_PATH
="$TESTDIR/utils/testapp"
367 LM_NAME
="gen-ust-nevents"
368 LM_BIN
="$LM_PATH/$LM_NAME/$LM_NAME"
370 diag
"Test local UST snapshots with > 4kB metadata"
371 create_lttng_session_no_output
"$SESSION_NAME"
372 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
373 enable_ust_lttng_event_ok
"$SESSION_NAME" $LM_EVENT $CHANNEL_NAME
374 start_lttng_tracing_ok
"$SESSION_NAME"
375 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
376 $LM_BIN --iter 1 --wait 1
377 ok $?
"Start application to trace"
378 lttng_snapshot_record
"$SESSION_NAME"
379 stop_lttng_tracing_ok
"$SESSION_NAME"
380 destroy_lttng_session_ok
"$SESSION_NAME"
383 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
384 if validate_trace
$LM_EVENT "$TRACE_PATH/" ; then
385 # Only delete if successful
386 rm -rf "${TRACE_PATH:?}/"
390 function enable_channel_per_uid_mmap_overwrite
()
395 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-channel
--buffers-uid -u "$channel_name" -s "$sess_name" --output mmap
--overwrite >/dev
/null
2>&1
396 ok $?
"Enable channel $channel_name per UID for session $sess_name"
399 function test_ust_per_uid_local_snapshot
()
403 diag
"Test per-uid local UST snapshots"
404 create_lttng_session_no_output
"$SESSION_NAME"
405 enable_channel_per_uid_mmap_overwrite
"$SESSION_NAME" $CHANNEL_NAME
406 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
407 start_lttng_tracing_ok
"$SESSION_NAME"
408 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
410 # Returns once the application has at least fired ONE tracepoint.
413 lttng_snapshot_record
"$SESSION_NAME"
414 stop_lttng_tracing_ok
"$SESSION_NAME"
415 destroy_lttng_session_ok
"$SESSION_NAME"
418 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
419 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
420 # Only delete if successful
421 rm -rf "${TRACE_PATH:?}/"
427 function test_ust_per_uid_local_snapshot_post_mortem
()
432 diag
"Test local UST snapshots post-mortem"
433 create_lttng_session_no_output
"$SESSION_NAME"
434 enable_channel_per_uid_mmap_overwrite
"$SESSION_NAME" $CHANNEL_NAME
435 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
436 start_lttng_tracing_ok
"$SESSION_NAME"
437 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
439 # Returns once the application has at least fired ONE tracepoint.
443 lttng_snapshot_record
"$SESSION_NAME"
444 stop_lttng_tracing_ok
"$SESSION_NAME"
445 destroy_lttng_session_ok
"$SESSION_NAME"
448 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
449 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
450 # Only delete if successful
451 rm -rf "${TRACE_PATH:?}/"
455 function test_ust_local_snapshots
()
460 diag
"Test $NR_SNAPSHOT local UST snapshots"
461 create_lttng_session_no_output
"$SESSION_NAME"
462 enable_lttng_mmap_overwrite_ust_channel
"$SESSION_NAME" $CHANNEL_NAME
463 enable_ust_lttng_event_ok
"$SESSION_NAME" $EVENT_NAME $CHANNEL_NAME
464 start_lttng_tracing_ok
"$SESSION_NAME"
465 lttng_snapshot_add_output_ok
"$SESSION_NAME" "file://$TRACE_PATH"
467 # Returns once the application has at least fired ONE tracepoint.
470 for i
in $
(seq 1 "$NR_SNAPSHOT"); do
471 diag
"Snapshot $i/$NR_SNAPSHOT"
472 rm -rf "$TRACE_PATH/snapshot/*" 2>/dev
/null
473 lttng_snapshot_record
"$SESSION_NAME"
475 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" $
((i
- 1))
476 if validate_trace
$EVENT_NAME "$TRACE_PATH/" ; then
477 # Only delete if successful
478 rm -rf "${TRACE_PATH:?}/"
481 stop_lttng_tracing_ok
"$SESSION_NAME"
482 destroy_lttng_session_ok
"$SESSION_NAME"
487 plan_tests
$NUM_TESTS
489 print_test_banner
"$TEST_DESC"
491 bail_out_if_no_babeltrace
493 # shellcheck disable=SC2119
495 tests
=( test_ust_list_output
496 test_ust_local_snapshot
497 test_ust_local_snapshot_max_size
498 test_ust_per_uid_local_snapshot
499 test_ust_per_uid_local_snapshot_post_mortem
500 test_ust_local_snapshot_large_metadata
501 test_ust_local_snapshots
502 test_ust_local_snapshot_small_discard_buffers
503 test_ust_local_snapshot_small_overwrite_buffers
506 for fct_test
in "${tests[@]}";
508 SESSION_NAME
=$
(randstring
16 0)
512 # shellcheck disable=SC2119