Archived
Show scan rate in web GUI
This commit is contained in:
1 parent
37f866b47f
commit
a8a2192cf9
7 files changed
+80
-16
No files matched your search
@@ -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)
|
||||
|
||||
+1
-1
@@ -228,7 +228,7 @@
|
||||
<span ng-switch-when="scanning">
|
||||
<span class="hidden-xs" translate>Scanning</span>
|
||||
<span class="hidden-xs" ng-if="scanPercentage(folder.id) != undefined">
|
||||
({{scanPercentage(folder.id)}}%)
|
||||
(<span class="hidden-xs" ng-if="scanRate(folder.id) > 0">{{scanRate(folder.id) | binary}}B/s, </span>{{scanPercentage(folder.id)}}%)
|
||||
</span>
|
||||
<span class="visible-xs">◼</span>
|
||||
</span>
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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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 truncated
|
||||
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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 truncated
|
||||
assets["index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
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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 truncated
|
||||
assets["syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
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==")
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
+56
-4
@@ -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)
|
||||
}
|
||||
Reference in new issue
Block a user