3 # Copyright (C) 2013 Julien Desfossez <jdesfossez@efficios.com>
5 # SPDX-License-Identifier: LGPL-2.1-only
7 TEST_DESC
="Snapshots - UST tracing"
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 source $TESTDIR/utils
/utils.sh
25 if [ ! -x "$TESTAPP_BIN" ]; then
26 BAIL_OUT
"No UST events binary detected"
29 # Need the number of snapshot to do.
31 BAIL_OUT
"A number of snapshot is needed"
35 NUM_TESTS
=$
(($NUM_TESTS + ($NR_SNAPSHOT * 3)))
37 function start_test_app
()
39 local tmp_file
=$
(mktemp
-u -t "tmp.${FUNCNAME[0]}_tmp_file.XXXXXX")
41 # Start application with a temporary file.
42 $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT --sync-after-first-event $tmp_file &
44 APPS_PID
="${APPS_PID} ${!}"
45 ok
$ret "Start application to trace"
47 # Wait for the application file to appear indicating that at least one
48 # tracepoint has been fired.
49 while [ ! -f "$tmp_file" ]; do
52 diag
"Removing test app temporary file $tmp_file"
56 function wait_test_apps
()
58 diag
"Waiting for $TESTAPP_NAME"
59 for p
in ${APPS_PID}; do
64 function stop_test_apps
()
66 diag
"Stopping $TESTAPP_NAME"
67 for p
in ${APPS_PID}; do
74 function snapshot_add_output
()
82 if [ ! -z $name ]; then
83 extra_opt
+=" -n $name "
86 if [ ! -z $max_size ]; then
87 extra_opt
+=" -m $max_size "
90 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN snapshot add-output \
91 -s $sess_name $extra_opt $trace_path > /dev
/null
2>&1
93 ok $?
"Added snapshot output $trace_path ($extra_opt)"
96 function snapshot_del_output
()
101 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN snapshot del-output \
102 -s $sess_name $name > /dev
/null
2>&1
104 ok $?
"Deleted snapshot output named $name"
107 function enable_mmap_overwrite_subbuf_ust_channel
()
112 local subbuf_count
=$4
114 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-channel
-s $sess_name \
115 $chan_name -u --output mmap
--overwrite \
116 --num-subbuf=$subbuf_count \
117 --subbuf-size $subbuf_size > /dev
/null
2>&1
119 ok $?
"Enable channel $channel_name for session $sess_name with subbuf size $subbuf_size"
122 function enable_mmap_small_discard_ust_channel
()
127 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-channel
-s $sess_name \
128 $chan_name -u --output mmap
--discard \
129 --subbuf-size $
(getconf PAGE_SIZE
) --num-subbuf 2 \
132 ok $?
"Enable channel $channel_name for session $sess_name with small discard buffers"
135 function enable_mmap_small_overwrite_ust_channel
()
140 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-channel
-s $sess_name \
141 $chan_name -u --output mmap
--overwrite \
142 --subbuf-size $
(getconf PAGE_SIZE
) --num-subbuf 2 \
145 ok $?
"Enable channel $channel_name for session $sess_name with small discard buffers"
148 function test_ust_list_output
()
150 output_names
=("randomname" "somesnapshot")
152 diag
"Test UST snapshot output listing"
153 create_lttng_session_no_output
$SESSION_NAME
154 enable_lttng_mmap_overwrite_ust_channel
$SESSION_NAME $CHANNEL_NAME
155 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
157 start_lttng_tracing_ok
$SESSION_NAME
159 snapshot_add_output
$SESSION_NAME "file://$TRACE_PATH" ${output_names[0]}
161 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN snapshot list-output \
162 -s $SESSION_NAME 2>&1 |
grep ${output_names[0]} > /dev
/null
163 ok $?
"Snapshot named ${output_names[0]} present in list-output listing"
165 snapshot_del_output
$SESSION_NAME ${output_names[0]}
167 snapshot_add_output
$SESSION_NAME "file://$TRACE_PATH" ${output_names[1]}
169 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN snapshot list-output \
170 -s $SESSION_NAME 2>&1 |
grep ${output_names[1]} > /dev
/null
172 ok $?
"Snapshot named ${output_names[1]} present in list-output listing"
174 stop_lttng_tracing_ok
$SESSION_NAME
175 destroy_lttng_session_ok
$SESSION_NAME
178 function test_ust_local_snapshot
()
183 diag
"Test local UST snapshots"
184 create_lttng_session_no_output
$SESSION_NAME
185 enable_lttng_mmap_overwrite_ust_channel
$SESSION_NAME $CHANNEL_NAME
186 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
187 start_lttng_tracing_ok
$SESSION_NAME
188 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
190 # Returns once the application has at least fired ONE tracepoint.
193 lttng_snapshot_record
$SESSION_NAME
194 stop_lttng_tracing_ok
$SESSION_NAME
195 destroy_lttng_session_ok
$SESSION_NAME
198 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
199 validate_trace
$EVENT_NAME $TRACE_PATH/
200 if [ $?
-eq 0 ]; then
201 # Only delete if successful
208 function test_ust_local_snapshot_small_discard_buffers
()
212 OLDCPUSET
=$
(taskset
-p $$
)
214 diag
"Test local UST snapshots with small discard buffers"
215 taskset
-p 0x1 $$
1>/dev
/null
2>&1 # CPU 0 only
216 create_lttng_session_no_output
$SESSION_NAME
217 enable_mmap_small_discard_ust_channel
$SESSION_NAME $CHANNEL_NAME
218 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
219 start_lttng_tracing_ok
$SESSION_NAME
220 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
222 # Run test apps, wait for them to complete.
226 # Take first snapshot, remember first line.
227 lttng_snapshot_record
$SESSION_NAME
228 FIRST_LINE
="$(trace_first_line $TRACE_PATH/)"
229 diag
"First line (1st snapshot): $FIRST_LINE"
232 # Run test apps, wait for them to complete.
236 # Take second snapshot, remember first line.
237 lttng_snapshot_record
$SESSION_NAME
238 FIRST_LINE_2
="$(trace_first_line $TRACE_PATH/)"
239 diag
"First line (2nd snapshot): $FIRST_LINE_2"
242 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
243 fail
"First snapshot event do not match"
245 pass
"First snapshot event match"
248 stop_lttng_tracing_ok
$SESSION_NAME
249 destroy_lttng_session_ok
$SESSION_NAME
250 taskset
-p $OLDCPUSET $$
1>/dev
/null
2>&1
253 function test_ust_local_snapshot_small_overwrite_buffers
()
257 OLDCPUSET
=$
(taskset
-p $$
)
259 diag
"Test local UST snapshots with small overwrite buffers"
260 taskset
-p 0x1 $$
1>/dev
/null
2>&1 # CPU 0 only
261 create_lttng_session_no_output
$SESSION_NAME
262 enable_mmap_small_overwrite_ust_channel
$SESSION_NAME $CHANNEL_NAME
263 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
264 start_lttng_tracing_ok
$SESSION_NAME
265 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
267 # Run test apps, wait for them to complete.
271 # Take first snapshot, remember first line.
272 lttng_snapshot_record
$SESSION_NAME
273 FIRST_LINE
="$(trace_first_line $TRACE_PATH/)"
274 diag
"First line (1st snapshot): $FIRST_LINE"
277 # Run test apps, wait for them to complete.
281 # Take second snapshot, remember first line.
282 lttng_snapshot_record
$SESSION_NAME
283 FIRST_LINE_2
="$(trace_first_line $TRACE_PATH/)"
284 diag
"First line (2nd snapshot): $FIRST_LINE_2"
287 if [ x
"$FIRST_LINE" != x
"$FIRST_LINE_2" ]; then
288 pass
"First snapshot event do not match"
290 fail
"First snapshot event match"
293 stop_lttng_tracing_ok
$SESSION_NAME
294 destroy_lttng_session_ok
$SESSION_NAME
295 taskset
-p $OLDCPUSET $$
1>/dev
/null
2>&1
298 function test_ust_local_snapshot_max_size
()
304 local snapshot_max_size
305 local channel_max_size_per_cpu
307 IFS
=" " read -r -a cpus_list
<<< "$(get_exposed_cpus_list)"
309 possible_cpus
=$
(get_possible_cpus_count
)
310 subbuf_size
=$
(getconf PAGE_SIZE
)
312 snapshot_max_size
=$
((subbuf_size
*possible_cpus
))
313 channel_max_size_per_cpu
=$
((subbuf_size
*subbuf_count
))
315 diag
"Test local UST snapshots with max size $max_size"
316 create_lttng_session_no_output
"$SESSION_NAME"
318 enable_mmap_overwrite_subbuf_ust_channel \
319 "$SESSION_NAME" "$CHANNEL_NAME" \
320 "$subbuf_size" "$subbuf_count"
322 enable_ust_lttng_event_ok
"$SESSION_NAME" "$EVENT_NAME" "$CHANNEL_NAME"
323 start_lttng_tracing_ok
"$SESSION_NAME"
325 snapshot_add_output
"$SESSION_NAME" "file://$TRACE_PATH" "" "$snapshot_max_size"
327 # Fill all ring-buffers of the channel; assuming event size of at least one
329 for cpu
in "${cpus_list[@]}";
331 diag
"setting affinity to $cpu"
332 taskset
--cpu-list "$cpu" "$TESTAPP_BIN" \
333 --iter "$channel_max_size_per_cpu"
335 diag
"Filled channel ring-buffers"
337 lttng_snapshot_record
"$SESSION_NAME"
341 snapshot_size
=$
(find "$TRACE_PATH" -name "${CHANNEL_NAME}_*" \
342 -exec stat
-c '%s' {} \
; | \
343 awk '{s = s + $1}END{print s}')
345 if [ "$snapshot_size" -eq "$snapshot_max_size" ]; then
346 pass
"Tracefiles size sum validation"
348 fail
"Tracefiles size sum validation"
349 diag
"Tracefiles size sum: $snapshot_size Expected max: $snapshot_max_size"
352 stop_lttng_tracing_ok
"$SESSION_NAME"
353 destroy_lttng_session_ok
"$SESSION_NAME"
356 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
358 if validate_trace
"$EVENT_NAME" "$TRACE_PATH/"; then
359 # Only delete if successful
366 function test_ust_local_snapshot_large_metadata
()
368 LM_EVENT
="tp:tptest1,tp:tptest2,tp:tptest3,tp:tptest4,tp:tptest5"
369 LM_PATH
="$TESTDIR/utils/testapp"
370 LM_NAME
="gen-ust-nevents"
371 LM_BIN
="$LM_PATH/$LM_NAME/$LM_NAME"
373 diag
"Test local UST snapshots with > 4kB metadata"
374 create_lttng_session_no_output
$SESSION_NAME
375 enable_lttng_mmap_overwrite_ust_channel
$SESSION_NAME $CHANNEL_NAME
376 enable_ust_lttng_event_ok
$SESSION_NAME $LM_EVENT $CHANNEL_NAME
377 start_lttng_tracing_ok
$SESSION_NAME
378 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
379 $LM_BIN --iter 1 --wait 1
380 ok $?
"Start application to trace"
381 lttng_snapshot_record
$SESSION_NAME
382 stop_lttng_tracing_ok
$SESSION_NAME
383 destroy_lttng_session_ok
$SESSION_NAME
386 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
387 validate_trace
$LM_EVENT $TRACE_PATH/
388 if [ $?
-eq 0 ]; then
389 # Only delete if successful
394 function enable_channel_per_uid_mmap_overwrite
()
399 $TESTDIR/..
/src
/bin
/lttng
/$LTTNG_BIN enable-channel
--buffers-uid -u $channel_name -s $sess_name --output mmap
--overwrite >/dev
/null
2>&1
400 ok $?
"Enable channel $channel_name per UID for session $sess_name"
403 function test_ust_per_uid_local_snapshot
()
407 diag
"Test per-uid local UST snapshots"
408 create_lttng_session_no_output
$SESSION_NAME
409 enable_channel_per_uid_mmap_overwrite
$SESSION_NAME $CHANNEL_NAME
410 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
411 start_lttng_tracing_ok
$SESSION_NAME
412 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
414 # Returns once the application has at least fired ONE tracepoint.
417 lttng_snapshot_record
$SESSION_NAME
418 stop_lttng_tracing_ok
$SESSION_NAME
419 destroy_lttng_session_ok
$SESSION_NAME
422 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
423 validate_trace
$EVENT_NAME $TRACE_PATH/
424 if [ $?
-eq 0 ]; then
425 # Only delete if successful
432 function test_ust_per_uid_local_snapshot_post_mortem
()
437 diag
"Test local UST snapshots post-mortem"
438 create_lttng_session_no_output
$SESSION_NAME
439 enable_channel_per_uid_mmap_overwrite
$SESSION_NAME $CHANNEL_NAME
440 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
441 start_lttng_tracing_ok
$SESSION_NAME
442 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
444 # Returns once the application has at least fired ONE tracepoint.
448 lttng_snapshot_record
$SESSION_NAME
449 stop_lttng_tracing_ok
$SESSION_NAME
450 destroy_lttng_session_ok
$SESSION_NAME
453 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" 0
454 validate_trace
$EVENT_NAME $TRACE_PATH/
455 if [ $?
-eq 0 ]; then
456 # Only delete if successful
461 function test_ust_local_snapshots
()
466 diag
"Test $NR_SNAPSHOT local UST snapshots"
467 create_lttng_session_no_output
$SESSION_NAME
468 enable_lttng_mmap_overwrite_ust_channel
$SESSION_NAME $CHANNEL_NAME
469 enable_ust_lttng_event_ok
$SESSION_NAME $EVENT_NAME $CHANNEL_NAME
470 start_lttng_tracing_ok
$SESSION_NAME
471 lttng_snapshot_add_output_ok
$SESSION_NAME file://$TRACE_PATH
473 # Returns once the application has at least fired ONE tracepoint.
476 for i
in $
(seq 1 $NR_SNAPSHOT); do
477 diag
"Snapshot $i/$NR_SNAPSHOT"
478 rm -rf $TRACE_PATH/snapshot
/* 2>/dev
/null
479 lttng_snapshot_record
$SESSION_NAME
481 validate_trace_path_ust_uid_snapshot
"$TRACE_PATH" "" "snapshot-1" $
((i
- 1))
482 validate_trace
$EVENT_NAME $TRACE_PATH/
483 if [ $?
-eq 0 ]; then
484 # Only delete if successful
488 stop_lttng_tracing_ok
$SESSION_NAME
489 destroy_lttng_session_ok
$SESSION_NAME
494 plan_tests
$NUM_TESTS
496 print_test_banner
"$TEST_DESC"
498 bail_out_if_no_babeltrace
501 tests
=( test_ust_list_output
502 test_ust_local_snapshot
503 test_ust_local_snapshot_max_size
504 test_ust_per_uid_local_snapshot
505 test_ust_per_uid_local_snapshot_post_mortem
506 test_ust_local_snapshot_large_metadata
507 test_ust_local_snapshots
508 test_ust_local_snapshot_small_discard_buffers
509 test_ust_local_snapshot_small_overwrite_buffers
512 for fct_test
in ${tests[@]};
514 SESSION_NAME
=$
(randstring
16 0)