文章

MiguDelay 架构 08:TaskSession 状态机

MiguDelay(DDLive)项目架构系列文档:TaskSession 状态机。内容基于 2026-08-04 对指定重构分支的源码扫描结果整理。

MiguDelay 架构 08:TaskSession 状态机

系列导航系列总览 · 上一篇:MiguDelay 架构 07:任务准入与公开垫片门 · 下一篇:MiguDelay 架构 09:TaskOrchestrator 编排

扫描基线

  • 项目:MiguDelay(DDLive)
  • 分支:refactor/video-frame-provider
  • HEAD:d28ec061406e4e3df93e3d1a92478d71a9ad4908
  • 工作树:clean
  • 扫描日期:2026-08-04
  • 说明:内容以当前 HEAD 源码为准;仓库旧架构文档只作为检索线索。

1. 定位

TaskSession 是无 QObject、无 I/O 的纯状态机,是任务 phase、identity、generation、restart intent 和 stop barrier 的唯一真值。

2. 状态机

stateDiagram-v2
    [*] --> Idle
    Idle --> Starting: start
    Starting --> Running: markRunning
    Starting --> Restarting: beginRestart
    Running --> Restarting: beginRestart
    Starting --> Stopping: beginStop
    Running --> Stopping: beginStop
    Restarting --> Stopping: explicitStop
    Failed --> Stopping: cleanup
    Stopping --> Idle: stopBarrierSuccess
    Stopping --> Failed: stopBarrierFailure
    Restarting --> Starting: restartBarrierSuccess
    Starting --> Failed: startFailure
    Running --> Failed: runtimeFailure

3. generation

  • start() 从 Idle 分配非零 generation。
  • beginRestart() 立即分配新 generation,使旧结果失效。
  • 0 永远表示 invalid。
  • generation 校验优先于 ticket/phase,旧结果不能消耗当前 barrier。

4. Stop Barrier

Barrier 保存具体 ticket 集,而非简单计数:

1
2
3
4
5
requiredTickets
completedTickets
failureSeen
submissionFailureSeen
purpose = Stop or Restart
flowchart TD
    B["Arm barrier with real tickets"] --> R["Receive async result"]
    R --> G{"Generation current"}
    G -->|no| STALE["Return stale"]
    G -->|yes| T{"Ticket required"}
    T -->|no| UNKNOWN["Unknown ticket"]
    T -->|yes| D{"Already completed"}
    D -->|yes| DUP["Duplicate"]
    D -->|no| ADD["Mark completed and aggregate failure"]
    ADD --> ALL{"All required tickets complete"}
    ALL -->|no| WAIT["Pending"]
    ALL -->|yes| END["Choose terminal state"]

5. 返回状态

  • Applied
  • Pending
  • Completed
  • Rejected
  • Stale
  • Duplicate
  • UnknownTicket

Orchestrator 根据状态决定下一步,不能把所有 false 当成同一种失败。

6. 关键规则

  • Failed 不能直接 start,必须先清理。
  • Stopping 中重复 stop 不重装 barrier。
  • ticket 0 不入 required set,由 submission failure 标记。
  • restart barrier 成功后 pending identity 提升为 current。
  • restart barrier 失败不启动 pending task。

7. 类调用

1
2
3
4
5
6
7
8
9
TaskOrchestrator
  -> TaskSession.start
  -> TaskSession.markRunning
  -> TaskSession.beginRestart
  -> TaskSession.beginStop
  -> TaskSession.armStopBarrier
  -> TaskSession.completeStop
  -> TaskSession.fail
  -> TaskSession.state

8. 源码证据

  • src/code/module/playback/session/tasksession.*
  • tests/task_session/task_session_test.cpp

系列导航系列总览 · 上一篇:MiguDelay 架构 07:任务准入与公开垫片门 · 下一篇:MiguDelay 架构 09:TaskOrchestrator 编排

本文由作者按照 CC BY 4.0 进行授权