From c025e76f304f4c3b8376949c0761af37ea21390a Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Tue, 17 Aug 2021 09:23:33 +0200 Subject: [PATCH] lib/model: Do not wait for scan when setting ignores (fixes #7893) (#7891) --- lib/model/folder.go | 14 ++++++++++++++ lib/model/model.go | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/model/folder.go b/lib/model/folder.go index 5a88f9bf1..18ef41a06 100644 --- a/lib/model/folder.go +++ b/lib/model/folder.go @@ -55,6 +55,7 @@ type folder struct { scanTimer *time.Timer scanDelay chan time.Duration initialScanFinished chan struct{} + scanScheduled chan struct{} versionCleanupInterval time.Duration versionCleanupTimer *time.Timer @@ -110,6 +111,7 @@ func newFolder(model *model, fset *db.FileSet, ignores *ignore.Matcher, cfg conf scanTimer: time.NewTimer(0), // The first scan should be done immediately. scanDelay: make(chan time.Duration), initialScanFinished: make(chan struct{}), + scanScheduled: make(chan struct{}, 1), versionCleanupInterval: time.Duration(cfg.Versioning.CleanupIntervalS) * time.Second, versionCleanupTimer: time.NewTimer(time.Duration(cfg.Versioning.CleanupIntervalS) * time.Second), @@ -204,6 +206,10 @@ func (f *folder) Serve(ctx context.Context) error { l.Debugln(f, "Delaying scan") f.scanTimer.Reset(next) + case <-f.scanScheduled: + l.Debugln(f, "Scan was scheduled") + f.scanTimer.Reset(0) + case fsEvents := <-f.watchChan: l.Debugln(f, "Scan due to watcher") err = f.scanSubdirs(fsEvents) @@ -239,6 +245,14 @@ func (f *folder) DelayScan(next time.Duration) { } } +func (f *folder) ScheduleScan() { + // 1-buffered chan + select { + case f.scanScheduled <- struct{}{}: + default: + } +} + func (f *folder) ignoresUpdated() { if f.FSWatcherEnabled { f.scheduleWatchRestart() diff --git a/lib/model/model.go b/lib/model/model.go index 54afb190d..057d19192 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -50,6 +50,7 @@ type service interface { Override() Revert() DelayScan(d time.Duration) + ScheduleScan() SchedulePull() // something relevant changed, we should try a pull Jobs(page, perpage int) ([]string, []string, int) // In progress, Queued, skipped Scan(subs []string) error @@ -2115,7 +2116,7 @@ func (m *model) SetIgnores(folder string, content []string) error { runner, ok := m.folderRunners[folder] m.fmut.RUnlock() if ok { - return runner.Scan(nil) + runner.ScheduleScan() } return nil }