Quellcode durchsuchen

fix: add DB indexes and fix watchdog transcodePaused handling

Root cause fixes for stuck jobs:
- Add composite index on (transcodeStatus, transcodePaused) — claimOneJob()
  hot path was doing full table scans with every poll cycle
- Add composite index on (transcodeStatus, updatedAt) — resetStuckJobs()
  watchdog was also full scanning on every watchdog tick
- resetStuckJobs(): also clear transcodePaused when resetting a job
  (was leaving paused=true on reset → job reset to PENDING but still invisible
  to claimOneJob() because of the AND transcodePaused=false guard)

Indexes created manually on test DB:
  idx_asset_transcode_queue, idx_asset_watchdog

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
kingkong vor 1 Monat
Ursprung
Commit
5b7e87e3ab
2 geänderte Dateien mit 5 neuen und 2 gelöschten Zeilen
  1. 3 0
      packages/api/prisma/schema.prisma
  2. 2 2
      packages/api/src/worker/index.js

+ 3 - 0
packages/api/prisma/schema.prisma

@@ -100,6 +100,9 @@ model Asset {
   comments Comment[]
   shareLinks AssetShareLink[]
   folderAssets FolderAsset[]
+
+  @@index([transcodeStatus, transcodePaused]) // claimOneJob() hot path
+  @@index([transcodeStatus, updatedAt])      // resetStuckJobs() watchdog
 }
 
 model Comment {

+ 2 - 2
packages/api/src/worker/index.js

@@ -56,7 +56,7 @@ if (cluster.isMaster) {
       if (stale.length > 0) {
         await masterPrisma.asset.updateMany({
           where: { id: { in: stale.map(s => s.id) } },
-          data: { transcodeStatus: 'PENDING', transcodeProgress: 0 },
+          data: { transcodeStatus: 'PENDING', transcodeProgress: 0, transcodePaused: false },
         });
         console.log(`[master] Reset ${stale.length} stale job(s) to PENDING`);
       }
@@ -436,7 +436,7 @@ async function resetStuckJobs() {
     if (stuck.length > 0) {
       await prisma.asset.updateMany({
         where: { id: { in: stuck.map(s => s.id) } },
-        data: { transcodeStatus: 'PENDING', transcodeProgress: 0 },
+        data: { transcodeStatus: 'PENDING', transcodeProgress: 0, transcodePaused: false },
       });
       // Put reset jobs into grace period so this worker doesn't immediately re-claim them
       for (const job of stuck) {