summaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/lttng/lttng-tools/0001-Fix-Tests-race-condition-in-test_event_tracker.patch
blob: 10020e1ecfcd060565d35cb0d780c40a3dbbf4ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
From d3392e4850532c02e53e3c3ff1cc27df7e51c941 Mon Sep 17 00:00:00 2001
From: Francis Deslauriers <francis.deslauriers@efficios.com>
Date: Tue, 7 Sep 2021 17:10:31 -0400
Subject: [PATCH 1/2] Fix: Tests: race condition in test_event_tracker
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Background
==========
The `test_event_tracker` file contains test cases when the event
generating app in executed in two distinct steps. Those two steps are
preparation and execution.
  1. the preparation is the launching the app in the background, and
  2. the execution is actually generating the event that should or
     should not be traced depending on the test case.

This is useful to test the tracker feature since we want to ensure that
already running apps are notified properly when changing their tracking
status.

Issue
=====
The `test_event_vpid_track_untrack` test case suffers from a race
condition that is easy to reproduce on Yocto.

The issue is that sometimes events are end up the trace when none is
expected.

This is due to the absence of synchronization point at the launch of the
app which leads to the app being scheduled in-between the track-untrack
calls leading to events being recorded to the trace.

It's easy to reproduce this issue on my machine by adding a `sleep 5`
between the track and untrack calls and setting the `NR_USEC_WAIT`
variable to 1.

Fix
===
Using the testapp `--sync-before-last-event-touch` flag to make the app
create a file when all but the last event are executed. We then have the
app wait until we create a file (`--sync-before-last-event`) to generate
that last event. This way, we are sure no event will be generated when
running the track and untrack commands.

Notes
=====
- This issue affects other test cases in this file.
- This commit fixes a typo in the test header.
- This commit adds `diag` calls to help tracking to what test the output
  relates to when reading the log.

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ia2b68128dc9a805526f9748f31ec2c2d95566f31
Upstream-Status: Backport
Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
---
 .../tools/tracker/test_event_tracker          | 56 ++++++++++++++-----
 1 file changed, 42 insertions(+), 14 deletions(-)

diff --git a/tests/regression/tools/tracker/test_event_tracker b/tests/regression/tools/tracker/test_event_tracker
index feb3787..cc0f698 100755
--- a/tests/regression/tools/tracker/test_event_tracker
+++ b/tests/regression/tools/tracker/test_event_tracker
@@ -5,7 +5,7 @@
 #
 # SPDX-License-Identifier: GPL-2.0-only
 
-TEST_DESC="LTTng - Event traker test"
+TEST_DESC="LTTng - Event tracker test"
 
 CURDIR=$(dirname "$0")/
 TESTDIR="$CURDIR/../../.."
@@ -15,7 +15,7 @@ TESTAPP_KERNEL_NAME="gen-kernel-test-events"
 TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
 TESTAPP_KERNEL_BIN="$TESTAPP_PATH/$TESTAPP_KERNEL_NAME/$TESTAPP_KERNEL_NAME"
 SESSION_NAME="tracker"
-NR_ITER=100
+NR_ITER=1
 NUM_GLOBAL_TESTS=2
 NUM_UST_TESTS=283
 NUM_KERNEL_TESTS=462
@@ -30,27 +30,41 @@ SCRIPT_GROUPNAME="$(id -gn)"
 
 CHILD_PID=-1
 WAIT_PATH=
-AFTER_FIRST_PATH=
-BEFORE_LAST_PATH=
+TOUCH_BEFORE_LAST_PATH=
+SYNC_BEFORE_LAST_PATH=
 
 source $TESTDIR/utils/utils.sh
 
+# Launch the testapp and execute it up until right before the last event. It is
+# useful to do it in two seperate steps in order to test tracking and
+# untracking on an active app.
 function prepare_ust_app
 {
-	AFTER_FIRST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_sync_after_first.XXXXXX)
-	BEFORE_LAST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_sync_before_last.XXXXXX)
+	TOUCH_BEFORE_LAST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_touch_before_last.XXXXXX)
+	SYNC_BEFORE_LAST_PATH=$(mktemp --tmpdir -u tmp.${FUNCNAME[0]}_sync_before_last.XXXXXX)
+
+	$TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT \
+		--sync-before-last-event-touch "$TOUCH_BEFORE_LAST_PATH" \
+		--sync-before-last-event "$SYNC_BEFORE_LAST_PATH" &
 
-	$TESTAPP_BIN -i $NR_ITER -w $NR_USEC_WAIT -a "$AFTER_FIRST_PATH" -b "$BEFORE_LAST_PATH" &
 	CHILD_PID=$!
+
+	# Wait for the app to execute all the way to right before the last
+	# event.
+	while [ ! -f "${TOUCH_BEFORE_LAST_PATH}" ]; do
+		sleep 0.5
+	done
 }
 
+# Generate the last event.
 function trace_ust_app
 {
-	touch "$BEFORE_LAST_PATH"
-	wait
+	# Ask the test app to generate the last event.
+	touch "$SYNC_BEFORE_LAST_PATH"
+	wait "$CHILD_PID"
 	ok $? "Traced application stopped."
-	rm "$BEFORE_LAST_PATH"
-	rm "$AFTER_FIRST_PATH"
+	rm "$SYNC_BEFORE_LAST_PATH"
+	rm "$TOUCH_BEFORE_LAST_PATH"
 }
 
 function prepare_kernel_app
@@ -64,7 +78,7 @@ function prepare_kernel_app
 function trace_kernel_app
 {
 	touch "$WAIT_PATH"
-	wait
+	wait "$CHILD_PID"
 	ok $? "Traced application stopped."
 	rm "$WAIT_PATH"
 }
@@ -78,6 +92,8 @@ function test_event_tracker()
 	local tracker="$4"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -117,6 +133,8 @@ function test_event_vpid_tracker()
 	local wildcard="$3"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -160,6 +178,8 @@ function test_event_pid_tracker()
 	local wildcard="$3"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -203,6 +223,8 @@ function test_event_tracker_fail()
 	local wildcard="$2"
 	local tracker="$3"
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -222,6 +244,8 @@ function test_event_track_untrack()
 	local tracker="$4"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -262,6 +286,8 @@ function test_event_vpid_track_untrack()
 	local wildcard="$3"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -302,6 +328,8 @@ function test_event_pid_track_untrack()
 	local wildcard="$3"
 	local channel=''
 
+	diag "${FUNCNAME[0]} $*"
+
 	trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path"
@@ -336,9 +364,9 @@ function test_event_pid_track_untrack()
 
 function test_event_ust_vpid_untrack_snapshot()
 {
-	local trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
+	diag "${FUNCNAME[0]} $*"
 
-	diag "Test_event_ust_vpid_untrack_snapshot"
+	local trace_path=$(mktemp --tmpdir -d tmp.${FUNCNAME[0]}_trace_path.XXXXXX)
 
 	create_lttng_session_ok $SESSION_NAME "$trace_path" "--snapshot"
 
-- 
2.20.1