Commit 32c7859
fix(kernel-browser-runtime): unblock drain so reentrant RPC doesn't deadlock
The drain loop awaited each request handler before pulling the next
message, including responses. That serialization deadlocked any
request handler that fired an outbound RPC back to the other side and
awaited its response — the response could not be processed by the
drain until the request handler returned, but the request handler was
waiting for the response.
This bit the new `onIncarnationChange` callback the transport invokes
during the handshake: kernel-worker sends `sendRemoteMessage` →
offscreen runs the handler → handshake calls `onIncarnationChange` RPC
back to kernel-worker → kernel-worker returns a verdict → response
arrives at offscreen but its drain is still awaiting the original
request handler. Hung until the 40s URL redemption timeout.
Fix: dispatch request handlers in the background (no await inside the
drain). Responses still process synchronously. Apply on both sides
since either drain can hit the same shape.
The new `onIncarnationChange` round-trip during every handshake makes
this latent issue actually surface in the e2e — the original
asymmetry (kernel-worker drain rarely blocked, offscreen drain
frequently blocked while sendRemoteMessage was in flight) is what
made it hide for so long.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 812f84e commit 32c7859
2 files changed
Lines changed: 65 additions & 33 deletions
Lines changed: 29 additions & 16 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
415 | 416 | | |
416 | 417 | | |
417 | 418 | | |
418 | | - | |
419 | | - | |
420 | | - | |
421 | | - | |
422 | | - | |
423 | | - | |
424 | | - | |
425 | | - | |
426 | | - | |
427 | | - | |
428 | | - | |
429 | | - | |
430 | | - | |
431 | | - | |
432 | | - | |
433 | | - | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
434 | 447 | | |
435 | 448 | | |
436 | 449 | | |
| |||
Lines changed: 36 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
179 | 180 | | |
180 | 181 | | |
181 | 182 | | |
182 | | - | |
183 | | - | |
184 | | - | |
185 | | - | |
186 | | - | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
| 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 | + | |
199 | 218 | | |
200 | 219 | | |
201 | 220 | | |
| |||
0 commit comments