mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-13 22:25:37 +08:00
- 修复 MicrosoftDiContainer 在并发 Dispose 场景下可能重复执行底层读写锁销毁的问题 - 补充 IocContainerLifetimeTests 回归用例以覆盖并发释放时的单次锁销毁约束 - 更新 microsoft-di-container-disposal 追踪文档记录剩余 PR review 处理结果
3.4 KiB
3.4 KiB
Microsoft DI Container Disposal 跟踪
目标
围绕 PR #330 收敛 MicrosoftDiContainer 的释放契约、并发释放竞态,以及 GFramework.Cqrs.Benchmarks 的宿主清理鲁棒性。
当前恢复点
- 恢复点编号:
MICROSOFT-DI-DISPOSAL-RP-001 - 当前阶段:
Phase 1 - 当前 PR 锚点:
PR #330 - 当前结论:
$gframework-pr-review已确认 latest-head review 仍存在 5 条 open AI thread,其中IIocContainer文档契约、MicrosoftDiContainer.Clear()的不可达释放逻辑、Dispose()并发竞态,以及 benchmarkCleanup()缺乏异常隔离均已在本地补齐CodeRabbit关于GFramework.Cqrs.Benchmarks的 cleanup 问题虽然标在单个文件上,但同类模式实际覆盖RequestBenchmarks、NotificationBenchmarks、RequestPipelineBenchmarks、RequestStartupBenchmarks、StreamingBenchmarks、RequestInvokerBenchmarks、StreamInvokerBenchmarks,当前已通过共享 helper 一次性收敛MicrosoftDiContainer.Dispose()现会先对外发布_disposed状态并释放写锁,让等待线程统一抛出容器级ObjectDisposedException;随后仅在锁静默后才销毁底层ReaderWriterLockSlim- 针对剩余的
greptileP1,本轮进一步将底层锁销毁收敛为单次执行,避免两个并发Dispose()调用都进入DisposeLockWhenQuiescent()时触发双重ReaderWriterLockSlim.Dispose()
当前活跃事实
- 当前分支:
fix/microsoft-di-container-disposal - 当前分支对应
PR #330,状态为OPEN - 已决定的最小修复面:
GFramework.Core.Abstractions/Ioc/IIocContainer.csGFramework.Core/Ioc/MicrosoftDiContainer.csGFramework.Core.Tests/Ioc/IocContainerLifetimeTests.csGFramework.Core.Tests/Ioc/MicrosoftDiContainerTests.csGFramework.Cqrs.Benchmarks/Messaging/*.cs的 7 个 benchmark cleanup
当前风险
- 若极端情况下存在长时间不退出的遗留 waiter,
DisposeLockWhenQuiescent()会在有限自旋后跳过底层锁销毁并记录警告,以优先保证Dispose()不被无限阻塞 - 并发释放回归测试依赖对内部
_lock的反射访问,需要保持断言目标明确,避免把实现细节暴露成对外契约
最近权威验证
python3 .agents/skills/gframework-pr-review/scripts/fetch_current_pr_review.py --json-output /tmp/gframework-current-pr-review.json- 结果:通过
- 备注:确认当前分支对应
PR #330,open AI review 重点已收敛到释放契约、并发竞态和 benchmark cleanup
python3 scripts/license-header.py --check- 结果:通过
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~IocContainerLifetimeTests|FullyQualifiedName~MicrosoftDiContainerTests"- 结果:通过,
57/57passed
- 结果:通过,
dotnet build GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release- 结果:通过,
0 warning / 0 error
- 结果:通过,
待补最新验证
dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter "FullyQualifiedName~IocContainerLifetimeTests"dotnet build GFramework.Core/GFramework.Core.csproj -c Release
下一推荐步骤
- 运行
IocContainerLifetimeTests与GFramework.CoreRelease build,确认单次锁销毁修复没有引入新的 warning 或回归 - 再次运行
$gframework-pr-review或检查生成的 JSON,确认当前 latest-head open threads 是否只剩待推送的 GitHub 状态差异