From b79e84a535e850fdc6f606b090627987da7c29bf Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Tue, 3 Jun 2025 00:13:54 +0000 Subject: [PATCH] fix(scanner): update prometheus at the end of the scan (#4163) * fix(scannner): use prometheus instance over noop if configured properly * Real Fix: move `WriteAfterScanMetrics` outside gofunc * refactor: remove unused artwork.CacheWarmer param from CallScan function Signed-off-by: Deluan --------- Signed-off-by: Deluan Co-authored-by: Deluan --- cmd/scan.go | 4 +--- scanner/controller.go | 9 +++++---- scanner/scanner.go | 10 +++------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/cmd/scan.go b/cmd/scan.go index 26eb7d7a2..d37ccd69f 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -6,8 +6,6 @@ import ( "os" "github.com/navidrome/navidrome/core" - "github.com/navidrome/navidrome/core/artwork" - "github.com/navidrome/navidrome/core/metrics" "github.com/navidrome/navidrome/db" "github.com/navidrome/navidrome/log" "github.com/navidrome/navidrome/persistence" @@ -70,7 +68,7 @@ func runScanner(ctx context.Context) { ds := persistence.New(sqlDB) pls := core.NewPlaylists(ds) - progress, err := scanner.CallScan(ctx, ds, artwork.NoopCacheWarmer(), pls, metrics.NewNoopInstance(), fullScan) + progress, err := scanner.CallScan(ctx, ds, pls, fullScan) if err != nil { log.Fatal(ctx, "Failed to scan", err) } diff --git a/scanner/controller.go b/scanner/controller.go index 0b3e5d122..a6aa0ae8c 100644 --- a/scanner/controller.go +++ b/scanner/controller.go @@ -63,13 +63,12 @@ func (s *controller) getScanner() scanner { if conf.Server.DevExternalScanner { return &scannerExternal{} } - return &scannerImpl{ds: s.ds, cw: s.cw, pls: s.pls, metrics: s.metrics} + return &scannerImpl{ds: s.ds, cw: s.cw, pls: s.pls} } // CallScan starts an in-process scan of the music library. // This is meant to be called from the command line (see cmd/scan.go). -func CallScan(ctx context.Context, ds model.DataStore, cw artwork.CacheWarmer, pls core.Playlists, - metrics metrics.Metrics, fullScan bool) (<-chan *ProgressInfo, error) { +func CallScan(ctx context.Context, ds model.DataStore, pls core.Playlists, fullScan bool) (<-chan *ProgressInfo, error) { release, err := lockScan(ctx) if err != nil { return nil, err @@ -80,7 +79,7 @@ func CallScan(ctx context.Context, ds model.DataStore, cw artwork.CacheWarmer, p progress := make(chan *ProgressInfo, 100) go func() { defer close(progress) - scanner := &scannerImpl{ds: ds, cw: cw, pls: pls, metrics: metrics} + scanner := &scannerImpl{ds: ds, cw: artwork.NoopCacheWarmer(), pls: pls} scanner.scanAll(ctx, fullScan, progress) }() return progress, nil @@ -230,9 +229,11 @@ func (s *controller) ScanAll(requestCtx context.Context, fullScan bool) ([]strin } // Send the final scan status event, with totals if count, folderCount, err := s.getCounters(ctx); err != nil { + s.metrics.WriteAfterScanMetrics(ctx, false) return scanWarnings, err } else { scanType, elapsed, lastErr := s.getScanInfo(ctx) + s.metrics.WriteAfterScanMetrics(ctx, true) s.sendMessage(ctx, &events.ScanStatus{ Scanning: false, Count: count, diff --git a/scanner/scanner.go b/scanner/scanner.go index f08dec311..5edac5d65 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -11,7 +11,6 @@ import ( "github.com/navidrome/navidrome/consts" "github.com/navidrome/navidrome/core" "github.com/navidrome/navidrome/core/artwork" - "github.com/navidrome/navidrome/core/metrics" "github.com/navidrome/navidrome/db" "github.com/navidrome/navidrome/log" "github.com/navidrome/navidrome/model" @@ -19,10 +18,9 @@ import ( ) type scannerImpl struct { - ds model.DataStore - cw artwork.CacheWarmer - pls core.Playlists - metrics metrics.Metrics + ds model.DataStore + cw artwork.CacheWarmer + pls core.Playlists } // scanState holds the state of an in-progress scan, to be passed to the various phases @@ -111,7 +109,6 @@ func (s *scannerImpl) scanAll(ctx context.Context, fullScan bool, progress chan< log.Error(ctx, "Scanner: Finished with error", "duration", time.Since(startTime), err) _ = s.ds.Property(ctx).Put(consts.LastScanErrorKey, err.Error()) state.sendError(err) - s.metrics.WriteAfterScanMetrics(ctx, false) return } @@ -121,7 +118,6 @@ func (s *scannerImpl) scanAll(ctx context.Context, fullScan bool, progress chan< state.sendProgress(&ProgressInfo{ChangesDetected: true}) } - s.metrics.WriteAfterScanMetrics(ctx, err == nil) log.Info(ctx, "Scanner: Finished scanning all libraries", "duration", time.Since(startTime)) }