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')