Skip to content

[BUG][OPT-25] 调度管理器注册应与 shutdown 原子互斥 #216

Open

Description

@Aias00

总览:#180

代码依据

问题与验收

registerTask 在获取写锁前检查 shutdown,之后才加锁写入 activeTasks;shutdown 在同一写锁下清空任务并关闭 scheduler。可能出现注册线程先检查通过、shutdown 完成、注册线程再向已关闭 manager 写入的交错。

范围与验收

  • 构造可控交错验证 shutdown 完成后无新任务进入 activeTasks;不能只重复跑概率性压力测试。
  • 在同一同步边界内完成运行状态检查与注册;关闭开始后明确拒绝或按已定义准入规则处理。
  • 并发注册/注销/shutdown 保持幂等,无遗留记录、死锁或持锁回调造成的不可控阻塞。
  • 验证 close 期间任务 stop 回调和 manager 注销的重入路径,不能简单换锁而引入死锁。
  • 保持自定义 ScheduledAgentManager 契约和既有任务清理,明确拒绝异常及消费者影响。
  • 与 OPT-23/24 协调局部生命周期修复;不重复 [P1B][T10] 增加整 Run 持久化执行器与租约作用域接入 #124 持久化执行或 Extensions chore(deps): bump io.modelcontextprotocol.sdk:mcp-bom from 2.0.0 to 2.0.1 #16 调度去重。

现有 singleton 的可重用/重建策略仅作相关约束记录,本单不扩展为全局容器重写。

验证与兼容约束

Core 基线 f45b2cf。当前为静态代码分析,尚未运行本单针对性复现。先补有意义的行为测试,优先局部修复;公共 API/输出/调度语义变化需说明收益、影响、兼容替代、迁移成本及目标版本。修复不等待 Agent/Workflow/Loop 全局重构。

关联任务

Activity

  1. konlue commented on Nov 14, 2026

    @konlue
    Contributor

    您好,我想认领 #216。

    方案(根因定位在 DefaultScheduledAgentManager.registerTask,实际模块为 argi-orchestration/argi-workflow-graph-core,issue 链接的 argi-graph-core 路径是旧布局)

    • 根因:registerTask 的 shutdown 检查在写锁之外,检查通过后线程可被抢占;shutdown() 在同一写锁内停全部任务、清空 activeTasks、关 scheduler 并置标志后,注册线程再拿锁插入——任务滞留在已关闭 manager 里,永不停止且 getActiveTaskCount() 不归零。
    • 修复:保留锁外快速检查,并在写锁临界区内复查 shutdown。shutdown() 置标志就在这同一把写锁内,两者构成原子互斥。不换锁类型——shutdown 持锁回调 task.stop() 会重入 unregisterTask 的写锁,可重入性必须保持。
    • 契约文档化:ScheduledAgentManager.registerTask javadoc 补 @throws IllegalStateException——关闭开始后的注册(含与进行中 shutdown 交错的注册)必须被拒绝,不留滞留记录。
    • 测试缝:DefaultScheduledAgentManager 增加包私有构造器注入 TaskScheduler(eager 单例不可复活,真实 scheduler 无法驱动确定性交错测试)。

    测试(新 ScheduledAgentManagerShutdownMutexTest,确定性交错、非概率压测)

    • shutdown 期间通过锁外检查的注册不得进入 activeTasks:shutdown 线程持写锁停在 stop 回调(STOPPED 监听器 latch 阻塞),注册线程经 task.getName() 可控缝隙在旧代码下确认通过锁外检查后阻塞在锁上;放行 shutdown 完成后,旧代码滞留注册(修复前红),新代码被锁内复查拒绝、计数归零。
    • 关闭完成后的注册被明确拒绝且无残留。
    • 并发 stop 与 shutdown 保持幂等:多线程交错结束后无残留记录、所有任务停止。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions