diff --git a/config/config.go b/config/config.go
index 66f3b746..cca4fc53 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 26eee24b..9c6faf49 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 727b3876..0f8803ff 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 590b034e..00000000
--- 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 4dfc2efd..00000000
--- 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 94e1c592..b5d1cb3a 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)
}