mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-17 07:41:22 +03:00
Fix race condition
This commit is contained in:
parent
478c709a64
commit
45c4583f1b
@ -19,7 +19,9 @@ import (
|
|||||||
"github.com/navidrome/navidrome/scanner/metadata"
|
"github.com/navidrome/navidrome/scanner/metadata"
|
||||||
_ "github.com/navidrome/navidrome/scanner/metadata/ffmpeg"
|
_ "github.com/navidrome/navidrome/scanner/metadata/ffmpeg"
|
||||||
_ "github.com/navidrome/navidrome/scanner/metadata/taglib"
|
_ "github.com/navidrome/navidrome/scanner/metadata/taglib"
|
||||||
|
"github.com/navidrome/navidrome/utils/pl"
|
||||||
"github.com/navidrome/navidrome/utils/slice"
|
"github.com/navidrome/navidrome/utils/slice"
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TagScanner struct {
|
type TagScanner struct {
|
||||||
@ -107,24 +109,34 @@ func (s *TagScanner) Scan(ctx context.Context, fullScan bool, progress chan uint
|
|||||||
log.Trace(ctx, "Loading directory tree from music folder", "folder", s.lib.Path)
|
log.Trace(ctx, "Loading directory tree from music folder", "folder", s.lib.Path)
|
||||||
foldersFound, walkerError := walkDirTree(ctx, s.lib.Path)
|
foldersFound, walkerError := walkDirTree(ctx, s.lib.Path)
|
||||||
|
|
||||||
go func() {
|
// Process each folder found in the music folder
|
||||||
for folderStats := range foldersFound {
|
g, walkCtx := errgroup.WithContext(ctx)
|
||||||
|
g.Go(func() error {
|
||||||
|
for folderStats := range pl.ReadOrDone(walkCtx, foldersFound) {
|
||||||
progress <- folderStats.AudioFilesCount
|
progress <- folderStats.AudioFilesCount
|
||||||
allFSDirs[folderStats.Path] = folderStats
|
allFSDirs[folderStats.Path] = folderStats
|
||||||
|
|
||||||
if s.folderHasChanged(folderStats, allDBDirs, s.lib.LastScanAt) || fullScan {
|
if s.folderHasChanged(folderStats, allDBDirs, s.lib.LastScanAt) || fullScan {
|
||||||
changedDirs = append(changedDirs, folderStats.Path)
|
changedDirs = append(changedDirs, folderStats.Path)
|
||||||
log.Debug("Processing changed folder", "dir", folderStats.Path)
|
log.Debug("Processing changed folder", "dir", folderStats.Path)
|
||||||
err := s.processChangedDir(ctx, refresher, fullScan, folderStats.Path)
|
err := s.processChangedDir(walkCtx, refresher, fullScan, folderStats.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Error updating folder in the DB", "dir", folderStats.Path, err)
|
log.Error("Error updating folder in the DB", "dir", folderStats.Path, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
return nil
|
||||||
|
})
|
||||||
for err := range walkerError {
|
// Check for errors in the walker
|
||||||
log.Error("Scan was interrupted by error. See errors above", err)
|
g.Go(func() error {
|
||||||
|
for err := range walkerError {
|
||||||
|
log.Error("Scan was interrupted by error. See errors above", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
// Wait for all goroutines to finish, and check if an error occurred
|
||||||
|
if err := g.Wait(); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user