diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-04 00:17:29 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-04 00:17:29 +0300 |
| commit | 71e004fb4e53ee4ac5c8fb202bad5f5c00dd8dac (patch) | |
| tree | 5b5c817f8418e2777db376999cdffd3ef018239c /internal/service/scan.go | |
| parent | c68c54b0212ebc8d111b11c6edff82942c3a4463 (diff) | |
task b: inject app context into AdminService and propagate cancellation to background scans
Diffstat (limited to 'internal/service/scan.go')
| -rw-r--r-- | internal/service/scan.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/internal/service/scan.go b/internal/service/scan.go index af17f95..ca4aca8 100644 --- a/internal/service/scan.go +++ b/internal/service/scan.go @@ -21,10 +21,11 @@ type scanService struct { mu sync.Mutex scanCancel context.CancelFunc progress *model.ScanProgress + appCtx context.Context // application-level context used to propagate shutdown cancellation } // NewScanService creates a ScanService. -func NewScanService(sc scanner.Scanner, mediaRoot string, clk clock.Clock, logger *slog.Logger) *scanService { +func NewScanService(appCtx context.Context, sc scanner.Scanner, mediaRoot string, clk clock.Clock, logger *slog.Logger) *scanService { if logger == nil { logger = slog.Default() } @@ -33,6 +34,7 @@ func NewScanService(sc scanner.Scanner, mediaRoot string, clk clock.Clock, logge mediaRoot: mediaRoot, clock: clk, logger: logger, + appCtx: appCtx, } } @@ -45,7 +47,9 @@ func (s *scanService) TriggerRescan(ctx context.Context) error { if s.scanCancel != nil { s.scanCancel() } - scanCtx, cancel := context.WithTimeout(context.Background(), 30*time.Minute) + // Derive the scan context from the application-level context so that + // cancellation propagates on server exit, while still applying a 30-minute timeout. + scanCtx, cancel := context.WithTimeout(s.appCtx, 30*time.Minute) s.scanCancel = cancel progress := &model.ScanProgress{} s.progress = progress |
