From 7c78c09046adc62b9e3ad25bc82ece57372ce94b Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Wed, 15 Apr 2026 08:40:19 +0900 Subject: [PATCH] =?UTF-8?q?fix(queue):=20migration=EC=9D=84=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=20statement=20=ED=8C=8C=EC=9D=BC=203=EA=B0=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit asyncpg prepare가 다중 statement 불가. 117(stale 정리) → 118(constraint 제거) → 119(partial unique index 생성) 순차 실행. Co-Authored-By: Claude Opus 4.6 (1M context) --- migrations/117_queue_active_unique.sql | 14 ++------------ migrations/118_queue_drop_old_constraint.sql | 2 ++ migrations/119_queue_active_unique_index.sql | 5 +++++ 3 files changed, 9 insertions(+), 12 deletions(-) create mode 100644 migrations/118_queue_drop_old_constraint.sql create mode 100644 migrations/119_queue_active_unique_index.sql diff --git a/migrations/117_queue_active_unique.sql b/migrations/117_queue_active_unique.sql index beb7665..3303f18 100644 --- a/migrations/117_queue_active_unique.sql +++ b/migrations/117_queue_active_unique.sql @@ -1,18 +1,8 @@ --- Step 1: stale duplicate 삭제 (processing 10분+ 방치 + 같은 doc/stage에 pending 존재) +-- stale duplicate 삭제 (processing 10분+ 방치 + 같은 doc/stage에 pending 존재) DELETE FROM processing_queue a USING processing_queue b WHERE a.document_id = b.document_id AND a.stage = b.stage AND a.status = 'processing' AND a.started_at < NOW() - INTERVAL '10 minutes' - AND b.status = 'pending'; - --- Step 2: 기존 constraint 제거 -ALTER TABLE processing_queue - DROP CONSTRAINT processing_queue_document_id_stage_status_key; - --- Step 3: partial unique index (활성 행은 (document_id, stage)당 최대 1개) --- 활성 중복이 남아있으면 여기서 자연스럽게 실패 → 수동 정리 후 재시도 -CREATE UNIQUE INDEX uq_queue_active - ON processing_queue (document_id, stage) - WHERE status IN ('pending', 'processing'); + AND b.status = 'pending' diff --git a/migrations/118_queue_drop_old_constraint.sql b/migrations/118_queue_drop_old_constraint.sql new file mode 100644 index 0000000..b772c75 --- /dev/null +++ b/migrations/118_queue_drop_old_constraint.sql @@ -0,0 +1,2 @@ +ALTER TABLE processing_queue + DROP CONSTRAINT processing_queue_document_id_stage_status_key diff --git a/migrations/119_queue_active_unique_index.sql b/migrations/119_queue_active_unique_index.sql new file mode 100644 index 0000000..4022746 --- /dev/null +++ b/migrations/119_queue_active_unique_index.sql @@ -0,0 +1,5 @@ +-- partial unique index: 활성 행(pending/processing)은 (document_id, stage)당 최대 1개 +-- 활성 중복이 남아있으면 여기서 자연스럽게 실패 -> 수동 정리 후 재시도 +CREATE UNIQUE INDEX uq_queue_active + ON processing_queue (document_id, stage) + WHERE status IN ('pending', 'processing')