diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-19 14:58:20 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-19 14:58:20 +0300 |
| commit | ebb88acd66a815c07fa8adedca052182d0cb8cc5 (patch) | |
| tree | e010c1d49b3d38c1e0351705937304e3225fc5fc | |
| parent | 0d737e7585a7b6876679b266e677675f7787ff24 (diff) | |
Pass scanCtx to probeFile so ffprobe cancels with the scan
probeWorkerLoop was passing the parent ctx into probeFile, which in turn
passed it to prober.Probe (ffprobe) and thumbGen.Generate (ffmpeg). When
scanCtx was cancelled — because another worker failed or TriggerRescan
restarted the scan — those subprocesses kept running until the parent
ctx was cancelled. Switching to scanCtx makes them stop promptly.
Kept writerLoop's store.CreateMedia on the parent ctx: the scanCtx.Err()
guard at the top of the loop already prevents new writes after cancel,
and any in-flight CreateMedia should complete so the DB stays consistent
with what was probed.
| -rw-r--r-- | player-server/internal/scanner/scanner.go | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/player-server/internal/scanner/scanner.go b/player-server/internal/scanner/scanner.go index 9eb5b1e..9233630 100644 --- a/player-server/internal/scanner/scanner.go +++ b/player-server/internal/scanner/scanner.go @@ -498,7 +498,11 @@ func (s *FSScanner) probeWorkerLoop( if scanCtx.Err() != nil { continue } - result, err := s.probeFile(ctx, path, setPath, setID, setName, existing, coverImages, progress) + // Use scanCtx (not ctx) so ffprobe/ffmpeg subprocesses spawned by + // probeFile cancel promptly when scanCtx is cancelled — e.g. another + // worker failed or TriggerRescan restarted the scan. Passing the + // parent ctx here would leave ffprobe running after cancel. + result, err := s.probeFile(scanCtx, path, setPath, setID, setName, existing, coverImages, progress) if err != nil { sendErr(err) return |
