diff --git a/internal/model/puller.go b/internal/model/puller.go index e1d063dd..cac6815d 100644 --- a/internal/model/puller.go +++ b/internal/model/puller.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io/ioutil" + "math/rand" "os" "path/filepath" "sync" @@ -225,10 +226,14 @@ loop: } p.model.setState(p.folder, FolderIdle) if p.scanIntv > 0 { + // Sleep a random time between 3/4 and 5/4 of the configured interval. + sleepNanos := (p.scanIntv.Nanoseconds()*3 + rand.Int63n(2*p.scanIntv.Nanoseconds())) / 4 + intv := time.Duration(sleepNanos) * time.Nanosecond + if debug { - l.Debugln(p, "next rescan in", p.scanIntv) + l.Debugln(p, "next rescan in", intv) } - scanTimer.Reset(p.scanIntv) + scanTimer.Reset(intv) } if !initialScanCompleted { l.Infoln("Completed initial scan (rw) of folder", p.folder) diff --git a/internal/model/scanner.go b/internal/model/scanner.go index c2824b60..8eb0d640 100644 --- a/internal/model/scanner.go +++ b/internal/model/scanner.go @@ -17,6 +17,7 @@ package model import ( "fmt" + "math/rand" "time" ) @@ -63,7 +64,9 @@ func (s *Scanner) Serve() { return } - timer.Reset(s.intv) + // Sleep a random time between 3/4 and 5/4 of the configured interval. + sleepNanos := (s.intv.Nanoseconds()*3 + rand.Int63n(2*s.intv.Nanoseconds())) / 4 + timer.Reset(time.Duration(sleepNanos) * time.Nanosecond) } } }