From d3f6b4692deaa7ff62b90f1c017f93a0911b735f Mon Sep 17 00:00:00 2001 From: Deluan Date: Fri, 15 Dec 2023 07:59:34 -0500 Subject: [PATCH] Temporary fix for scan context cancellation for Go 1.20 --- scanner/rescanall.go | 33 +++++++++++++++++++++++++++++++++ scanner/rescanall_go1.20.go | 33 +++++++++++++++++++++++++++++++++ scanner/scanner.go | 22 ---------------------- 3 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 scanner/rescanall.go create mode 100644 scanner/rescanall_go1.20.go diff --git a/scanner/rescanall.go b/scanner/rescanall.go new file mode 100644 index 00000000000..4a8bc8d1856 --- /dev/null +++ b/scanner/rescanall.go @@ -0,0 +1,33 @@ +//go:build go1.21 + +package scanner + +import ( + "context" + + "github.com/navidrome/navidrome/core" + "github.com/navidrome/navidrome/log" +) + +// TODO: Move this to scanner/scanner.go when we drop support for go 1.20 +func (s *scanner) RescanAll(ctx context.Context, fullRescan bool) error { + ctx = context.WithoutCancel(ctx) + if !isScanning.TryLock() { + log.Debug("Scanner already running, ignoring request for rescan.") + return ErrAlreadyScanning + } + defer isScanning.Unlock() + + var hasError bool + for folder := range s.folders { + err := s.rescan(ctx, folder, fullRescan) + hasError = hasError || err != nil + } + if hasError { + log.Error("Errors while scanning media. Please check the logs") + core.WriteAfterScanMetrics(ctx, s.ds, false) + return ErrScanError + } + core.WriteAfterScanMetrics(ctx, s.ds, true) + return nil +} diff --git a/scanner/rescanall_go1.20.go b/scanner/rescanall_go1.20.go new file mode 100644 index 00000000000..d64a8d974d7 --- /dev/null +++ b/scanner/rescanall_go1.20.go @@ -0,0 +1,33 @@ +//go:build !go1.21 + +package scanner + +import ( + "context" + + "github.com/navidrome/navidrome/core" + "github.com/navidrome/navidrome/log" +) + +// TODO Remove this file when we drop support for go 1.20 +func (s *scanner) RescanAll(ctx context.Context, fullRescan bool) error { + ctx = context.TODO() + if !isScanning.TryLock() { + log.Debug("Scanner already running, ignoring request for rescan.") + return ErrAlreadyScanning + } + defer isScanning.Unlock() + + var hasError bool + for folder := range s.folders { + err := s.rescan(ctx, folder, fullRescan) + hasError = hasError || err != nil + } + if hasError { + log.Error("Errors while scanning media. Please check the logs") + core.WriteAfterScanMetrics(ctx, s.ds, false) + return ErrScanError + } + core.WriteAfterScanMetrics(ctx, s.ds, true) + return nil +} diff --git a/scanner/scanner.go b/scanner/scanner.go index b6b17c8ed3c..9d43db209ee 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -139,28 +139,6 @@ func (s *scanner) startProgressTracker(mediaFolder string) (chan uint32, context return progress, cancel } -func (s *scanner) RescanAll(ctx context.Context, fullRescan bool) error { - ctx = context.WithoutCancel(ctx) - if !isScanning.TryLock() { - log.Debug("Scanner already running, ignoring request for rescan.") - return ErrAlreadyScanning - } - defer isScanning.Unlock() - - var hasError bool - for folder := range s.folders { - err := s.rescan(ctx, folder, fullRescan) - hasError = hasError || err != nil - } - if hasError { - log.Error("Errors while scanning media. Please check the logs") - core.WriteAfterScanMetrics(ctx, s.ds, false) - return ErrScanError - } - core.WriteAfterScanMetrics(ctx, s.ds, true) - return nil -} - func (s *scanner) getStatus(folder string) (scanStatus, bool) { s.lock.RLock() defer s.lock.RUnlock()