From 8ccacbfd17154cedcb99a08438ef4175622ecdd7 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Wed, 1 Jun 2022 18:24:50 +1000 Subject: [PATCH] Revert "Switch requestState to be a slice" This reverts commit 9eb80abc29498ecc8ba2b174457b46ca75296dec. Via email I received a report of excessive memory use: Memory use with a slice is proportional to the total size of all torrents loaded into the Client, which can be very large. --- peerconn.go | 2 +- torrent.go | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/peerconn.go b/peerconn.go index 4597ea47..2eb15bda 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1635,7 +1635,7 @@ func (c *Peer) deleteRequest(r RequestIndex) bool { if c.t.requestingPeer(r) != c { panic("only one peer should have a given request at a time") } - c.t.requestState[r] = requestState{} + delete(c.t.requestState, r) // c.t.iterPeers(func(p *Peer) { // if p.isLowOnRequests() { // p.updateRequests("Peer.deleteRequest") diff --git a/torrent.go b/torrent.go index 36b012ee..c8606ad8 100644 --- a/torrent.go +++ b/torrent.go @@ -147,7 +147,7 @@ type Torrent struct { connsWithAllPieces map[*Peer]struct{} - requestState []requestState + requestState map[RequestIndex]requestState // Chunks we've written to since the corresponding piece was last checked. dirtyChunks typedRoaring.Bitmap[RequestIndex] @@ -464,7 +464,6 @@ func (t *Torrent) pieceRequestOrderKey(i int) request_strategy.PieceRequestOrder func (t *Torrent) onSetInfo() { t.pieceRequestOrder = rand.Perm(t.numPieces()) t.initPieceRequestOrder() - MakeSliceWithLength(&t.requestState, t.numChunks()) MakeSliceWithLength(&t.requestPieceStates, t.numPieces()) for i := range t.pieces { p := &t.pieces[i] @@ -484,6 +483,7 @@ func (t *Torrent) onSetInfo() { t.cl.event.Broadcast() close(t.gotMetainfoC) t.updateWantPeersEvent() + t.requestState = make(map[RequestIndex]requestState) t.tryCreateMorePieceHashers() t.iterPeers(func(p *Peer) { p.onGotInfo(t.info) @@ -2471,8 +2471,7 @@ func (t *Torrent) cancelRequest(r RequestIndex) *Peer { } // TODO: This is a check that an old invariant holds. It can be removed after some testing. //delete(t.pendingRequests, r) - var zeroRequestState requestState - if t.requestState[r] != zeroRequestState { + if _, ok := t.requestState[r]; ok { panic("expected request state to be gone") } return p -- 2.44.0