feat: persist workflow timers and bounded poll rounds

This commit is contained in:
2026-09-18 03:03:31 +08:00
parent f602a5ee05
commit e2baffbe37
21 changed files with 1201 additions and 28 deletions

View File

@@ -0,0 +1,20 @@
-- 为已有定时等待和查询补齐持久化唤醒;检查点只产生候选,运行器仍核验固定版本和全部归属。
-- 复用既有到期索引及步骤唯一键,不引入外键,也不重算原截止或重置轮次。
INSERT INTO weave_pending_advances(namespace_id,id,workflow_id,step_id,expected_step_revision,checkpoint,available_at)
SELECT s.namespace_id,RANDOM_BYTES(16),s.workflow_id,s.id,s.revision,
JSON_OBJECT('schema_version',1,'kind','TIMER','activation_id',LOWER(HEX(a.id))),w.deadline_at
FROM weave_steps s JOIN weave_activations a ON a.namespace_id=s.namespace_id AND a.id=s.current_activation_id AND a.workflow_id=s.workflow_id AND a.step_id=s.id
JOIN weave_instances i ON i.namespace_id=s.namespace_id AND i.id=s.workflow_id
JOIN weave_waits w ON w.namespace_id=s.namespace_id AND w.workflow_id=s.workflow_id AND w.activation_id=a.id
WHERE s.kind='TIMER' AND s.state='WAITING' AND a.state='WAITING' AND w.kind='TIMER' AND w.state='WAITING' AND i.state IN ('RUNNING','WAITING','CANCELLING','NEEDS_REVIEW')
ON DUPLICATE KEY UPDATE id=weave_pending_advances.id;
INSERT INTO weave_pending_advances(namespace_id,id,workflow_id,step_id,expected_step_revision,checkpoint,available_at)
SELECT s.namespace_id,RANDOM_BYTES(16),s.workflow_id,s.id,s.revision,
JSON_OBJECT('schema_version',1,'kind','POLL','activation_id',LOWER(HEX(a.id))),
CASE WHEN p.current_task_id IS NOT NULL THEN p.deadline_at ELSE COALESCE(p.next_poll_at,p.deadline_at) END
FROM weave_steps s JOIN weave_activations a ON a.namespace_id=s.namespace_id AND a.id=s.current_activation_id AND a.workflow_id=s.workflow_id AND a.step_id=s.id
JOIN weave_instances i ON i.namespace_id=s.namespace_id AND i.id=s.workflow_id
JOIN weave_poll_states p ON p.namespace_id=s.namespace_id AND p.workflow_id=s.workflow_id AND p.activation_id=a.id
WHERE s.kind='POLL' AND s.state IN ('ACTIVE','WAITING') AND a.state=s.state AND p.resolved_at IS NULL AND i.state IN ('RUNNING','WAITING','CANCELLING','NEEDS_REVIEW')
ON DUPLICATE KEY UPDATE id=weave_pending_advances.id;