Skip to content

fix: serialize normalized stage lock cleanup - #12

Merged
PureSaber merged 1 commit into
mainfrom
fix/windows-stage-owner-race
Aug 31, 2026
Merged

fix: serialize normalized stage lock cleanup#12
PureSaber merged 1 commit into
mainfrom
fix/windows-stage-owner-race

Conversation

@PureSaber

Copy link
Copy Markdown
Owner

根因

_streaming_stage在释放每个stage owner文件锁后立即删除锁文件。另一个并发流可能已打开同一路径并等待锁:Windows会因打开句柄返回WinError 32,POSIX则可能在同名路径上重新创建不同inode,破坏互斥语义。该竞态使正常的8流capture测试随机进入PAUSED->RESYNC非法迁移,并令默认分支CI失败。

修复

  • 增加稳定的.stage-owners/.gc.lock,串行化stale扫描、孤儿owner清理和owner文件删除。
  • 保持每个活动stage的独立owner锁;GC无法取得活动owner时继续fail-safe跳过。
  • 清理崩溃遗留且已无对应stage的owner文件,避免永久累积。
  • 增加结构性回归测试,强制所有owner删除都必须发生在GC锁持有期间。

验证

  • 修复前:目标并发测试在连续运行第3~4轮复现失败。
  • 修复后:同一目标测试连续10/10轮通过。
  • 完整测试:480 passed, 1 skipped。
  • 分支覆盖率:normalized_v3.py 90.93%,全包87.84%,全部门禁通过。
  • ruff checkruff format --check通过。

不改变任何release tag或发布清单。

@PureSaber
PureSaber merged commit e771eda into main Aug 31, 2026
3 checks passed
@PureSaber
PureSaber deleted the fix/windows-stage-owner-race branch August 31, 2026 14:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants