diff --git a/lib/api/testdata/config/config.xml b/lib/api/testdata/config/config.xml index 3f547e0e9..4aa0f6e39 100644 --- a/lib/api/testdata/config/config.xml +++ b/lib/api/testdata/config/config.xml @@ -116,7 +116,6 @@ 12 false 24 - false 5 false 1 diff --git a/lib/config/config_test.go b/lib/config/config_test.go index aa44bd6db..a82d8e90d 100644 --- a/lib/config/config_test.go +++ b/lib/config/config_test.go @@ -72,7 +72,6 @@ func TestDefaultValues(t *testing.T) { NATTimeoutS: 10, AutoUpgradeIntervalH: 12, KeepTemporariesH: 24, - CacheIgnoredFiles: false, ProgressUpdateIntervalS: 5, LimitBandwidthInLan: false, MinHomeDiskFree: Size{1, "%"}, @@ -278,7 +277,6 @@ func TestOverriddenValues(t *testing.T) { NATTimeoutS: 15, AutoUpgradeIntervalH: 24, KeepTemporariesH: 48, - CacheIgnoredFiles: true, ProgressUpdateIntervalS: 10, LimitBandwidthInLan: true, MinHomeDiskFree: Size{5.2, "%"}, diff --git a/lib/config/migrations.go b/lib/config/migrations.go index d237e8a00..a6377de22 100644 --- a/lib/config/migrations.go +++ b/lib/config/migrations.go @@ -320,10 +320,6 @@ func migrateToConfigV15(cfg *Configuration) { } func migrateToConfigV14(cfg *Configuration) { - // Not using the ignore cache is the new default. Disable it on existing - // configurations. - cfg.Options.CacheIgnoredFiles = false - // Migrate UPnP -> NAT options cfg.Options.NATEnabled = cfg.Options.DeprecatedUPnPEnabled cfg.Options.DeprecatedUPnPEnabled = false diff --git a/lib/config/optionsconfiguration.go b/lib/config/optionsconfiguration.go index 283c4aaa8..7d7f306b2 100644 --- a/lib/config/optionsconfiguration.go +++ b/lib/config/optionsconfiguration.go @@ -45,7 +45,6 @@ type OptionsConfiguration struct { AutoUpgradeIntervalH int `json:"autoUpgradeIntervalH" xml:"autoUpgradeIntervalH" default:"12"` UpgradeToPreReleases bool `json:"upgradeToPreReleases" xml:"upgradeToPreReleases"` KeepTemporariesH int `json:"keepTemporariesH" xml:"keepTemporariesH" default:"24"` - CacheIgnoredFiles bool `json:"cacheIgnoredFiles" xml:"cacheIgnoredFiles" default:"false"` ProgressUpdateIntervalS int `json:"progressUpdateIntervalS" xml:"progressUpdateIntervalS" default:"5"` LimitBandwidthInLan bool `json:"limitBandwidthInLan" xml:"limitBandwidthInLan" default:"false"` MinHomeDiskFree Size `json:"minHomeDiskFree" xml:"minHomeDiskFree" default:"1 %"` diff --git a/lib/config/testdata/example.xml b/lib/config/testdata/example.xml index 6b59457ea..27828e7f9 100644 --- a/lib/config/testdata/example.xml +++ b/lib/config/testdata/example.xml @@ -42,7 +42,6 @@ true 0 24 - true 5 true false diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml index fbaf88337..ee25aab4e 100644 --- a/lib/config/testdata/overridenvalues.xml +++ b/lib/config/testdata/overridenvalues.xml @@ -22,7 +22,6 @@ false 24 48 - true 10 false true diff --git a/lib/ignore/cache.go b/lib/ignore/cache.go deleted file mode 100644 index a5e771c17..000000000 --- a/lib/ignore/cache.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) 2014 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -package ignore - -import ( - "time" - - "github.com/syncthing/syncthing/lib/ignore/ignoreresult" -) - -type nower interface { - Now() time.Time -} - -var clock = nower(defaultClock{}) - -type cache struct { - entries map[string]cacheEntry -} - -type cacheEntry struct { - result ignoreresult.R - access int64 // Unix nanosecond count. Sufficient until the year 2262. -} - -func newCache() *cache { - return &cache{ - entries: make(map[string]cacheEntry), - } -} - -func (c *cache) clean(d time.Duration) { - for k, v := range c.entries { - if clock.Now().Sub(time.Unix(0, v.access)) > d { - delete(c.entries, k) - } - } -} - -func (c *cache) get(key string) (ignoreresult.R, bool) { - entry, ok := c.entries[key] - if ok { - entry.access = clock.Now().UnixNano() - c.entries[key] = entry - } - return entry.result, ok -} - -func (c *cache) set(key string, result ignoreresult.R) { - c.entries[key] = cacheEntry{result, time.Now().UnixNano()} -} - -func (c *cache) len() int { - l := len(c.entries) - return l -} - -type defaultClock struct{} - -func (defaultClock) Now() time.Time { - return time.Now() -} diff --git a/lib/ignore/cache_test.go b/lib/ignore/cache_test.go deleted file mode 100644 index 4cceec1d2..000000000 --- a/lib/ignore/cache_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (C) 2014 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -package ignore - -import ( - "testing" - "time" - - "github.com/syncthing/syncthing/lib/ignore/ignoreresult" -) - -func TestCache(t *testing.T) { - fc := new(fakeClock) - oldClock := clock - clock = fc - defer func() { - clock = oldClock - }() - - c := newCache() - - res, ok := c.get("nonexistent") - if res.IsIgnored() || res.IsDeletable() || ok { - t.Errorf("res %v, ok %v for nonexistent item", res, ok) - } - - // Set and check some items - - c.set("true", ignoreresult.IgnoredDeletable) - c.set("false", 0) - - res, ok = c.get("true") - if !res.IsIgnored() || !res.IsDeletable() || !ok { - t.Errorf("res %v, ok %v for true item", res, ok) - } - - res, ok = c.get("false") - if res.IsIgnored() || res.IsDeletable() || !ok { - t.Errorf("res %v, ok %v for false item", res, ok) - } - - // Don't clean anything - - c.clean(time.Second) - - // Same values should exist - - res, ok = c.get("true") - if !res.IsIgnored() || !res.IsDeletable() || !ok { - t.Errorf("res %v, ok %v for true item", res, ok) - } - - res, ok = c.get("false") - if res.IsIgnored() || res.IsDeletable() || !ok { - t.Errorf("res %v, ok %v for false item", res, ok) - } - - // Sleep and access, to get some data for clean - - *fc += 500 // milliseconds - - c.get("true") - - *fc += 100 // milliseconds - - // "false" was accessed ~600 ms ago, "true" was accessed ~100 ms ago. - // This should clean out "false" but not "true" - - c.clean(300 * time.Millisecond) - - // Same values should exist - - _, ok = c.get("true") - if !ok { - t.Error("item should still exist") - } - - _, ok = c.get("false") - if ok { - t.Errorf("item should have been cleaned") - } -} - -type fakeClock int64 // milliseconds - -func (f *fakeClock) Now() time.Time { - t := time.Unix(int64(*f)/1000, (int64(*f)%1000)*int64(time.Millisecond)) - *f++ - return t -} diff --git a/lib/ignore/ignore.go b/lib/ignore/ignore.go index 1c8978c78..683ff8f1f 100644 --- a/lib/ignore/ignore.go +++ b/lib/ignore/ignore.go @@ -124,10 +124,7 @@ type Matcher struct { fs fs.Filesystem lines []string // exact lines read from .stignore patterns []Pattern // patterns including those from included files - withCache bool - matches *cache curHash string - stop chan struct{} changeDetector ChangeDetector mut sync.Mutex } @@ -135,13 +132,6 @@ type Matcher struct { // An Option can be passed to New() type Option func(*Matcher) -// WithCache enables or disables lookup caching. The default is disabled. -func WithCache(v bool) Option { - return func(m *Matcher) { - m.withCache = v - } -} - // WithChangeDetector sets a custom ChangeDetector. The default is to simply // use the on disk modtime for comparison. func WithChangeDetector(cd ChangeDetector) Option { @@ -152,8 +142,7 @@ func WithChangeDetector(cd ChangeDetector) Option { func New(fs fs.Filesystem, opts ...Option) *Matcher { m := &Matcher{ - fs: fs, - stop: make(chan struct{}), + fs: fs, } for _, opt := range opts { opt(m) @@ -161,9 +150,6 @@ func New(fs fs.Filesystem, opts ...Option) *Matcher { if m.changeDetector == nil { m.changeDetector = newModtimeChecker() } - if m.withCache { - go m.clean(2 * time.Hour) - } return m } @@ -219,9 +205,6 @@ func (m *Matcher) parseLocked(r io.Reader, file string) error { m.curHash = newHash m.patterns = patterns - if m.withCache { - m.matches = newCache() - } return err } @@ -232,7 +215,7 @@ func (m *Matcher) parseLocked(r io.Reader, file string) error { // NFC everywhere else). This is always the case in real usage in syncthing, as // we ensure native unicode normalisation on all entry points (scanning and from // protocol) - so no need to normalize when calling this, except e.g. in tests. -func (m *Matcher) Match(file string) (result ignoreresult.R) { +func (m *Matcher) Match(file string) ignoreresult.R { switch { case fs.IsTemporary(file): return ignoreresult.IgnoreAndSkip @@ -254,19 +237,6 @@ func (m *Matcher) Match(file string) (result ignoreresult.R) { // Change backslashes to slashes (on Windows only) file = filepath.ToSlash(file) - if m.matches != nil { - // Check the cache for a known result. - res, ok := m.matches.get(file) - if ok { - return res - } - - // Update the cache with the result at return time - defer func() { - m.matches.set(file, result) - }() - } - // Check all the patterns for a match. Track whether the patterns so far // allow skipping matched directories or not. As soon as we hit an // exclude pattern (with some exceptions), we can't skip directories @@ -327,27 +297,6 @@ func (m *Matcher) Hash() string { return m.curHash } -func (m *Matcher) Stop() { - close(m.stop) -} - -func (m *Matcher) clean(d time.Duration) { - t := time.NewTimer(d / 2) - for { - select { - case <-m.stop: - return - case <-t.C: - m.mut.Lock() - if m.matches != nil { - m.matches.clean(d) - } - t.Reset(d / 2) - m.mut.Unlock() - } - } -} - func hashPatterns(patterns []Pattern) string { h := sha256.New() for _, pat := range patterns { diff --git a/lib/ignore/ignore_test.go b/lib/ignore/ignore_test.go index 09c2b06e9..bdd90b985 100644 --- a/lib/ignore/ignore_test.go +++ b/lib/ignore/ignore_test.go @@ -52,7 +52,7 @@ func newTestFS() fs.Filesystem { func TestIgnore(t *testing.T) { testFs := newTestFS() - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Load(".stignore") if err != nil { t.Fatal(err) @@ -104,7 +104,7 @@ func TestExcludes(t *testing.T) { i*2 !ign2 ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Fatal(err) @@ -151,7 +151,7 @@ func TestFlagOrder(t *testing.T) { (?i)(?d)(?d)!ign9 (?d)(?d)!ign10 ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Fatal(err) @@ -188,7 +188,7 @@ func TestDeletables(t *testing.T) { ign7 (?i)ign8 ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Fatal(err) @@ -229,7 +229,7 @@ func TestBadPatterns(t *testing.T) { } for _, pat := range badPatterns { - err := New(testFs, WithCache(true)).Parse(bytes.NewBufferString(pat), ".stignore") + err := New(testFs).Parse(bytes.NewBufferString(pat), ".stignore") if err == nil { t.Errorf("No error for pattern %q", pat) } @@ -247,7 +247,7 @@ func TestBadPatterns(t *testing.T) { func TestCaseSensitivity(t *testing.T) { testFs := newTestFS() - ign := New(testFs, WithCache(true)) + ign := New(testFs) err := ign.Parse(bytes.NewBufferString("test"), ".stignore") if err != nil { t.Error(err) @@ -275,126 +275,6 @@ func TestCaseSensitivity(t *testing.T) { } } -func TestCaching(t *testing.T) { - fs := fs.NewFilesystem(fs.FilesystemTypeFake, rand.String(32)+"?content=true") - - fd1, err := osutil.TempFile(fs, "", "") - if err != nil { - t.Fatal(err) - } - - fd2, err := osutil.TempFile(fs, "", "") - if err != nil { - t.Fatal(err) - } - - defer fd1.Close() - defer fd2.Close() - defer fs.Remove(fd1.Name()) - defer fs.Remove(fd2.Name()) - - _, err = fd1.Write([]byte("/x/\n#include " + filepath.Base(fd2.Name()) + "\n")) - if err != nil { - t.Fatal(err) - } - - fd2.Write([]byte("/y/\n")) - - pats := New(fs, WithCache(true)) - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - - if pats.matches.len() != 0 { - t.Fatal("Expected empty cache") - } - - // Cache some outcomes - - for _, letter := range []string{"a", "b", "x", "y"} { - pats.Match(letter) - } - - if pats.matches.len() != 4 { - t.Fatal("Expected 4 cached results") - } - - // Reload file, expect old outcomes to be preserved - - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - if pats.matches.len() != 4 { - t.Fatal("Expected 4 cached results") - } - - // Modify the include file, expect empty cache. Ensure the timestamp on - // the file changes. - - fd2.Write([]byte("/z/\n")) - fd2.Sync() - fakeTime := time.Now().Add(5 * time.Second) - fs.Chtimes(fd2.Name(), fakeTime, fakeTime) - - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - - if pats.matches.len() != 0 { - t.Fatal("Expected 0 cached results") - } - - // Cache some outcomes again - - for _, letter := range []string{"b", "x", "y"} { - pats.Match(letter) - } - - // Verify that outcomes preserved on next load - - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - if pats.matches.len() != 3 { - t.Fatal("Expected 3 cached results") - } - - // Modify the root file, expect cache to be invalidated - - fd1.Write([]byte("/a/\n")) - fd1.Sync() - fakeTime = time.Now().Add(5 * time.Second) - fs.Chtimes(fd1.Name(), fakeTime, fakeTime) - - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - if pats.matches.len() != 0 { - t.Fatal("Expected cache invalidation") - } - - // Cache some outcomes again - - for _, letter := range []string{"b", "x", "y"} { - pats.Match(letter) - } - - // Verify that outcomes provided on next load - - err = pats.Load(fd1.Name()) - if err != nil { - t.Fatal(err) - } - if pats.matches.len() != 3 { - t.Fatal("Expected 3 cached results") - } -} - func TestCommentsAndBlankLines(t *testing.T) { testFs := newTestFS() @@ -409,7 +289,7 @@ func TestCommentsAndBlankLines(t *testing.T) { ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Error(err) @@ -451,59 +331,6 @@ flamingo } } -func BenchmarkMatchCached(b *testing.B) { - stignore := ` -.frog -.frog* -.frogfox -.whale -.whale/* -.dolphin -.dolphin/* -~ferret~.* -.ferret.* -flamingo.* -flamingo -*.crow -*.crow - ` - // Caches per file, hence write the patterns to a file. - - fs := fs.NewFilesystem(fs.FilesystemTypeFake, rand.String(32)+"?content=true") - - fd, err := osutil.TempFile(fs, "", "") - if err != nil { - b.Fatal(err) - } - - _, err = fd.Write([]byte(stignore)) - defer fd.Close() - defer fs.Remove(fd.Name()) - if err != nil { - b.Fatal(err) - } - - // Load the patterns - pats := New(fs, WithCache(true)) - err = pats.Load(fd.Name()) - if err != nil { - b.Fatal(err) - } - // Cache the outcome for "filename" - pats.Match("filename") - - // This load should now load the cached outcomes as the set of patterns - // has not changed. - err = pats.Load(fd.Name()) - if err != nil { - b.Fatal(err) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - result = pats.Match("filename") - } -} - func TestCacheReload(t *testing.T) { fs := fs.NewFilesystem(fs.FilesystemTypeFake, rand.String(32)+"?content=true") @@ -522,7 +349,7 @@ func TestCacheReload(t *testing.T) { t.Fatal(err) } - pats := New(fs, WithCache(true)) + pats := New(fs) err = pats.Load(fd.Name()) if err != nil { t.Fatal(err) @@ -579,7 +406,7 @@ func TestCacheReload(t *testing.T) { func TestHash(t *testing.T) { testFs := newTestFS() - p1 := New(testFs, WithCache(true)) + p1 := New(testFs) err := p1.Load(".stignore") if err != nil { t.Fatal(err) @@ -595,7 +422,7 @@ func TestHash(t *testing.T) { /ffile lost+found ` - p2 := New(testFs, WithCache(true)) + p2 := New(testFs) err = p2.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Fatal(err) @@ -610,7 +437,7 @@ func TestHash(t *testing.T) { /ffile lost+found ` - p3 := New(testFs, WithCache(true)) + p3 := New(testFs) err = p3.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { t.Fatal(err) @@ -636,7 +463,7 @@ func TestHash(t *testing.T) { func TestHashOfEmpty(t *testing.T) { testFs := newTestFS() - p1 := New(testFs, WithCache(true)) + p1 := New(testFs) err := p1.Load(".stignore") if err != nil { @@ -678,7 +505,7 @@ func TestWindowsPatterns(t *testing.T) { a/b c\d ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -706,7 +533,7 @@ func TestAutomaticCaseInsensitivity(t *testing.T) { A/B c/d ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -728,7 +555,7 @@ func TestCommas(t *testing.T) { foo,bar.txt {baz,quux}.txt ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -762,7 +589,7 @@ func TestIssue3164(t *testing.T) { (?d)(?i)/foo (?d)(?i)**/bar ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -801,7 +628,7 @@ func TestIssue3174(t *testing.T) { stignore := ` *ä* ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -822,7 +649,7 @@ func TestIssue3639(t *testing.T) { stignore := ` foo/ ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -858,7 +685,7 @@ func TestIssue3674(t *testing.T) { {"as/dc", true}, } - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -893,7 +720,7 @@ func TestGobwasGlobIssue18(t *testing.T) { {"bbaa", false}, } - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -925,7 +752,7 @@ func TestRoot(t *testing.T) { {"b", true}, } - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -951,7 +778,7 @@ func TestLines(t *testing.T) { !/a ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -992,7 +819,7 @@ func TestDuplicateLines(t *testing.T) { /* ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -1025,7 +852,7 @@ func TestIssue4680(t *testing.T) { {"#snapshot/foo", true}, } - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -1045,7 +872,7 @@ func TestIssue4689(t *testing.T) { stignore := `// orig` - pats := New(testFs, WithCache(true)) + pats := New(testFs) err := pats.Parse(bytes.NewBufferString(stignore), ".stignore") if err != nil { @@ -1076,7 +903,7 @@ func TestIssue4901(t *testing.T) { puppy ` - pats := New(testFs, WithCache(true)) + pats := New(testFs) fd, err := pats.fs.Create(".stignore") if err != nil { @@ -1119,7 +946,7 @@ func TestIssue4901(t *testing.T) { func TestIssue5009(t *testing.T) { testFs := newTestFS() - pats := New(testFs, WithCache(true)) + pats := New(testFs) stignore := ` ign1 @@ -1152,7 +979,7 @@ func TestIssue5009(t *testing.T) { func TestSpecialChars(t *testing.T) { testFs := newTestFS() - pats := New(testFs, WithCache(true)) + pats := New(testFs) stignore := `(?i)/#recycle (?i)/#nosync @@ -1179,7 +1006,7 @@ func TestSpecialChars(t *testing.T) { func TestIntlWildcards(t *testing.T) { testFs := newTestFS() - pats := New(testFs, WithCache(true)) + pats := New(testFs) stignore := `1000春 200?春 @@ -1208,7 +1035,7 @@ func TestPartialIncludeLine(t *testing.T) { // Loading a partial #include line (no file mentioned) should error but not crash. - pats := New(testFs, WithCache(true)) + pats := New(testFs) cases := []string{ "#include", @@ -1267,7 +1094,7 @@ func TestSkipIgnoredDirs(t *testing.T) { } } - pats := New(testFs, WithCache(true)) + pats := New(testFs) stignore := ` /foo/ign* @@ -1711,7 +1538,7 @@ func testEscape(t *testing.T, tests []escapeTest, noErrors bool) { for name, content := range testEscapeFiles { fs.WriteFile(testFS, name, []byte(content), 0o666) } - pats := New(testFS, WithCache(true)) + pats := New(testFS) err := pats.Parse(bytes.NewBufferString(test.pattern), ".stignore") if noErrors { @@ -1753,7 +1580,7 @@ func TestIgnoreThroughSymlink(t *testing.T) { t.Fatal(err) } - pats := New(testFS, WithCache(true)) + pats := New(testFS) if err := pats.Load(".stignore"); err != nil { t.Fatal(err) } diff --git a/lib/model/model.go b/lib/model/model.go index 7ba426aea..3b35a4a64 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -300,7 +300,7 @@ func (m *model) initFolders(cfg config.Configuration) error { folderCfg.CreateRoot() continue } - err := m.newFolder(folderCfg, cfg.Options.CacheIgnoredFiles) + err := m.newFolder(folderCfg) if err != nil { return err } @@ -335,8 +335,8 @@ func (m *model) fatal(err error) { } // Need to hold lock on m.mut when calling this. -func (m *model) addAndStartFolderLocked(cfg config.FolderConfiguration, cacheIgnoredFiles bool) { - ignores := ignore.New(cfg.Filesystem(), ignore.WithCache(cacheIgnoredFiles)) +func (m *model) addAndStartFolderLocked(cfg config.FolderConfiguration) { + ignores := ignore.New(cfg.Filesystem()) if cfg.Type != config.FolderTypeReceiveEncrypted { if err := ignores.Load(".stignore"); err != nil && !fs.IsNotExist(err) { slog.Error("Failed to load ignores", slogutil.Error(err)) @@ -509,7 +509,7 @@ func (m *model) cleanupFolderLocked(cfg config.FolderConfiguration) { delete(m.folderEncryptionFailures, cfg.ID) } -func (m *model) restartFolder(from, to config.FolderConfiguration, cacheIgnoredFiles bool) error { +func (m *model) restartFolder(from, to config.FolderConfiguration) error { if to.ID == "" { panic("bug: cannot restart empty folder ID") } @@ -539,7 +539,7 @@ func (m *model) restartFolder(from, to config.FolderConfiguration, cacheIgnoredF m.cleanupFolderLocked(from) if !to.Paused { - m.addAndStartFolderLocked(to, cacheIgnoredFiles) + m.addAndStartFolderLocked(to) } runner, _ := m.folderRunners.Get(to.ID) @@ -560,11 +560,11 @@ func (m *model) restartFolder(from, to config.FolderConfiguration, cacheIgnoredF return nil } -func (m *model) newFolder(cfg config.FolderConfiguration, cacheIgnoredFiles bool) error { +func (m *model) newFolder(cfg config.FolderConfiguration) error { m.mut.Lock() defer m.mut.Unlock() - m.addAndStartFolderLocked(cfg, cacheIgnoredFiles) + m.addAndStartFolderLocked(cfg) // Cluster configs might be received and processed before reaching this // point, i.e. before the folder is started. If that's the case, start @@ -2972,7 +2972,7 @@ func (m *model) CommitConfiguration(from, to config.Configuration) bool { slog.Info("Paused folder", cfg.LogAttr()) } else { slog.Info("Adding folder", cfg.LogAttr()) - if err := m.newFolder(cfg, to.Options.CacheIgnoredFiles); err != nil { + if err := m.newFolder(cfg); err != nil { m.fatal(err) return true } @@ -2998,8 +2998,8 @@ func (m *model) CommitConfiguration(from, to config.Configuration) bool { // This folder exists on both sides. Settings might have changed. // Check if anything differs that requires a restart. - if !reflect.DeepEqual(fromCfg.RequiresRestartOnly(), toCfg.RequiresRestartOnly()) || from.Options.CacheIgnoredFiles != to.Options.CacheIgnoredFiles { - if err := m.restartFolder(fromCfg, toCfg, to.Options.CacheIgnoredFiles); err != nil { + if !reflect.DeepEqual(fromCfg.RequiresRestartOnly(), toCfg.RequiresRestartOnly()) { + if err := m.restartFolder(fromCfg, toCfg); err != nil { m.fatal(err) return true } diff --git a/lib/model/model_test.go b/lib/model/model_test.go index 54da73943..1964c05ff 100644 --- a/lib/model/model_test.go +++ b/lib/model/model_test.go @@ -1603,7 +1603,7 @@ func TestIgnores(t *testing.T) { ID: "fresh", Path: "XXX", FilesystemType: config.FilesystemTypeFake, } - ignores := ignore.New(fcfg.Filesystem(), ignore.WithCache(m.cfg.Options().CacheIgnoredFiles)) + ignores := ignore.New(fcfg.Filesystem()) m.mut.Lock() m.folderCfgs[fcfg.ID] = fcfg m.folderIgnores[fcfg.ID] = ignores @@ -1618,7 +1618,7 @@ func TestIgnores(t *testing.T) { pausedDefaultFolderConfig := defaultFolderConfig pausedDefaultFolderConfig.Paused = true - m.restartFolder(defaultFolderConfig, pausedDefaultFolderConfig, false) + m.restartFolder(defaultFolderConfig, pausedDefaultFolderConfig) // Here folder initialization is not an issue as a paused folder isn't // added to the model and thus there is no initial scan happening. @@ -2216,7 +2216,7 @@ func TestIndexesForUnknownDevicesDropped(t *testing.T) { t.Error("expected two devices") } - m.newFolder(defaultFolderConfig, false) + m.newFolder(defaultFolderConfig) defer cleanupModel(m) if devs, err := m.sdb.ListDevicesForFolder("default"); err != nil || len(devs) != 1 { diff --git a/lib/model/testutils_test.go b/lib/model/testutils_test.go index bd9de3078..b9f6376c7 100644 --- a/lib/model/testutils_test.go +++ b/lib/model/testutils_test.go @@ -250,7 +250,7 @@ func (*alwaysChanged) Changed() bool { func folderIgnoresAlwaysReload(t testing.TB, m *testModel, fcfg config.FolderConfiguration) { t.Helper() m.removeFolder(fcfg) - ignores := ignore.New(fcfg.Filesystem(), ignore.WithCache(true), ignore.WithChangeDetector(newAlwaysChanged())) + ignores := ignore.New(fcfg.Filesystem(), ignore.WithChangeDetector(newAlwaysChanged())) m.mut.Lock() m.addAndStartFolderLockedWithIgnores(fcfg, ignores) m.mut.Unlock() diff --git a/lib/scanner/walk_test.go b/lib/scanner/walk_test.go index 699772f97..c669a4457 100644 --- a/lib/scanner/walk_test.go +++ b/lib/scanner/walk_test.go @@ -749,7 +749,7 @@ func TestRecurseInclude(t *testing.T) { * ` testFs := newTestFs() - ignores := ignore.New(testFs, ignore.WithCache(true)) + ignores := ignore.New(testFs) if err := ignores.Parse(bytes.NewBufferString(stignore), ".stignore"); err != nil { t.Fatal(err) } @@ -859,7 +859,7 @@ func TestSkipIgnoredDirs(t *testing.T) { w := &walker{} - pats := ignore.New(fss, ignore.WithCache(true)) + pats := ignore.New(fss) stignore := ` /foo/ign* @@ -892,7 +892,7 @@ func TestIncludedSubdir(t *testing.T) { t.Fatal(err) } - pats := ignore.New(fss, ignore.WithCache(true)) + pats := ignore.New(fss) stignore := ` !/foo/bar diff --git a/lib/ur/contract/contract.go b/lib/ur/contract/contract.go index 15b52420c..37cebf331 100644 --- a/lib/ur/contract/contract.go +++ b/lib/ur/contract/contract.go @@ -91,7 +91,6 @@ type Report struct { NATType string `json:"natType,omitempty" metric:"nat_detection,gaugeVec:type" since:"3"` AlwaysLocalNets bool `json:"alwaysLocalNets,omitempty" metric:"feature_count{feature=AlwaysLocalNets},gauge" since:"3"` - CacheIgnoredFiles bool `json:"cacheIgnoredFiles,omitempty" metric:"feature_count{feature=CacheIgnoredFiles},gauge" since:"3"` OverwriteRemoteDeviceNames bool `json:"overwriteRemoteDeviceNames,omitempty" metric:"feature_count{feature=OverwriteRemoteDeviceNames},gauge" since:"3"` ProgressEmitterEnabled bool `json:"progressEmitterEnabled,omitempty" metric:"feature_count{feature=ProgressEmitterEnabled},gauge" since:"3"` CustomDefaultFolderPath bool `json:"customDefaultFolderPath,omitempty" metric:"feature_count{feature=CustomDefaultFolderPath},gauge" since:"3"` diff --git a/lib/ur/usage_report.go b/lib/ur/usage_report.go index 4d3c1f342..71c38fd85 100644 --- a/lib/ur/usage_report.go +++ b/lib/ur/usage_report.go @@ -217,7 +217,6 @@ func (s *Service) reportData(ctx context.Context, urVersion int, preview bool) ( report.Uptime = s.UptimeS() report.NATType = s.connectionsService.NATType() report.AlwaysLocalNets = len(opts.AlwaysLocalNets) > 0 - report.CacheIgnoredFiles = opts.CacheIgnoredFiles report.OverwriteRemoteDeviceNames = opts.OverwriteRemoteDevNames report.ProgressEmitterEnabled = opts.ProgressUpdateIntervalS > -1 report.CustomDefaultFolderPath = defaultFolder.Path != "~" diff --git a/test/h1/config.xml b/test/h1/config.xml index 40a8c947d..0853c8630 100644 --- a/test/h1/config.xml +++ b/test/h1/config.xml @@ -101,7 +101,6 @@ 12 false 24 - false 5 false 1 diff --git a/test/h2/config.xml b/test/h2/config.xml index 123eac79c..b2acd6efa 100644 --- a/test/h2/config.xml +++ b/test/h2/config.xml @@ -99,7 +99,6 @@ 12 false 24 - false 5 true 1 diff --git a/test/h3/config.xml b/test/h3/config.xml index 440c15b0d..5021b89c2 100644 --- a/test/h3/config.xml +++ b/test/h3/config.xml @@ -117,7 +117,6 @@ 12 false 24 - false 5 false 1 diff --git a/test/h4/config.xml b/test/h4/config.xml index 8347f39c6..19b3fddd5 100644 --- a/test/h4/config.xml +++ b/test/h4/config.xml @@ -69,7 +69,6 @@ 12 false 24 - false 5 false 1