From a8a2192cf9923fb0ed61a374eff24aa6aa0329af Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 17 Nov 2015 21:08:36 +0100 Subject: [PATCH] Show scan rate in web GUI --- cmd/syncthing/verbose.go | 3 +- gui/index.html | 2 +- gui/syncthing/core/syncthingController.js | 10 +++- lib/auto/gui.files.go | 6 +-- lib/scanner/blockqueue.go | 6 +-- lib/scanner/blocks.go | 9 ++-- lib/scanner/walk.go | 60 +++++++++++++++++++++-- 7 files changed, 80 insertions(+), 16 deletions(-) diff --git a/cmd/syncthing/verbose.go b/cmd/syncthing/verbose.go index 1d830479b..9cf317062 100644 --- a/cmd/syncthing/verbose.go +++ b/cmd/syncthing/verbose.go @@ -126,11 +126,12 @@ func (s *verboseSvc) formatEvent(ev events.Event) string { folder := data["folder"].(string) current := data["current"].(int64) total := data["total"].(int64) + rate := data["rate"].(float64) / 1024 / 1024 var pct int64 if total > 0 { pct = 100 * current / total } - return fmt.Sprintf("Scanning folder %q, %d%% done", folder, pct) + return fmt.Sprintf("Scanning folder %q, %d%% done (%.01f MB/s)", folder, pct, rate) case events.DevicePaused: data := ev.Data.(map[string]string) diff --git a/gui/index.html b/gui/index.html index fb6eb0840..49431ac7a 100755 --- a/gui/index.html +++ b/gui/index.html @@ -228,7 +228,7 @@ diff --git a/gui/syncthing/core/syncthingController.js b/gui/syncthing/core/syncthingController.js index 64c8f1151..deb215c01 100755 --- a/gui/syncthing/core/syncthingController.js +++ b/gui/syncthing/core/syncthingController.js @@ -321,7 +321,8 @@ angular.module('syncthing.core') var data = arg.data; $scope.scanProgress[data.folder] = { current: data.current, - total: data.total + total: data.total, + rate: data.rate, }; console.log("FolderScanProgress", data); }); @@ -668,6 +669,13 @@ angular.module('syncthing.core') return Math.floor(pct); } + $scope.scanRate = function (folder) { + if (!$scope.scanProgress[folder]) { + return 0; + } + return $scope.scanProgress[folder].rate; + } + $scope.deviceStatus = function (deviceCfg) { if ($scope.deviceFolders(deviceCfg).length === 0) { return 'unused'; diff --git a/lib/auto/gui.files.go b/lib/auto/gui.files.go index 942fc5a65..3f36a7663 100644 --- a/lib/auto/gui.files.go +++ b/lib/auto/gui.files.go @@ -5,7 +5,7 @@ import ( ) const ( - AssetsBuildDate = "Mon, 16 Nov 2015 20:57:53 GMT" + AssetsBuildDate = "Tue, 17 Nov 2015 20:08:12 GMT" ) func Assets() map[string][]byte { @@ -49,7 +49,7 @@ func Assets() map[string][]byte { assets["assets/lang/lang-zh-TW.json"], _ = base64.StdEncoding.DecodeString("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") assets["assets/lang/prettyprint.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1xSbW7aQBD931Os/MtI9QUqVWrtUtoQEWQg+T3gxd54PWvtBwiiHCcnycUys7aA5Bfz3puZffPwAazQgPXSSu9PvVXoxU/xkmzr5EeSB12DVYDJ92QHRBTgQY/w1wG0xJ264UX6OHI44R7H0lnuGgKVJDCTtovjUjOyUrYMkMAUa61cE2E2y6+MSDeovKzEXGFdmY43S9686gHHCZdNV1dGpFSoaGGviP6rcGzcW4aWLA4oK35fCJEWgFABjzWB6H8BL9crT8R/OnKAz3z0HdBz0knCrcnmJVFzYyXHEH95kea5e+WbQM7iKG6JWRh7lDURIjdt9/6mWeBI/gQfrSF+6lqc0FjHWfXctTRjVL3P8jIS1oc6kBmR5hbOSk8Gdbn+og41RN2arHwgvTRddCfSsYoiR1AG5wbb7sD5HmU1PBxagpvWUsyDfm6yYsF/d6MwPsRFXETK+ulWWYM68gfy+u0DAAD//wEAAP//j0iqQH0CAAA=") assets["assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/yTMvQ6CMBTF8d2naDp7H8FEIcZBo6aSOBiHAhUqTSEtdPDpvacsv38/kpN0EEk7216076LYiZesO7mVjc7s+c/4xuZbZFrDGAd8hk4FGjN0fHA/FoQMlQduvzB2Zr5YGkY6K67Di68BFj0WJ5ymmQq19l5xw0jqhmInJmYZmF9P5XVt9ZTvzR8AAP//AQAA//8eEnv9zQAAAA==") - assets["index.html"], _ = base64.StdEncoding.DecodeString("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") + assets["index.html"], _ = base64.StdEncoding.DecodeString("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") assets["modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3RST0/cPhC9/z7F/HLogkQ2gDjRXaoWqVIlKiHBpceJPUlcHDuyJ9BtlO/eibNNYbUcEv97783Mm9lo8wzKYozbrPUaLVSoKQPG0jhNv7ZZfpGBq3NkDrlGxrxE9aSD77bZMAjVR4JPwKEnuIZVZGSjVjCOB6wn2pUeg06sL95bQneS2KcT+OY/gM3/eS5LUcCt73bB1A3Dye0pXJ5fXMFjQ/Cwc4ob42r43HPjQ1wn+Mx5bEyEB98HRcLXBF99aEHuYl/+JMXAHlhEmEIbwVfp8N3/NtYi3PelNWoWujOKXKQzeF7D5fp8Dd8qQFCS0sK6v4MXjOA8gzaRgyl7Jg0vhhsBSMzKWDqb5X74HhQ68CWjkcURIEPD3F0XRTvHX/tQF6JaSLxiKirPkyGHzcm1QevrZO3+fljNL7ZeXYPFUNNs5jG28o7J8f79GKIh6X4AtBR4/ufDMPW0j+O48ITZXL0lsmFLrwACiZ1ULYmaapsZCZ39ZVQoQya60+Wkuikm6GvuMCS9cfwXsGiulrQLyfv9Gkqvd8khDuiisr2m95n7/NIgZm91Ku9lVl4XLV1m74B3HW2z+bBwSnYgX66pwt5y2sc2gzT8MiStWZSP2PTGGTYtxcWWD66M3ccZliqyyHRzOyV8aNymmJM6Uu6y3W/2yx8AAAD//wEAAP//qvxG6f8DAAA=") assets["syncthing/app.js"], _ = base64.StdEncoding.DecodeString("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") assets["syncthing/core/aboutModalDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOMQ7CMAxF954im1upSnc6cQBG2ENqWktOglwHhFDvTgpSgT/+/yw/F8fMTmxIQ2asYX5ErxPF0fokCE1lSuxAgl7pVgB3TlkPaXAMrbnkQlOKpm7M842uEdQs8af4lLMKed0Z2EP7NymGKzvFo3BZN4NuNei+/06EdztpYNiul75amr56AQAA//8BAAD//xLf4CHFAAAA") @@ -78,7 +78,7 @@ func Assets() map[string][]byte { assets["syncthing/core/selectOnClickDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3SQQWvEIBCF7/srPBRiIEjPXXooe2+hPZYeRKeprJkpo2YpJf+9atLdJWzeSZ/z+Z5q7JPXrAayyYNswg+a+OWwV4YYmnYnspR1DCa6sQyAz8sXPHhnjk0nPlMGHKGQdyeHlk6t+K1QEUNMjFdGkXd4fLjigqFv6ES+dwCMndAxcmhXUNEyoQhlY1bx8hZQNGoWc+cS9iiWlqqH+PZvy3a/yXL+IcicJZNqumHQEV6LvcVVRs2pz2ThQBgzGuTygvf7jw3y3FQxDDTCk/c1KWxFXQBt7Vyqpt8Yn1bedN5N+105/AMAAP//AQAA//+SF+4JDAIAAA==") assets["syncthing/core/shutdownDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOwQqDQAxE737F3qIg672eCv2F9r6sqQZitsRspRT/vdqC1DnOTDIvSJ85qB9TlxlLmF4SbSDpfUyKUBVule9IMRo9t8KQrUuzXChw6qF297xeUBJXVu79rW9StKzyZ/zMyZSinRycoT5EhuODg+FVeU13imajaI6bN8LZDzYy7B+WtliqtvgAAAD//wEAAP//3qFOo80AAAA=") assets["syncthing/core/shutdownDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0TOTaqDMBAH8PXzFMNsXL16gZhNj+AJ0jjWQJwJzgQp1ru3lkK3P/h/uEXGkCGNPepcbZSNEdSCVX1LjZFUEVIU7rHIRuu/TBOCJcvU4763wzcFV1lKJqMWnmBrYM3B6DjQN3+u/MQPD442J77DHBRuRAznMpwlF9cV37juc8o3LwAAAP//AQAA//99X8KxnQAAAA==") - assets["syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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") + assets["syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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") assets["syncthing/core/uniqueFolderDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/7SSwW4yMQyE7zyFD7+0IK3CHc5/b1V74h5tvKzVkIDtQFHFuzdhUaGwtJWqzgVp4vkYW2vDMnnLZhVd8jiuZB8a7SgsTRMZq8kIsowjxkZpmwdSoE3Ch+gdclVDm/I8xQDjCbwdh4sYNXG4MHpzkzJnBlVYPkaHvqo/vXsKL7MLoDRxjTWgX9VgVVlqaJT95ApbVHzzb21ZkMWkIB21Oj6jtoS7hfUJh8JF1J7+z6Ajzev/fyUpv/cCRdMp7BCki8m7UClsrSdnFe8G+pqCuiiTpPubcyrnjvNBwCFfQvCiaXsMiemsPO3CM2ePM/K86zfdtUPoGYBlWwHrGa3b/6J/a3PHrxf4aScS6OF/dM5B9/ThftzwNnu44p05h/moPL4DAAD//wEAAP//r65WJ1IDAAA=") assets["syncthing/core/upgradingDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOwQrCMBBE7/2K3LaFkt7tSfAX9B7SNV3YJmW7UUT676YKRZ3jzNudcTFkdmKnNGTGGpZH9DpSDNYnQWgqU2QHEvRKtwLkOYgbCnAixylAa665nFCKpm7M881vEtQs8cv4mIsKeT0YOEL7EylOMzvFs3BJ9xndNqP7K70Q3u2oE8P+Yu2rtemrFwAAAP//AQAA//99zQ2GzwAAAA==") assets["syncthing/core/upgradingDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1zOTarDMAwE4PXLKYQ2WSW5gO0zPCg9gHDcVODaxlIIJc3dm5b+QLfDN8yYSx4pAo8W5zJVGjlNCKKks1jkdMoI7HOySLXmpfNcfQzdXBCUNQaL69oe380WbqCVkkTSsG3omj9TnJFC6Zu7wzV5Pe8cWOCz2pvh4Rz88v8YSAIsxPoifb/j4hozPN+75g4AAP//AQAA///kaeW6xgAAAA==") diff --git a/lib/scanner/blockqueue.go b/lib/scanner/blockqueue.go index 9c878733b..41f282081 100644 --- a/lib/scanner/blockqueue.go +++ b/lib/scanner/blockqueue.go @@ -19,7 +19,7 @@ import ( // workers are used in parallel. The outbox will become closed when the inbox // is closed and all items handled. -func newParallelHasher(dir string, blockSize, workers int, outbox, inbox chan protocol.FileInfo, counter *int64, done, cancel chan struct{}) { +func newParallelHasher(dir string, blockSize, workers int, outbox, inbox chan protocol.FileInfo, counter Counter, done, cancel chan struct{}) { wg := sync.NewWaitGroup() wg.Add(workers) @@ -39,7 +39,7 @@ func newParallelHasher(dir string, blockSize, workers int, outbox, inbox chan pr }() } -func HashFile(path string, blockSize int, sizeHint int64, counter *int64) ([]protocol.BlockInfo, error) { +func HashFile(path string, blockSize int, sizeHint int64, counter Counter) ([]protocol.BlockInfo, error) { fd, err := os.Open(path) if err != nil { l.Debugln("open:", err) @@ -59,7 +59,7 @@ func HashFile(path string, blockSize int, sizeHint int64, counter *int64) ([]pro return Blocks(fd, blockSize, sizeHint, counter) } -func hashFiles(dir string, blockSize int, outbox, inbox chan protocol.FileInfo, counter *int64, cancel chan struct{}) { +func hashFiles(dir string, blockSize int, outbox, inbox chan protocol.FileInfo, counter Counter, cancel chan struct{}) { for { select { case f, ok := <-inbox: diff --git a/lib/scanner/blocks.go b/lib/scanner/blocks.go index 455aa4cb5..a1f72a1e4 100644 --- a/lib/scanner/blocks.go +++ b/lib/scanner/blocks.go @@ -11,15 +11,18 @@ import ( "crypto/sha256" "fmt" "io" - "sync/atomic" "github.com/syncthing/syncthing/lib/protocol" ) var SHA256OfNothing = []uint8{0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55} +type Counter interface { + Update(bytes int64) +} + // Blocks returns the blockwise hash of the reader. -func Blocks(r io.Reader, blocksize int, sizehint int64, counter *int64) ([]protocol.BlockInfo, error) { +func Blocks(r io.Reader, blocksize int, sizehint int64, counter Counter) ([]protocol.BlockInfo, error) { hf := sha256.New() hashLength := hf.Size() @@ -50,7 +53,7 @@ func Blocks(r io.Reader, blocksize int, sizehint int64, counter *int64) ([]proto } if counter != nil { - atomic.AddInt64(counter, int64(n)) + counter.Update(int64(n)) } // Carve out a hash-sized chunk of "hashes" to store the hash for this diff --git a/lib/scanner/walk.go b/lib/scanner/walk.go index 17a06442f..c650e1746 100644 --- a/lib/scanner/walk.go +++ b/lib/scanner/walk.go @@ -16,6 +16,7 @@ import ( "time" "unicode/utf8" + "github.com/rcrowley/go-metrics" "github.com/syncthing/syncthing/lib/db" "github.com/syncthing/syncthing/lib/events" "github.com/syncthing/syncthing/lib/osutil" @@ -143,7 +144,11 @@ func (w *Walker) Walk() (chan protocol.FileInfo, error) { // which it receives the files we ask it to hash. go func() { var filesToHash []protocol.FileInfo - var total, progress int64 = 1, 0 + var total int64 = 1 + + progress := newByteCounter() + defer progress.Close() + for file := range toHashChan { filesToHash = append(filesToHash, file) total += int64(file.CachedSize) @@ -151,7 +156,7 @@ func (w *Walker) Walk() (chan protocol.FileInfo, error) { realToHashChan := make(chan protocol.FileInfo) done := make(chan struct{}) - newParallelHasher(w.Dir, w.BlockSize, w.Hashers, finishedChan, realToHashChan, &progress, done, w.Cancel) + newParallelHasher(w.Dir, w.BlockSize, w.Hashers, finishedChan, realToHashChan, progress, done, w.Cancel) // A routine which actually emits the FolderScanProgress events // every w.ProgressTicker ticks, until the hasher routines terminate. @@ -163,12 +168,14 @@ func (w *Walker) Walk() (chan protocol.FileInfo, error) { ticker.Stop() return case <-ticker.C: - current := atomic.LoadInt64(&progress) - l.Debugf("Walk %s %s current progress %d/%d (%d%%)", w.Dir, w.Subs, current, total, current*100/total) + current := progress.Total() + rate := progress.Rate() + l.Debugf("Walk %s %s current progress %d/%d at %.01f MB/s (%d%%)", w.Dir, w.Subs, current, total, rate/1024/1024, current*100/total) events.Default.Log(events.FolderScanProgress, map[string]interface{}{ "folder": w.Folder, "current": current, "total": total, + "rate": rate, // bytes per second }) case <-w.Cancel: ticker.Stop() @@ -492,3 +499,48 @@ func SymlinkFlags(t symlinks.TargetType) uint32 { } panic("unknown symlink TargetType") } + +// A byteCounter gets bytes added to it via Update() and then provides the +// Total() and one minute moving average Rate() in bytes per second. +type byteCounter struct { + total int64 + metrics.EWMA + stop chan struct{} +} + +func newByteCounter() *byteCounter { + c := &byteCounter{ + EWMA: metrics.NewEWMA1(), // a one minute exponentially weighted moving average + stop: make(chan struct{}), + } + go c.ticker() + return c +} + +func (c *byteCounter) ticker() { + // The metrics.EWMA expects clock ticks every five seconds in order to + // decay the average properly. + t := time.NewTicker(5 * time.Second) + for { + select { + case <-t.C: + c.Tick() + case <-c.stop: + t.Stop() + return + } + } +} + +func (c *byteCounter) Update(bytes int64) { + atomic.AddInt64(&c.total, bytes) + c.EWMA.Update(bytes) +} + +func (c *byteCounter) Total() int64 { + return atomic.LoadInt64(&c.total) +} + +func (c *byteCounter) Close() { + close(c.stop) +}