peerconn.go | 2 +- torrent.go | 7 +++---- diff --git a/peerconn.go b/peerconn.go index 4597ea479cf6f375b4cc4b443d274b04e491c178..2eb15bdaa1483da5977142e1d197ed4b7f66232c 100644 --- a/peerconn.go +++ b/peerconn.go @@ -1635,7 +1635,7 @@ c.updateExpectingChunks() 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 36b012ee8d656dd47e838ea23e320d76e51b67ad..c8606ad82ccbf2f47aade00c8e3198bff4d71deb 100644 --- a/torrent.go +++ b/torrent.go @@ -147,7 +147,7 @@ initialPieceCheckDisabled bool 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 @@ // This seems to be all the follow-up tasks after info is set, that can't fail. 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 @@ } 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 @@ p.cancel(r) } // 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