Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions apps/server/drizzle/0022_sleepy_turbo.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
DO $$
BEGIN
DELETE FROM "jobs" AS duplicate
USING "jobs" AS retained
WHERE duplicate."type" = 'generate_thumbnail'
AND duplicate."status" IN ('pending', 'in_progress')
AND retained."type" = duplicate."type"
AND retained."status" IN ('pending', 'in_progress')
AND retained."source_id" = duplicate."source_id"
AND retained."payload"->>'mediaId' = duplicate."payload"->>'mediaId'
AND retained."payload"->>'size' = duplicate."payload"->>'size'
AND (retained."created_at", retained."id") < (duplicate."created_at", duplicate."id");
Comment on lines +3 to +12

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

in_progress のジョブを物理削除します。

DELETE の条件は pendingin_progress の両方を対象にします。マイグレーション実行時にワーカーが稼働していると、実行中ジョブの行が消えます。その場合、ワーカーの完了更新は0行更新になり、結果とエラーが記録されません。

対策は2つあります。削除対象を pending のみに限定し、in_progress の重複は自然消滅を待つ方法が安全です。あるいは、マイグレーションをワーカー停止中に実行する運用手順を明記してください。

🛠️ pending のみを削除対象にする例
 	DELETE FROM "jobs" AS duplicate
 	USING "jobs" AS retained
 	WHERE duplicate."type" = 'generate_thumbnail'
-		AND duplicate."status" IN ('pending', 'in_progress')
+		AND duplicate."status" = 'pending'
 		AND retained."type" = duplicate."type"
 		AND retained."status" IN ('pending', 'in_progress')

この変更では、in_progress 行が残り、pending 側が削除されます。順序比較の条件は再検討が必要です。

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
DELETE FROM "jobs" AS duplicate
USING "jobs" AS retained
WHERE duplicate."type" = 'generate_thumbnail'
AND duplicate."status" IN ('pending', 'in_progress')
AND retained."type" = duplicate."type"
AND retained."status" IN ('pending', 'in_progress')
AND retained."source_id" = duplicate."source_id"
AND retained."payload"->>'mediaId' = duplicate."payload"->>'mediaId'
AND retained."payload"->>'size' = duplicate."payload"->>'size'
AND (retained."created_at", retained."id") < (duplicate."created_at", duplicate."id");
DELETE FROM "jobs" AS duplicate
USING "jobs" AS retained
WHERE duplicate."type" = 'generate_thumbnail'
AND duplicate."status" = 'pending'
AND retained."type" = duplicate."type"
AND retained."status" IN ('pending', 'in_progress')
AND retained."source_id" = duplicate."source_id"
AND retained."payload"->>'mediaId' = duplicate."payload"->>'mediaId'
AND retained."payload"->>'size' = duplicate."payload"->>'size'
AND (retained."created_at", retained."id") < (duplicate."created_at", duplicate."id");
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/server/drizzle/0022_sleepy_turbo.sql` around lines 3 - 12, UPDATE the
DELETE condition in the duplicate jobs cleanup so only jobs with status
`pending` can be deleted; do not include `in_progress` rows in either the
deleted duplicate set or the retained-row matching logic unless required for
safe deduplication. Preserve the existing duplicate matching criteria for type,
source_id, payload fields, and creation ordering.


CREATE UNIQUE INDEX "uq_jobs_active_thumbnail" ON "jobs" USING btree ("source_id",("payload"->>'mediaId'),("payload"->>'size')) WHERE "jobs"."type" = 'generate_thumbnail'
AND "jobs"."status" IN ('pending', 'in_progress')
AND "jobs"."source_id" IS NOT NULL;
END $$;
Loading