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")
 
 
        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]
 
 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]
        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)
        }
        // 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