feat: persist workflow signals and arbitrate poll completion
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user