287ee24bf0dc258e94f1f73e3c71476be4632771
[lttng-tools.git] / tests / regression / tools / snapshots / ust_test
1 #!/bin/bash
2 #
3 # Copyright (C) - 2013 Julien Desfossez <jdesfossez@efficios.com>
4 #
5 # This library is free software; you can redistribute it and/or modify it under
6 # the terms of the GNU Lesser General Public License as published by the Free
7 # Software Foundation; version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 # details.
13 #
14 # You should have received a copy of the GNU Lesser General Public License
15 # along with this library; if not, write to the Free Software Foundation, Inc.,
16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 TEST_DESC="Snapshots - UST tracing"
18
19 CURDIR=$(dirname $0)/
20 TESTDIR=$CURDIR/../../..
21 EVENT_NAME="tp:tptest"
22 PID_RELAYD=0
23 SESSION_NAME=""
24 CHANNEL_NAME="snapchan"
25 TESTAPP_PATH="$TESTDIR/utils/testapp"
26 TESTAPP_NAME="gen-ust-events"
27 TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
28 APPS_PID=
29
30 NUM_TESTS=100
31
32 TRACE_PATH=$(mktemp -d)
33
34 source $TESTDIR/utils/utils.sh
35
36 if [ ! -x "$TESTAPP_BIN" ]; then
37 BAIL_OUT "No UST events binary detected."
38 fi
39
40 # Need the number of snapshot to do.
41 if [ -z $1 ]; then
42 BAIL_OUT "A number of snapshot is needed."
43 fi
44 NR_SNAPSHOT=$1
45
46 NUM_TESTS=$(($NUM_TESTS + ($NR_SNAPSHOT * 2)))
47
48 function start_test_app()
49 {
50 local tmp_file=$(mktemp -u)
51
52 # Start application with a temporary file.
53 $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT $tmp_file &
54 ret=$?
55 APPS_PID="${APPS_PID} ${!}"
56 ok $ret "Start application to trace"
57
58 # Wait for the application file to appear indicating that at least one
59 # tracepoint has been fired.
60 while [ ! -f "$tmp_file" ]; do
61 sleep 0.5
62 done
63 diag "Removing test app temporary file $tmp_file"
64 rm -f $tmp_file
65 }
66
67 function wait_test_apps()
68 {
69 diag "Waiting for $TESTAPP_NAME"
70 for p in ${APPS_PID}; do
71 wait ${p} 2>/dev/null
72 done
73 }
74
75 function stop_test_apps()
76 {
77 diag "Stopping $TESTAPP_NAME"
78 for p in ${APPS_PID}; do
79 kill ${p}
80 wait ${p} 2>/dev/null
81 done
82 APPS_PID=
83 }
84
85 function snapshot_add_output ()
86 {
87 local sess_name=$1
88 local trace_path=$2
89 local name=$3
90 local max_size=$4
91 local extra_opt=""
92
93 if [ ! -z $name ]; then
94 extra_opt+=" -n $name "
95 fi
96
97 if [ ! -z $max_size ]; then
98 extra_opt+=" -m $max_size "
99 fi
100
101 $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot add-output \
102 -s $sess_name $extra_opt $trace_path > /dev/null 2>&1
103
104 ok $? "Added snapshot output $trace_path ($extra_opt)"
105 }
106
107 function snapshot_del_output ()
108 {
109 local sess_name=$1
110 local name=$2
111
112 $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot del-output \
113 -s $sess_name $name > /dev/null 2>&1
114
115 ok $? "Deleted snapshot output named $name"
116 }
117
118 function enable_mmap_overwrite_subbuf_ust_channel ()
119 {
120 local sess_name=$1
121 local chan_name=$2
122 local subbuf_size=$3
123
124 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name \
125 $chan_name -u --output mmap --overwrite \
126 --subbuf-size $subbuf_size > /dev/null 2>&1
127
128 ok $? "Enable channel $channel_name for session $sess_name with subbuf size $subbuf_size"
129 }
130
131 function enable_mmap_small_discard_ust_channel ()
132 {
133 local sess_name=$1
134 local chan_name=$2
135
136 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name \
137 $chan_name -u --output mmap --discard \
138 --subbuf-size $(getconf PAGE_SIZE) --num-subbuf 2 \
139 > /dev/null 2>&1
140
141 ok $? "Enable channel $channel_name for session $sess_name with small discard buffers"
142 }
143
144 function enable_mmap_small_overwrite_ust_channel ()
145 {
146 local sess_name=$1
147 local chan_name=$2
148
149 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel -s $sess_name \
150 $chan_name -u --output mmap --overwrite \
151 --subbuf-size $(getconf PAGE_SIZE) --num-subbuf 2 \
152 > /dev/null 2>&1
153
154 ok $? "Enable channel $channel_name for session $sess_name with small discard buffers"
155 }
156
157 function test_ust_list_output ()
158 {
159 output_names=("randomname" "somesnapshot")
160 NR_ITER=2000000
161 NR_USEC_WAIT=100
162
163 diag "Test UST snapshot output listing"
164 create_lttng_session_no_output $SESSION_NAME
165 enable_lttng_mmap_overwrite_ust_channel $SESSION_NAME $CHANNEL_NAME
166 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME
167
168 start_lttng_tracing_ok $SESSION_NAME
169
170 snapshot_add_output $SESSION_NAME "file://$TRACE_PATH" ${output_names[0]}
171
172 $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot list-output \
173 -s $SESSION_NAME 2>&1 | grep ${output_names[0]} > /dev/null
174 ok $? "Snapshot named ${output_names[0]} present in list-output listing"
175
176 snapshot_del_output $SESSION_NAME ${output_names[0]}
177
178 snapshot_add_output $SESSION_NAME "file://$TRACE_PATH" ${output_names[1]}
179
180 $TESTDIR/../src/bin/lttng/$LTTNG_BIN snapshot list-output \
181 -s $SESSION_NAME 2>&1 | grep ${output_names[1]} > /dev/null
182
183 ok $? "Snapshot named ${output_names[1]} present in list-output listing"
184
185 stop_lttng_tracing_ok $SESSION_NAME
186 destroy_lttng_session_ok $SESSION_NAME
187 }
188
189 function test_ust_local_snapshot ()
190 {
191 NR_ITER=2000000
192 NR_USEC_WAIT=100
193
194 diag "Test local UST snapshots"
195 create_lttng_session_no_output $SESSION_NAME
196 enable_lttng_mmap_overwrite_ust_channel $SESSION_NAME $CHANNEL_NAME
197 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME
198 start_lttng_tracing_ok $SESSION_NAME
199 lttng_snapshot_add_output_ok $SESSION_NAME $TRACE_PATH
200
201 # Returns once the application has at least fired ONE tracepoint.
202 start_test_app
203
204 lttng_snapshot_record $SESSION_NAME
205 stop_lttng_tracing_ok $SESSION_NAME
206 destroy_lttng_session_ok $SESSION_NAME
207
208 # Validate test
209 validate_trace $EVENT_NAME $TRACE_PATH/
210 if [ $? -eq 0 ]; then
211 # Only delete if successful
212 rm -rf $TRACE_PATH
213 fi
214
215 stop_test_apps
216 }
217
218 function test_ust_local_snapshot_small_discard_buffers ()
219 {
220 NR_ITER=10000
221 NR_USEC_WAIT=0
222 OLDCPUSET=$(taskset -p $$)
223
224 diag "Test local UST snapshots with small discard buffers"
225 taskset -p 0x1 $$ 1>/dev/null 2>&1 # CPU 0 only
226 create_lttng_session_no_output $SESSION_NAME
227 enable_mmap_small_discard_ust_channel $SESSION_NAME $CHANNEL_NAME
228 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME
229 start_lttng_tracing_ok $SESSION_NAME
230 lttng_snapshot_add_output_ok $SESSION_NAME $TRACE_PATH
231
232 # Run test apps, wait for them to complete.
233 start_test_app
234 wait_test_apps
235
236 # Take first snapshot, remember first line.
237 lttng_snapshot_record $SESSION_NAME
238 FIRST_LINE="$(trace_first_line $TRACE_PATH/)"
239 diag "First line (1st snapshot): $FIRST_LINE"
240 rm -rf $TRACE_PATH/
241
242 # Run test apps, wait for them to complete.
243 start_test_app
244 wait_test_apps
245
246 # Take second snapshot, remember first line.
247 lttng_snapshot_record $SESSION_NAME
248 FIRST_LINE_2="$(trace_first_line $TRACE_PATH/)"
249 diag "First line (2nd snapshot): $FIRST_LINE_2"
250 rm -rf $TRACE_PATH/
251
252 if [ x"$FIRST_LINE" != x"$FIRST_LINE_2" ]; then
253 fail "First snapshot event do not match."
254 else
255 pass "First snapshot event match."
256 fi
257
258 stop_lttng_tracing_ok $SESSION_NAME
259 destroy_lttng_session_ok $SESSION_NAME
260 taskset -p $OLDCPUSET $$ 1>/dev/null 2>&1
261 }
262
263 function test_ust_local_snapshot_small_overwrite_buffers ()
264 {
265 NR_ITER=10000
266 NR_USEC_WAIT=0
267 OLDCPUSET=$(taskset -p $$)
268
269 diag "Test local UST snapshots with small overwrite buffers"
270 taskset -p 0x1 $$ 1>/dev/null 2>&1 # CPU 0 only
271 create_lttng_session_no_output $SESSION_NAME
272 enable_mmap_small_overwrite_ust_channel $SESSION_NAME $CHANNEL_NAME
273 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME
274 start_lttng_tracing_ok $SESSION_NAME
275 lttng_snapshot_add_output_ok $SESSION_NAME $TRACE_PATH
276
277 # Run test apps, wait for them to complete.
278 start_test_app
279 wait_test_apps
280
281 # Take first snapshot, remember first line.
282 lttng_snapshot_record $SESSION_NAME
283 FIRST_LINE="$(trace_first_line $TRACE_PATH/)"
284 diag "First line (1st snapshot): $FIRST_LINE"
285 rm -rf $TRACE_PATH/
286
287 # Run test apps, wait for them to complete.
288 start_test_app
289 wait_test_apps
290
291 # Take second snapshot, remember first line.
292 lttng_snapshot_record $SESSION_NAME
293 FIRST_LINE_2="$(trace_first_line $TRACE_PATH/)"
294 diag "First line (2nd snapshot): $FIRST_LINE_2"
295 rm -rf $TRACE_PATH/
296
297 if [ x"$FIRST_LINE" != x"$FIRST_LINE_2" ]; then
298 pass "First snapshot event do not match."
299 else
300 fail "First snapshot event match."
301 fi
302
303 stop_lttng_tracing_ok $SESSION_NAME
304 destroy_lttng_session_ok $SESSION_NAME
305 taskset -p $OLDCPUSET $$ 1>/dev/null 2>&1
306 }
307
308 function test_ust_local_snapshot_max_size ()
309 {
310 NR_ITER=2000000
311 NR_USEC_WAIT=100
312 page_size=`getconf PAGE_SIZE`
313 num_cpus=$(conf_proc_count)
314
315 # The minimum subbuf size is the platform PAGE_SIZE
316 subbuf_size=$(($page_size*2))
317
318 # The minimum size limit is min(subbuf_size) * nb_streams
319 max_size=$(($subbuf_size*$num_cpus))
320
321 diag "Test local UST snapshots with max size $max_size"
322 create_lttng_session_no_output $SESSION_NAME
323
324 enable_mmap_overwrite_subbuf_ust_channel $SESSION_NAME $CHANNEL_NAME $subbuf_size
325
326 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME $CHANNEL_NAME
327 start_lttng_tracing_ok $SESSION_NAME
328
329 snapshot_add_output $SESSION_NAME "file://$TRACE_PATH" "" $max_size
330
331 # Returns once the application has at least fired ONE tracepoint.
332 start_test_app
333
334 lttng_snapshot_record $SESSION_NAME
335
336 # Check file size
337 sum_size_tracefiles=$(find $TRACE_PATH -name "${CHANNEL_NAME}_*" \
338 -exec stat -c '%s' {} \; | awk '{s = s + $1}END{print s}')
339
340 if [ "$sum_size_tracefiles" -gt "$max_size" ]; then
341 fail "Tracefiles size sum validation"
342 diag "Tracefiles size sum: $sum_size_tracefiles Expected max: $max_size"
343 fi
344
345 pass "Tracefiles size sum validation"
346
347 stop_lttng_tracing_ok $SESSION_NAME
348 destroy_lttng_session_ok $SESSION_NAME
349
350 # Validate test
351 validate_trace $EVENT_NAME $TRACE_PATH/
352
353 if [ $? -eq 0 ]; then
354 # Only delete if successful
355 rm -rf $TRACE_PATH
356 fi
357
358 stop_test_apps
359 }
360
361 function test_ust_local_snapshot_large_metadata ()
362 {
363 NR_ITER=2000000
364 NR_USEC_WAIT=100
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"
369
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 $TRACE_PATH
376 $LM_BIN 1 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
381
382 # Validate test
383 validate_trace $LM_EVENT $TRACE_PATH/
384 if [ $? -eq 0 ]; then
385 # Only delete if successful
386 rm -rf $TRACE_PATH
387 fi
388 }
389
390 function enable_channel_per_uid_mmap_overwrite()
391 {
392 NR_ITER=2000000
393 NR_USEC_WAIT=100
394 sess_name=$1
395 channel_name=$2
396
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"
399 }
400
401 function test_ust_per_uid_local_snapshot ()
402 {
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 $TRACE_PATH
409
410 # Returns once the application has at least fired ONE tracepoint.
411 start_test_app
412
413 lttng_snapshot_record $SESSION_NAME
414 stop_lttng_tracing_ok $SESSION_NAME
415 destroy_lttng_session_ok $SESSION_NAME
416
417 # Validate test
418 validate_trace $EVENT_NAME $TRACE_PATH/
419 if [ $? -eq 0 ]; then
420 # Only delete if successful
421 rm -rf $TRACE_PATH
422 fi
423
424 stop_test_apps
425 }
426
427 function test_ust_per_uid_local_snapshot_post_mortem ()
428 {
429 NR_ITER=2000000
430 NR_USEC_WAIT=100
431
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 $TRACE_PATH
438
439 # Returns once the application has at least fired ONE tracepoint.
440 start_test_app
441 stop_test_apps
442
443 lttng_snapshot_record $SESSION_NAME
444 stop_lttng_tracing_ok $SESSION_NAME
445 destroy_lttng_session_ok $SESSION_NAME
446
447 # Validate test
448 validate_trace $EVENT_NAME $TRACE_PATH/
449 if [ $? -eq 0 ]; then
450 # Only delete if successful
451 rm -rf $TRACE_PATH
452 fi
453 }
454
455 function test_ust_local_snapshots ()
456 {
457 NR_ITER=2000000
458 NR_USEC_WAIT=100
459
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 $TRACE_PATH
466
467 # Returns once the application has at least fired ONE tracepoint.
468 start_test_app
469
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
474 # Validate test
475 validate_trace $EVENT_NAME $TRACE_PATH/
476 if [ $? -eq 0 ]; then
477 # Only delete if successful
478 rm -rf $TRACE_PATH
479 fi
480 done
481 stop_lttng_tracing_ok $SESSION_NAME
482 destroy_lttng_session_ok $SESSION_NAME
483
484 stop_test_apps
485 }
486
487 plan_tests $NUM_TESTS
488
489 print_test_banner "$TEST_DESC"
490
491 start_lttng_sessiond
492 tests=( test_ust_list_output
493 test_ust_local_snapshot
494 test_ust_local_snapshot_max_size
495 test_ust_per_uid_local_snapshot
496 test_ust_per_uid_local_snapshot_post_mortem
497 test_ust_local_snapshot_large_metadata
498 test_ust_local_snapshots
499 test_ust_local_snapshot_small_discard_buffers
500 test_ust_local_snapshot_small_overwrite_buffers
501 )
502
503 for fct_test in ${tests[@]};
504 do
505 SESSION_NAME=$(randstring 16 0)
506 ${fct_test}
507 done
508
509 stop_lttng_sessiond
This page took 0.038583 seconds and 3 git commands to generate.