848fc2f3ee319fa887325ba8181b19969a999733
[lttng-tools.git] / tests / regression / ust / periodical-metadata-flush / test_periodical_metadata_flush
1 #!/bin/bash
2 #
3 # Copyright (C) 2012 David Goulet <dgoulet@efficios.com>
4 #
5 # SPDX-License-Identifier: LGPL-2.1-only
6
7 TEST_DESC="UST tracer - Tracing with per UID buffers and periodical flush"
8
9 CURDIR=$(dirname $0)/
10 TESTDIR=$CURDIR/../../..
11 NR_ITER=100
12 NR_USEC_WAIT=100000
13 TESTAPP_PATH="$TESTDIR/utils/testapp"
14 TESTAPP_NAME="gen-ust-events"
15 TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
16 SESSION_NAME="periodical-flush"
17 EVENT_NAME="tp:tptest"
18 BIN_NAME="gen-nevents"
19 NUM_TESTS=38
20 APP_TMP_FILE=$(mktemp -u)
21 APPS_PID=
22
23 source $TESTDIR/utils/utils.sh
24
25 if [ ! -x "$TESTAPP_BIN" ]; then
26 BAIL_OUT "No UST events binary detected."
27 fi
28
29 # MUST set TESTDIR before calling those functions
30
31 function enable_channel_per_uid()
32 {
33 local sess_name=$1
34 local channel_name=$2
35
36 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-uid -u $channel_name -s $sess_name --switch-timer 100000 >/dev/null 2>&1
37 ok $? "Enable channel $channel_name per UID for session $sess_name"
38 }
39
40 function enable_channel_per_pid()
41 {
42 local sess_name=$1
43 local channel_name=$2
44
45 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name --switch-timer 100000 >/dev/null 2>&1
46 ok $? "Enable channel $channel_name per UID for session $sess_name"
47 }
48
49 function enable_metadata_per_uid()
50 {
51 local sess_name=$1
52 local channel_name="metadata"
53
54 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-uid -u $channel_name -s $sess_name --switch-timer 200000 >/dev/null 2>&1
55 ok $? "Enable channel $channel_name per UID for session $sess_name"
56 }
57
58 function enable_metadata_per_pid()
59 {
60 local sess_name=$1
61 local channel_name="metadata"
62
63 $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name --switch-timer 200000 >/dev/null 2>&1
64 ok $? "Enable channel $channel_name per PID for session $sess_name"
65 }
66
67 function validate_trace()
68 {
69 local out
70
71 out=$(babeltrace $TRACE_PATH | grep $EVENT_NAME | wc -l)
72 if [ $out -eq 0 ]; then
73 fail "Trace validation"
74 diag "No event(s) found. We are supposed to have at least one."
75 out=1
76 else
77 pass "Trace validation"
78 diag "Found $out event(s). Coherent."
79 out=0
80 fi
81
82 return $out
83 }
84
85 function check_app_tmp_file()
86 {
87 # Wait for the application file to appear indicating that at least one
88 # tracepoint has been fired.
89 while [ ! -f "$APP_TMP_FILE" ]; do
90 sleep 0.5
91 done
92 diag "Removing test app temporary file $APP_TMP_FILE"
93 rm -f $APP_TMP_FILE
94 }
95
96 function start_trace_app()
97 {
98 # Start application with a temporary file.
99 $TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT --sync-after-first-event $APP_TMP_FILE &
100 ret=$?
101 APPS_PID="${APPS_PID} ${!}"
102 ok $ret "Start application to trace"
103 }
104
105 function start_check_trace_app()
106 {
107 start_trace_app
108 check_app_tmp_file
109 }
110
111
112 function wait_trace_apps()
113 {
114 for p in ${APPS_PID}; do
115 wait ${p} 2>/dev/null
116 done
117 APPS_PID=
118 }
119
120 test_after_app_pid() {
121 local out
122
123 APPS_PID=
124
125 diag "Start application AFTER tracing is started"
126
127 create_lttng_session_ok $SESSION_NAME $TRACE_PATH
128 enable_metadata_per_pid $SESSION_NAME
129 enable_channel_per_pid $SESSION_NAME "channel0"
130 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
131 start_lttng_tracing_ok $SESSION_NAME
132
133 # Start application after tracing
134 start_check_trace_app
135 # After this point we are sure that at least one event has been hit.
136
137 # Make sure the application does not generate any more data,
138 # thus ensuring that we are not flushing a packet concurrently
139 # with validate_trace.
140 for p in ${APPS_PID}; do
141 kill -s SIGSTOP ${p}
142 done
143
144 # Give time to the consumer to write inflight data.
145 sleep 2
146
147 validate_trace
148 out=$?
149
150 for p in ${APPS_PID}; do
151 kill -s SIGKILL ${p}
152 wait ${p} 2>/dev/null
153 done
154 stop_lttng_tracing_ok $SESSION_NAME
155 destroy_lttng_session_ok $SESSION_NAME
156
157 wait_trace_apps
158
159 return $out
160 }
161
162 test_before_app_pid() {
163 local out
164 local tmp_file="/tmp/lttng_test_ust.42.file"
165
166 APPS_PID=
167
168 diag "Start application BEFORE tracing is started"
169
170 start_trace_app
171
172 # Start application before tracing
173 create_lttng_session_ok $SESSION_NAME $TRACE_PATH
174 enable_metadata_per_pid $SESSION_NAME
175 enable_channel_per_pid $SESSION_NAME "channel0"
176 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
177 start_lttng_tracing_ok $SESSION_NAME
178
179 check_app_tmp_file
180 # Let the application at least perform a flush!
181 sleep 2
182
183 # Make sure the application does not generate any more data,
184 # thus ensuring that we are not flushing a packet concurrently
185 # with validate_trace.
186 for p in ${APPS_PID}; do
187 kill -s SIGSTOP ${p}
188 done
189
190 # Give time to the consumer to write inflight data.
191 sleep 2
192
193 validate_trace
194 out=$?
195
196 for p in ${APPS_PID}; do
197 kill -s SIGKILL ${p}
198 wait ${p} 2>/dev/null
199 done
200
201 stop_lttng_tracing_ok $SESSION_NAME
202 destroy_lttng_session_ok $SESSION_NAME
203
204 wait_trace_apps
205
206 return $out
207 }
208
209 test_after_app_uid() {
210 local out
211
212 APPS_PID=
213
214 diag "Start application AFTER tracing is started"
215
216 create_lttng_session_ok $SESSION_NAME $TRACE_PATH
217 enable_metadata_per_uid $SESSION_NAME
218 enable_channel_per_uid $SESSION_NAME "channel0"
219 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
220 start_lttng_tracing_ok $SESSION_NAME
221
222 # Start application after tracing
223 start_check_trace_app
224 # After this point we are sure that at least one event has been hit.
225
226 # Make sure the application does not generate any more data,
227 # thus ensuring that we are not flushing a packet concurrently
228 # with validate_trace.
229 for p in ${APPS_PID}; do
230 kill -s SIGSTOP ${p}
231 done
232
233
234 # Give time to the consumer to write inflight data.
235 sleep 2
236
237 validate_trace
238 out=$?
239
240 for p in ${APPS_PID}; do
241 kill -s SIGKILL ${p}
242 wait ${p} 2>/dev/null
243 done
244 stop_lttng_tracing_ok $SESSION_NAME
245 destroy_lttng_session_ok $SESSION_NAME
246
247 wait_trace_apps
248
249 return $out
250 }
251
252 test_before_app_uid() {
253 local out
254
255 APPS_PID=
256
257 diag "Start application BEFORE tracing is started"
258
259 # Start application before tracing
260 start_trace_app
261
262 create_lttng_session_ok $SESSION_NAME $TRACE_PATH
263 enable_metadata_per_uid $SESSION_NAME
264 enable_channel_per_uid $SESSION_NAME "channel0"
265 enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
266 start_lttng_tracing_ok $SESSION_NAME
267
268 check_app_tmp_file
269 # Let the application at least perform a flush!
270 sleep 2
271
272 # Make sure the application does not generate any more data,
273 # thus ensuring that we are not flushing a packet concurrently
274 # with validate_trace.
275 for p in ${APPS_PID}; do
276 kill -s SIGSTOP ${p}
277 done
278
279 # Give time to the consumer to write inflight data.
280 sleep 2
281
282 validate_trace
283 out=$?
284
285 for p in ${APPS_PID}; do
286 kill -s SIGKILL ${p}
287 wait ${p} 2>/dev/null
288 done
289 stop_lttng_tracing_ok $SESSION_NAME
290 destroy_lttng_session_ok $SESSION_NAME
291
292 wait_trace_apps
293
294 return $out
295 }
296
297 # MUST set TESTDIR before calling those functions
298 plan_tests $NUM_TESTS
299
300 print_test_banner "$TEST_DESC"
301
302 TESTS=(
303 "test_before_app_uid"
304 "test_after_app_uid"
305 "test_before_app_pid"
306 "test_after_app_pid"
307 )
308
309 TEST_COUNT=${#TESTS[@]}
310 i=0
311
312 start_lttng_sessiond
313
314 while [ $i -lt $TEST_COUNT ]; do
315 TRACE_PATH=$(mktemp -d)
316 ${TESTS[$i]}
317 rm -rf $TRACE_PATH
318 let "i++"
319 done
320
321 stop_lttng_sessiond
This page took 0.035363 seconds and 3 git commands to generate.