Commit 2e889ff
committed
@mrcfps 7-30 non-blocking follow-up评审指出:purgeRunsForProject 先抓
runs.values() snapshot,再 await per-run cancel。在 await 窗口期间为本
项目新建的 run 不在 snapshot,不会被 tombstone;它的 state.json 仍然
指向该项目,后续的 removeProjectRunDirs 只看 state.projectId ===
target 就会把这个活 run 的目录删掉——活 run 还在跑,但 state.json 没
了,后续 persistState mkdirs 又把目录写回,正好重复我们刚消除的 #6117
orphan 场景。
修复:
1. apps/daemon/src/runtimes/runs.ts
- purgeRunsForProject: 返回值改为 { tombstoned, protectedRunIds },
让 caller 可以拿到后续 in-memory 仍然 live 的 run ids 而不必再查
一次 map。protectedRunIds 在 await cancel 之后重新扫一次
runs.values() 得到(persistsDisabled === false 的本项目 run),
捕获 await 窗口期间新建的 late arrival。
- 新增 isLiveRun(runId): 同步查 in-memory map,返回 run 存在且未被
tombstone。暴露给 sweep caller 用作 shouldSkip 谓词。
2. apps/daemon/src/projects.ts
- removeProjectRunDirs: 新增第三个可选参数 { shouldSkip?: (runId)
=> boolean }。在 read state.json 之前先调 shouldSkip(runId),
返回 true 就跳过该目录,避免误删活 run 的 dir。注释里点明这是为
了保护 race 期间新建的 mid-flight run。
3. apps/daemon/src/routes/project/index.ts
- DELETE handler 把 shouldSkip: (runId) => design.runs.isLiveRun(runId)
传给 removeProjectRunDirs。这样 purge 之后 sweep 之前的窗口里出现
的新 run,只要它还在 in-memory map 里就能被识别并跳过。
- 注释里点明race motivation + #6202 follow-up 来源。
4. apps/daemon/tests/delete-sweeps-orphaned-run-dirs.test.ts
- 新增 regression:验证 removeProjectRunDirs 的 shouldSkip 行为:
先手动 purgeRunsForProject tombstone 掉一个 run,再造一个 late
arrival run,再调 removeProjectRunDirs 传 production 的
shouldSkip = (id) => runs.isLiveRun(id) 谓词。断言:
* orphan dirs (state.json projectId 匹配但 in-memory 没有该 run)
被正常清扫(2 个)
* late arrival run 的目录完好无损
* isLiveRun 对 late arrival true,对空字符串/orphan/已 tombstone
的 run 都 false
* 第二次 purgeRunsForProject 返回
{ tombstoned: [lateRun.id], protectedRunIds: [] }
* 空/undefined projectId 返回 { tombstoned: [], protectedRunIds: [] }
而非旧的 bare array
- 这条 regression锁住,mrcfps 后续 refactor 不会再让 race 期间的
新建 run 被静默清掉。
CHANGELOG:更新 #6117 fixed 条目,把 #6202 follow-up 一并交代清楚。
验证:
- pnpm vitest run tests/delete-sweeps-orphaned-run-dirs.test.ts → 5/5 pass
- pnpm vitest run tests/cancel-owned-runs.test.ts tests/delete-cancels-active-runs.test.ts → 6/6 pass
- NODE_OPTIONS=--max-old-space-size=1536 npx tsc -p tsconfig.json --noEmit → 0
- NODE_OPTIONS=--max-old-space-size=1536 npx tsc -p tsconfig.tests.json --noEmit → 0
1 parent bd54ec0 commit 2e889ff
5 files changed
Lines changed: 188 additions & 7 deletions
File tree
- apps/daemon
- src
- routes/project
- runtimes
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1358 | 1358 | | |
1359 | 1359 | | |
1360 | 1360 | | |
| 1361 | + | |
| 1362 | + | |
| 1363 | + | |
| 1364 | + | |
| 1365 | + | |
| 1366 | + | |
| 1367 | + | |
1361 | 1368 | | |
1362 | 1369 | | |
1363 | 1370 | | |
1364 | | - | |
| 1371 | + | |
| 1372 | + | |
| 1373 | + | |
| 1374 | + | |
| 1375 | + | |
1365 | 1376 | | |
| 1377 | + | |
1366 | 1378 | | |
1367 | 1379 | | |
1368 | 1380 | | |
| |||
1376 | 1388 | | |
1377 | 1389 | | |
1378 | 1390 | | |
| 1391 | + | |
| 1392 | + | |
| 1393 | + | |
| 1394 | + | |
| 1395 | + | |
| 1396 | + | |
| 1397 | + | |
1379 | 1398 | | |
1380 | 1399 | | |
1381 | 1400 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2279 | 2279 | | |
2280 | 2280 | | |
2281 | 2281 | | |
| 2282 | + | |
| 2283 | + | |
| 2284 | + | |
| 2285 | + | |
| 2286 | + | |
| 2287 | + | |
| 2288 | + | |
2282 | 2289 | | |
2283 | 2290 | | |
2284 | 2291 | | |
| |||
2287 | 2294 | | |
2288 | 2295 | | |
2289 | 2296 | | |
2290 | | - | |
| 2297 | + | |
| 2298 | + | |
| 2299 | + | |
| 2300 | + | |
| 2301 | + | |
2291 | 2302 | | |
2292 | 2303 | | |
2293 | 2304 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1076 | 1076 | | |
1077 | 1077 | | |
1078 | 1078 | | |
1079 | | - | |
1080 | | - | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
1081 | 1090 | | |
1082 | 1091 | | |
1083 | 1092 | | |
1084 | 1093 | | |
1085 | 1094 | | |
1086 | | - | |
| 1095 | + | |
1087 | 1096 | | |
1088 | 1097 | | |
1089 | 1098 | | |
| |||
1101 | 1110 | | |
1102 | 1111 | | |
1103 | 1112 | | |
1104 | | - | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
| 1122 | + | |
| 1123 | + | |
| 1124 | + | |
| 1125 | + | |
| 1126 | + | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
| 1132 | + | |
| 1133 | + | |
| 1134 | + | |
| 1135 | + | |
| 1136 | + | |
| 1137 | + | |
| 1138 | + | |
| 1139 | + | |
1105 | 1140 | | |
1106 | 1141 | | |
1107 | 1142 | | |
| |||
1175 | 1210 | | |
1176 | 1211 | | |
1177 | 1212 | | |
| 1213 | + | |
1178 | 1214 | | |
1179 | 1215 | | |
1180 | 1216 | | |
| |||
Lines changed: 115 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
277 | 277 | | |
278 | 278 | | |
279 | 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 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
280 | 395 | | |
0 commit comments