From c298ce2eb2de598afba47a7ce7cce3bdd9abc5ca Mon Sep 17 00:00:00 2001 From: h31p Date: Tue, 12 Nov 2019 21:40:16 +0200 Subject: [PATCH] dynamically adjust readahead, for nearly sequential download --- src/server/torr/Torrent.go | 14 +++++++++++++- src/server/torr/storage/memcache/Cache.go | 7 +++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/server/torr/Torrent.go b/src/server/torr/Torrent.go index 1d54208..a10de68 100644 --- a/src/server/torr/Torrent.go +++ b/src/server/torr/Torrent.go @@ -6,6 +6,7 @@ import ( "sort" "sync" "time" + "fmt" "server/settings" "server/utils" @@ -184,6 +185,17 @@ func (t *Torrent) progressEvent() { } t.muTorrent.Unlock() t.lastTimeSpeed = time.Now() + if (t.BytesReadUsefulData > settings.Get().PreloadBufferSize) { + adj := int64((int(t.cache.GetState().PiecesLength) * t.Torrent.Stats().ActivePeers) / (1 + t.cache.ReadersLen())) + switch { + case adj < t.cache.GetState().PiecesLength: + adj = t.cache.GetState().PiecesLength + case adj > t.cache.GetState().PiecesLength * 4: + adj = t.cache.GetState().PiecesLength * 4 + } + t.cache.AdjustRA(adj) + log.Println("Status:", t.Name(), "S:", fmt.Sprintf("%8s", utils.Format(t.DownloadSpeed)), "P:", fmt.Sprintf("%2d", t.Torrent.Stats().ActivePeers), "/", fmt.Sprintf("%2d", t.Torrent.Stats().TotalPeers), "R:", t.cache.ReadersLen(), "RA:", utils.Format(float64(adj))) + } } func (t *Torrent) expired() bool { @@ -223,7 +235,7 @@ func (t *Torrent) NewReader(file *torrent.File, readahead int64) *reader.Reader defer t.muReader.Unlock() reader := reader.NewReader(file) if readahead <= 0 { - readahead = utils.GetReadahead() + readahead = t.cache.GetState().PiecesLength } reader.SetReadahead(readahead) t.cache.AddReader(reader) diff --git a/src/server/torr/storage/memcache/Cache.go b/src/server/torr/storage/memcache/Cache.go index 36e084c..6569b04 100644 --- a/src/server/torr/storage/memcache/Cache.go +++ b/src/server/torr/storage/memcache/Cache.go @@ -211,3 +211,10 @@ func (c *Cache) ReadersLen() int { } return len(c.readers) } + +func (c *Cache) AdjustRA(readahead int64) { + for r, _ := range c.readers { + r.SetReadahead(readahead) + } +} +