From fe7b77198cdf7fbf2ff0903f55a8b44f6ab2e157 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 12 Aug 2014 14:21:09 +0200 Subject: [PATCH] Rip out the Suppressor (maybe to be reintroduced) --- config/config.go | 1 - config/config_test.go | 3 - model/model.go | 17 ++---- model/suppressor.go | 81 --------------------------- model/suppressor_test.go | 117 --------------------------------------- scanner/walk.go | 25 --------- 6 files changed, 5 insertions(+), 239 deletions(-) delete mode 100644 model/suppressor.go delete mode 100644 model/suppressor_test.go diff --git a/config/config.go b/config/config.go index 66f3b746c..cca4fc531 100644 --- a/config/config.go +++ b/config/config.go @@ -110,7 +110,6 @@ type OptionsConfiguration struct { MaxSendKbps int `xml:"maxSendKbps"` RescanIntervalS int `xml:"rescanIntervalS" default:"60"` ReconnectIntervalS int `xml:"reconnectionIntervalS" default:"60"` - MaxChangeKbps int `xml:"maxChangeKbps" default:"10000"` StartBrowser bool `xml:"startBrowser" default:"true"` UPnPEnabled bool `xml:"upnpEnabled" default:"true"` URAccepted int `xml:"urAccepted"` // Accepted usage reporting version; 0 for off (undecided), -1 for off (permanently) diff --git a/config/config_test.go b/config/config_test.go index 26eee24b4..9c6faf497 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -34,7 +34,6 @@ func TestDefaultValues(t *testing.T) { MaxSendKbps: 0, RescanIntervalS: 60, ReconnectIntervalS: 60, - MaxChangeKbps: 10000, StartBrowser: true, UPnPEnabled: true, } @@ -189,7 +188,6 @@ func TestOverriddenValues(t *testing.T) { 1234 600 6000 - 2345 false false @@ -206,7 +204,6 @@ func TestOverriddenValues(t *testing.T) { MaxSendKbps: 1234, RescanIntervalS: 600, ReconnectIntervalS: 6000, - MaxChangeKbps: 2345, StartBrowser: false, UPnPEnabled: false, } diff --git a/model/model.go b/model/model.go index 727b3876a..0f8803ffe 100644 --- a/model/model.go +++ b/model/model.go @@ -71,12 +71,11 @@ type Model struct { clientName string clientVersion string - repoCfgs map[string]config.RepositoryConfiguration // repo -> cfg - repoFiles map[string]*files.Set // repo -> files - repoNodes map[string][]protocol.NodeID // repo -> nodeIDs - nodeRepos map[protocol.NodeID][]string // nodeID -> repos - suppressor map[string]*suppressor // repo -> suppressor - rmut sync.RWMutex // protects the above + repoCfgs map[string]config.RepositoryConfiguration // repo -> cfg + repoFiles map[string]*files.Set // repo -> files + repoNodes map[string][]protocol.NodeID // repo -> nodeIDs + nodeRepos map[protocol.NodeID][]string // nodeID -> repos + rmut sync.RWMutex // protects the above repoState map[string]repoState // repo -> state repoStateChanged map[string]time.Time // repo -> time when state changed @@ -90,8 +89,6 @@ type Model struct { sentLocalVer map[protocol.NodeID]map[string]uint64 slMut sync.Mutex - sup suppressor - addedRepo bool started bool } @@ -117,12 +114,10 @@ func NewModel(indexDir string, cfg *config.Configuration, clientName, clientVers nodeRepos: make(map[protocol.NodeID][]string), repoState: make(map[string]repoState), repoStateChanged: make(map[string]time.Time), - suppressor: make(map[string]*suppressor), protoConn: make(map[protocol.NodeID]protocol.Connection), rawConn: make(map[protocol.NodeID]io.Closer), nodeVer: make(map[protocol.NodeID]string), sentLocalVer: make(map[protocol.NodeID]map[string]uint64), - sup: suppressor{threshold: int64(cfg.Options.MaxChangeKbps)}, } var timeout = 20 * 60 // seconds @@ -694,7 +689,6 @@ func (m *Model) AddRepo(cfg config.RepositoryConfiguration) { m.rmut.Lock() m.repoCfgs[cfg.ID] = cfg m.repoFiles[cfg.ID] = files.NewSet(cfg.ID, m.db) - m.suppressor[cfg.ID] = &suppressor{threshold: int64(m.cfg.Options.MaxChangeKbps)} m.repoNodes[cfg.ID] = make([]protocol.NodeID, len(cfg.Nodes)) for i, node := range cfg.Nodes { @@ -771,7 +765,6 @@ func (m *Model) ScanRepoSub(repo, sub string) error { IgnoreFile: ".stignore", BlockSize: scanner.StandardBlockSize, TempNamer: defTempNamer, - Suppressor: m.suppressor[repo], CurrentFiler: cFiler{m, repo}, IgnorePerms: m.repoCfgs[repo].IgnorePerms, } diff --git a/model/suppressor.go b/model/suppressor.go deleted file mode 100644 index 590b034e5..000000000 --- a/model/suppressor.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file). -// All rights reserved. Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - -package model - -import ( - "os" - "sync" - "time" -) - -const ( - MaxChangeHistory = 4 -) - -type change struct { - size int64 - when time.Time -} - -type changeHistory struct { - changes []change - next int64 - prevSup bool -} - -type suppressor struct { - sync.Mutex - changes map[string]changeHistory - threshold int64 // bytes/s -} - -func (h changeHistory) bandwidth(t time.Time) int64 { - if len(h.changes) == 0 { - return 0 - } - - var t0 = h.changes[0].when - if t == t0 { - return 0 - } - - var bw float64 - for _, c := range h.changes { - bw += float64(c.size) - } - return int64(bw / t.Sub(t0).Seconds()) -} - -func (h *changeHistory) append(size int64, t time.Time) { - c := change{size, t} - if len(h.changes) == MaxChangeHistory { - h.changes = h.changes[1:MaxChangeHistory] - } - h.changes = append(h.changes, c) -} - -func (s *suppressor) Suppress(name string, fi os.FileInfo) (cur, prev bool) { - return s.suppress(name, fi.Size(), time.Now()) -} - -func (s *suppressor) suppress(name string, size int64, t time.Time) (bool, bool) { - s.Lock() - - if s.changes == nil { - s.changes = make(map[string]changeHistory) - } - h := s.changes[name] - sup := h.bandwidth(t) > s.threshold - prevSup := h.prevSup - h.prevSup = sup - if !sup { - h.append(size, t) - } - s.changes[name] = h - - s.Unlock() - - return sup, prevSup -} diff --git a/model/suppressor_test.go b/model/suppressor_test.go deleted file mode 100644 index 4dfc2efd7..000000000 --- a/model/suppressor_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file). -// All rights reserved. Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file. - -package model - -import ( - "testing" - "time" -) - -func TestSuppressor(t *testing.T) { - s := suppressor{threshold: 10000} - t0 := time.Now() - - t1 := t0 - sup, prev := s.suppress("foo", 10000, t1) - if sup { - t.Fatal("Never suppress first change") - } - if prev { - t.Fatal("Incorrect prev status") - } - - // bw is 10000 / 10 = 1000 - t1 = t0.Add(10 * time.Second) - if bw := s.changes["foo"].bandwidth(t1); bw != 1000 { - t.Errorf("Incorrect bw %d", bw) - } - sup, prev = s.suppress("foo", 10000, t1) - if sup { - t.Fatal("Should still be fine") - } - if prev { - t.Fatal("Incorrect prev status") - } - - // bw is (10000 + 10000) / 11 = 1818 - t1 = t0.Add(11 * time.Second) - if bw := s.changes["foo"].bandwidth(t1); bw != 1818 { - t.Errorf("Incorrect bw %d", bw) - } - sup, prev = s.suppress("foo", 100500, t1) - if sup { - t.Fatal("Should still be fine") - } - if prev { - t.Fatal("Incorrect prev status") - } - - // bw is (10000 + 10000 + 100500) / 12 = 10041 - t1 = t0.Add(12 * time.Second) - if bw := s.changes["foo"].bandwidth(t1); bw != 10041 { - t.Errorf("Incorrect bw %d", bw) - } - sup, prev = s.suppress("foo", 10000000, t1) // value will be ignored - if !sup { - t.Fatal("Should be over threshold") - } - if prev { - t.Fatal("Incorrect prev status") - } - - // bw is (10000 + 10000 + 100500) / 15 = 8033 - t1 = t0.Add(15 * time.Second) - if bw := s.changes["foo"].bandwidth(t1); bw != 8033 { - t.Errorf("Incorrect bw %d", bw) - } - sup, prev = s.suppress("foo", 10000000, t1) - if sup { - t.Fatal("Should be Ok") - } - if !prev { - t.Fatal("Incorrect prev status") - } -} - -func TestHistory(t *testing.T) { - h := changeHistory{} - - t0 := time.Now() - h.append(40, t0) - - if l := len(h.changes); l != 1 { - t.Errorf("Incorrect history length %d", l) - } - if s := h.changes[0].size; s != 40 { - t.Errorf("Incorrect first record size %d", s) - } - - for i := 1; i < MaxChangeHistory; i++ { - h.append(int64(40+i), t0.Add(time.Duration(i)*time.Second)) - } - - if l := len(h.changes); l != MaxChangeHistory { - t.Errorf("Incorrect history length %d", l) - } - if s := h.changes[0].size; s != 40 { - t.Errorf("Incorrect first record size %d", s) - } - if s := h.changes[MaxChangeHistory-1].size; s != 40+MaxChangeHistory-1 { - t.Errorf("Incorrect last record size %d", s) - } - - h.append(999, t0.Add(time.Duration(999)*time.Second)) - - if l := len(h.changes); l != MaxChangeHistory { - t.Errorf("Incorrect history length %d", l) - } - if s := h.changes[0].size; s != 41 { - t.Errorf("Incorrect first record size %d", s) - } - if s := h.changes[MaxChangeHistory-1].size; s != 999 { - t.Errorf("Incorrect last record size %d", s) - } - -} diff --git a/scanner/walk.go b/scanner/walk.go index 94e1c5921..b5d1cb3a9 100644 --- a/scanner/walk.go +++ b/scanner/walk.go @@ -32,10 +32,6 @@ type Walker struct { TempNamer TempNamer // If CurrentFiler is not nil, it is queried for the current file before rescanning. CurrentFiler CurrentFiler - // If Suppressor is not nil, it is queried for supression of modified files. - // Suppressed files will be returned with empty metadata and the Suppressed flag set. - // Requires CurrentFiler to be set. - Suppressor Suppressor // If IgnorePerms is true, changes to permission bits will not be // detected. Scanned files will get zero permission bits and the // NoPermissionBits flag set. @@ -49,11 +45,6 @@ type TempNamer interface { IsTemporary(path string) bool } -type Suppressor interface { - // Supress returns true if the update to the named file should be ignored. - Suppress(name string, fi os.FileInfo) (bool, bool) -} - type CurrentFiler interface { // CurrentFile returns the file as seen at last scan. CurrentFile(name string) protocol.FileInfo @@ -201,22 +192,6 @@ func (w *Walker) walkAndHashFiles(fchan chan protocol.FileInfo, ign map[string][ return nil } - if w.Suppressor != nil { - if cur, prev := w.Suppressor.Suppress(rn, info); cur && !prev { - l.Infof("Changes to %q are being temporarily suppressed because it changes too frequently.", p) - cf.Flags |= protocol.FlagInvalid - cf.Version = lamport.Default.Tick(cf.Version) - cf.LocalVersion = 0 - if debug { - l.Debugln("suppressed:", cf) - } - fchan <- cf - return nil - } else if prev && !cur { - l.Infof("Changes to %q are no longer suppressed.", p) - } - } - if debug { l.Debugln("rescan:", cf, info.ModTime().Unix(), info.Mode()&os.ModePerm) }