lib/model: Add support for different puller block ordering (#6587)

* WIP

* Tests

* Header and format

* WIP

* Fix tests

* Goland you disappoint me

* Remove CC storage

* Update blockpullreorderer.go
This commit is contained in:
Audrius Butkevicius
2020-05-11 22:44:04 +01:00
committed by GitHub
parent decb967969
commit 6201eebc98
5 changed files with 289 additions and 11 deletions
+12 -11
View File
@@ -25,7 +25,6 @@ import (
"github.com/syncthing/syncthing/lib/ignore"
"github.com/syncthing/syncthing/lib/osutil"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
"github.com/syncthing/syncthing/lib/scanner"
"github.com/syncthing/syncthing/lib/sha256"
"github.com/syncthing/syncthing/lib/sync"
@@ -104,8 +103,9 @@ type sendReceiveFolder struct {
fs fs.Filesystem
versioner versioner.Versioner
queue *jobQueue
writeLimiter *byteSemaphore
queue *jobQueue
blockPullReorderer blockPullReorderer
writeLimiter *byteSemaphore
pullErrors map[string]string // errors for most recent/current iteration
oldPullErrors map[string]string // errors from previous iterations for log filtering only
@@ -114,12 +114,13 @@ type sendReceiveFolder struct {
func newSendReceiveFolder(model *model, fset *db.FileSet, ignores *ignore.Matcher, cfg config.FolderConfiguration, ver versioner.Versioner, fs fs.Filesystem, evLogger events.Logger, ioLimiter *byteSemaphore) service {
f := &sendReceiveFolder{
folder: newFolder(model, fset, ignores, cfg, evLogger, ioLimiter),
fs: fs,
versioner: ver,
queue: newJobQueue(),
writeLimiter: newByteSemaphore(cfg.MaxConcurrentWrites),
pullErrorsMut: sync.NewMutex(),
folder: newFolder(model, fset, ignores, cfg, evLogger, ioLimiter),
fs: fs,
versioner: ver,
queue: newJobQueue(),
blockPullReorderer: newBlockPullReorderer(cfg.BlockPullOrder, model.id, cfg.DeviceIDs()),
writeLimiter: newByteSemaphore(cfg.MaxConcurrentWrites),
pullErrorsMut: sync.NewMutex(),
}
f.folder.puller = f
f.folder.Service = util.AsService(f.serve, f.String())
@@ -1071,8 +1072,8 @@ func (f *sendReceiveFolder) handleFile(file protocol.FileInfo, snap *db.Snapshot
blocks = append(blocks, file.Blocks...)
}
// Shuffle the blocks
rand.Shuffle(blocks)
// Reorder blocks
blocks = f.blockPullReorderer.Reorder(blocks)
f.evLogger.Log(events.ItemStarted, map[string]string{
"folder": f.folderID,