]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Revert "Switch requestState to be a slice" v1.44.0
authorMatt Joiner <anacrolix@gmail.com>
Wed, 1 Jun 2022 08:24:50 +0000 (18:24 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 1 Jun 2022 08:24:50 +0000 (18:24 +1000)
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
torrent.go

index 4597ea479cf6f375b4cc4b443d274b04e491c178..2eb15bdaa1483da5977142e1d197ed4b7f66232c 100644 (file)
@@ -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")
index 36b012ee8d656dd47e838ea23e320d76e51b67ad..c8606ad82ccbf2f47aade00c8e3198bff4d71deb 100644 (file)
@@ -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