Repository navigation
Commit cbe732f
fix(android): Break the app start extension lock-ordering deadlock (#6007)
* fix(android): Break the app start extension lock-ordering deadlock
AppStartExtension held its own lock while calling finish() on the
extended span and on the standalone app.start transaction. Finishing
captures the transaction synchronously, which runs
PerformanceAndroidEventProcessor, which acquires the processor lock and
then calls back into isExtended() and getExtendedEndTime() -- taking the
extension lock in the opposite order.
Two threads is all it takes: the app calls Sentry.finishExtendedAppStart()
(extension lock held, waiting for the processor lock) just as the app
start deadline fires on the Sentry timer thread (processor lock held,
waiting for the extension lock). Both threads hang; if the app finishes
the extended app start on the main thread, that is an ANR.
Read the fields under the lock and finish outside it, so the extension
never holds its lock across a call that reenters the SDK. Span and
transaction finishing are already idempotent, so racing callers are safe.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* changelog
* fix(android): Keep the app start finish paths mutually exclusive
Moving finish() out of the extension lock let finishTransaction and
finishExtendedAppStart interleave. finishTransaction reads the extended
span's finish date to clamp the transaction end, so a span finishing in
the gap between that read and transaction.finish() captures the
transaction with an end earlier than its own child, and both paths could
enter SentryTracer.finish concurrently.
Serialize the two with a dedicated finishLock that the re-entrant
capture path never acquires, so the clamp and the finish are atomic
again without putting the processor lock back into a cycle with the
extension lock.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>1 parent 814017c commit cbe732f
3 files changed
Lines changed: 109 additions & 5 deletions
File tree
- sentry-android-core/src
- main/java/io/sentry/android/core
- test/java/io/sentry/android/core
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
37 | 41 | | |
38 | 42 | | |
39 | 43 | | |
| |||
108 | 112 | | |
109 | 113 | | |
110 | 114 | | |
111 | | - | |
112 | | - | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
113 | 121 | | |
114 | 122 | | |
115 | 123 | | |
| |||
145 | 153 | | |
146 | 154 | | |
147 | 155 | | |
148 | | - | |
149 | | - | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
150 | 168 | | |
151 | | - | |
152 | 169 | | |
153 | 170 | | |
154 | 171 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
11 | 14 | | |
12 | 15 | | |
13 | 16 | | |
| |||
17 | 20 | | |
18 | 21 | | |
19 | 22 | | |
| 23 | + | |
20 | 24 | | |
21 | 25 | | |
22 | 26 | | |
| |||
34 | 38 | | |
35 | 39 | | |
36 | 40 | | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
37 | 61 | | |
38 | 62 | | |
39 | 63 | | |
| |||
123 | 147 | | |
124 | 148 | | |
125 | 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 | + | |
126 | 212 | | |
127 | 213 | | |
128 | 214 | | |
| |||
0 commit comments