feat: persist workflow signals and arbitrate poll completion

This commit is contained in:
2026-09-18 03:52:50 +08:00
parent e2baffbe37
commit 7d5ebfcb09
34 changed files with 1958 additions and 113 deletions

View File

@@ -0,0 +1,33 @@
-- 外部信号固定参数版本与目标激活代次;旧记录无此身份,不能推测为新等待的有效输入。
ALTER TABLE weave_signals
MODIFY COLUMN `type` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin NOT NULL COMMENT '固定定义中的信号名称,新受理限制为128个ASCII字符',
MODIFY COLUMN correlation_key VARBINARY(764) NOT NULL COMMENT '精确UTF8操作关联,保留尾部空格;新信号最多512字节,历史兼容764字节',
ADD COLUMN payload_version VARCHAR(32) CHARACTER SET ascii COLLATE ascii_bin NULL COMMENT '信号内容契约版本;为空仅表示未核实的历史记录',
ADD COLUMN target_activation_sequence INT UNSIGNED NULL COMMENT '固定目标步骤激活序号,早到首轮为1;为空仅表示未核实历史',
ADD COLUMN evidence_ref VARCHAR(512) NULL COMMENT '可选的受控证据引用;不保存秘密,也不由平台请求该地址',
ADD COLUMN disposition VARCHAR(64) CHARACTER SET ascii COLLATE ascii_bin NULL COMMENT '稳定消费或拒绝原因;PENDING时为空,不包含业务参数',
ADD COLUMN available_at DATETIME(6) NULL COMMENT '未匹配信号下次到期检查时间;故障退避可延后检查,但不改变原截止',
ADD KEY ix_signal_expiry (state,available_at,namespace_id,id),
ADD KEY ix_signal_activation (namespace_id,workflow_id,target_step_key,target_activation_sequence,state,accepted_at,id);
UPDATE weave_signals SET state='REJECTED',disposition='LEGACY_UNVERIFIED',revision=revision+1,updated_at=UTC_TIMESTAMP(6) WHERE state='PENDING';
UPDATE weave_signals SET available_at=expires_at;
ALTER TABLE weave_signals
MODIFY COLUMN available_at DATETIME(6) NOT NULL COMMENT '未匹配信号下次到期检查时间;故障退避可延后检查,但不改变原截止',
ADD CONSTRAINT ck_signal_version_sequence CHECK ((payload_version IS NULL AND target_activation_sequence IS NULL) OR (payload_version IS NOT NULL AND payload_version<>'' AND target_activation_sequence IS NOT NULL AND target_activation_sequence>0)),
ADD CONSTRAINT ck_signal_pending_identity CHECK (state<>'PENDING' OR (payload_version IS NOT NULL AND target_activation_sequence IS NOT NULL AND disposition IS NULL));
ALTER TABLE weave_waits
ADD COLUMN winner_signal_id BINARY(16) NULL COMMENT '胜出的外部信号标识;仅时间或查询结果结清时为空,所有者由同事务校验',
ADD UNIQUE KEY uq_wait_winner_signal (namespace_id,winner_signal_id);
-- SIGNAL到期扫描与TIMER/POLL共用待续表;旧元数据缺失的等待交给运行器核查,不凭空授权。
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','SIGNAL','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='SIGNAL' AND s.state='WAITING' AND a.state='WAITING' AND w.kind='SIGNAL' AND w.state='WAITING' AND i.state IN ('RUNNING','WAITING','CANCELLING','NEEDS_REVIEW')
ON DUPLICATE KEY UPDATE id=weave_pending_advances.id;