feat: persist workflow controls and settle stopped branches
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
-- 独立保存首次停止意图,避免进入核查后丢失用户取消/失败结清的目标;不增加外键。
|
||||
ALTER TABLE weave_instances
|
||||
ADD COLUMN stop_kind VARCHAR(16) CHARACTER SET ascii COLLATE ascii_bin NULL COMMENT '首次停止原因:CANCEL为用户取消,FAILURE为固定失败策略;为空表示尚未要求结清',
|
||||
ADD COLUMN stop_requested_at DATETIME(6) NULL COMMENT '首次停止意图的数据库时间,重报、进入核查或后来取消均不覆盖';
|
||||
|
||||
-- 历史取消保留原意图时间;旧失败结清及失败策略触发的核查保留原更新时间作为兼容边界。
|
||||
UPDATE weave_instances i SET stop_kind=CASE WHEN cancel_requested_at IS NOT NULL THEN 'CANCEL' ELSE 'FAILURE' END,
|
||||
stop_requested_at=COALESCE(cancel_requested_at,updated_at)
|
||||
WHERE state NOT IN ('SUCCEEDED','FAILED','CANCELLED') AND
|
||||
(cancel_requested_at IS NOT NULL OR state='CANCELLING' OR
|
||||
(JSON_UNQUOTE(JSON_EXTRACT(policy_snapshot,'$.failure_policy'))='FAIL_AFTER_SETTLED' AND EXISTS
|
||||
(SELECT 1 FROM weave_steps s WHERE s.namespace_id=i.namespace_id AND s.workflow_id=i.id AND s.`key`<>'$root' AND s.state IN ('FAILED','CANCELLED','NEEDS_REVIEW'))));
|
||||
|
||||
ALTER TABLE weave_instances
|
||||
ADD CONSTRAINT ck_workflow_stop_intent CHECK ((stop_kind IS NULL AND stop_requested_at IS NULL) OR (stop_kind IS NOT NULL AND stop_kind IN ('CANCEL','FAILURE') AND stop_requested_at IS NOT NULL));
|
||||
|
||||
-- 结清复用根检查点,已有根只提前检查,不更改固定版本、原预算和截止。
|
||||
INSERT INTO weave_pending_advances(namespace_id,id,workflow_id,step_id,expected_step_revision,checkpoint,available_at)
|
||||
SELECT i.namespace_id,RANDOM_BYTES(16),i.id,s.id,s.revision,JSON_OBJECT('schema_version',1,'kind','ROOT'),UTC_TIMESTAMP(6)
|
||||
FROM weave_instances i JOIN weave_steps s ON s.namespace_id=i.namespace_id AND s.workflow_id=i.id AND s.`key`='$root'
|
||||
JOIN weave_activations a ON a.namespace_id=s.namespace_id AND a.workflow_id=s.workflow_id AND a.step_id=s.id AND a.id=s.current_activation_id
|
||||
WHERE i.stop_kind IS NOT NULL AND i.state NOT IN ('SUCCEEDED','FAILED','CANCELLED') AND s.state='ACTIVE' AND a.state='ACTIVE'
|
||||
ON DUPLICATE KEY UPDATE available_at=LEAST(weave_pending_advances.available_at,VALUES(available_at));
|
||||
|
||||
UPDATE pulse_execution_gates g JOIN weave_instances i ON i.namespace_id=g.namespace_id AND i.gate_id=g.id
|
||||
SET g.paused=TRUE,g.revision=g.revision+1,g.updated_at=UTC_TIMESTAMP(6)
|
||||
WHERE i.stop_kind IS NOT NULL AND i.state NOT IN ('SUCCEEDED','FAILED','CANCELLED') AND g.paused=FALSE;
|
||||
|
||||
-- 反向核对流程所有者,防止无外键时遗漏门控被误改的历史任务。
|
||||
ALTER TABLE pulse_tasks ADD KEY ix_task_workflow_owner (namespace_id,owner_kind,owner_id,gate_id,id);
|
||||
Reference in New Issue
Block a user