Files
orbit/internal/storage/mysql/migrations/000009_queue_resources.up.sql

16 lines
1.3 KiB
SQL

-- 停止旧服务后迁移;未终结任务包含等待、预占、运行和待核查,不能因重试重复计数。
-- 无数据库外键。额度与任务状态由服务端在同一队列事务内维护。
ALTER TABLE pulse_queues
ADD COLUMN max_unfinished_tasks INT UNSIGNED NOT NULL DEFAULT 100000 COMMENT '队列允许积压的未终结任务上限;降额不删除已有任务',
ADD COLUMN unfinished_tasks BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '未终结任务数,包含待核查;受理增加、首次进入终态减少,重试不重复计数',
ADD COLUMN start_window_until DATETIME(6) NULL COMMENT '数据库时间的一秒开始限流窗口结束时刻;空表示尚未开始计数',
ADD COLUMN starts_in_window INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前窗口已提交的开始授权次数,回执重报不重复计数,降额不清零',
ADD CONSTRAINT ck_queue_unfinished_limit CHECK (max_unfinished_tasks > 0),
ADD CONSTRAINT ck_queue_start_window CHECK (start_window_until IS NOT NULL OR starts_in_window=0);
UPDATE pulse_queues q LEFT JOIN (
SELECT namespace_id,queue_id,COUNT(*) AS unfinished FROM pulse_tasks
WHERE state IN ('WAITING','LEASED','RUNNING','NEEDS_REVIEW') GROUP BY namespace_id,queue_id
) t ON t.namespace_id=q.namespace_id AND t.queue_id=q.id
SET q.unfinished_tasks=COALESCE(t.unfinished,0);