Commit 68b1e30
fix(webapp): close metadata-PUT parent/root race with drainer terminal-failure delete
When the metadata-PUT route's primary buffered mutation succeeded, the
route then did a second `findRunByIdWithMollifierFallback` read to
obtain `parentTaskRunFriendlyId` / `rootTaskRunFriendlyId` for fanning
out `body.parentOperations` and `body.rootOperations` to their
respective runs. If the drainer's terminal-failure path
(`buffer.fail`) ran between the primary mutation landing on the
snapshot and the second read — atomically marking FAILED and DELing
the entry hash — the second read returned null and the route
silently skipped the entire `routeOperationsToRun` fan-out. The
caller's parent/root operations were permanently lost even though
their primary metadata write had succeeded.
Move the parent/root id capture INSIDE
`applyMetadataMutationToBufferedRun` — its CAS read already loads
the snapshot, so it can extract the ids cheaply on any iteration of
its retry loop and surface them on the `applied` outcome. The route
then uses the outcome's captured ids directly without a second
buffer round trip, closing the race window.
FriendlyIds (not internal cuids) are surfaced because the consuming
`routeOperationsToRun` helper gates on the `run_…` prefix to decide
whether to attempt the buffer fallback; cuids would skip that path.
The snapshot's `parentTaskRunId` / `rootTaskRunId` are
engine-side cuids, so `RunId.toFriendlyId` converts them — identical
to what `readFallback.server.ts` does when assembling its
SyntheticRun.
Self-fallback to `runId` matches PG semantics: the PG service routes
to `taskRun.parentTaskRun?.id ?? taskRun.id` and equivalently for
root, so a top-level run's parent/root ops land on itself rather
than being silently dropped.
Devin follow-up on PR #3756.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 9d861d2 commit 68b1e30
3 files changed
Lines changed: 138 additions & 31 deletions
File tree
- apps/webapp
- app
- routes
- v3/mollifier
- test
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
204 | 204 | | |
205 | 205 | | |
206 | 206 | | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
236 | 235 | | |
237 | 236 | | |
238 | 237 | | |
| |||
Lines changed: 48 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
7 | 24 | | |
8 | | - | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
9 | 31 | | |
10 | 32 | | |
11 | 33 | | |
| |||
68 | 90 | | |
69 | 91 | | |
70 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
71 | 112 | | |
72 | 113 | | |
73 | 114 | | |
| |||
126 | 167 | | |
127 | 168 | | |
128 | 169 | | |
129 | | - | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
130 | 176 | | |
131 | 177 | | |
132 | 178 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
7 | 8 | | |
8 | 9 | | |
9 | 10 | | |
| |||
261 | 262 | | |
262 | 263 | | |
263 | 264 | | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
264 | 326 | | |
265 | 327 | | |
266 | 328 | | |
| |||
0 commit comments