浏览代码

lib/model: Do not wait for scan when setting ignores (fixes #7893) (#7891)

Simon Frei 4 年之前
父节点
当前提交
c025e76f30
共有 2 个文件被更改,包括 16 次插入1 次删除
  1. 14 0
      lib/model/folder.go
  2. 2 1
      lib/model/model.go

+ 14 - 0
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()

+ 2 - 1
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
 }