Refresh requests after a second of no updates
This commit is contained in:
parent
700542de89
commit
1201ccc53b
11
client.go
11
client.go
|
@ -9,6 +9,7 @@ import (
|
|||
"expvar"
|
||||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"net"
|
||||
"net/http"
|
||||
"sort"
|
||||
|
@ -956,6 +957,16 @@ func (cl *Client) runHandshookConn(c *PeerConn, t *Torrent) error {
|
|||
defer t.dropConnection(c)
|
||||
c.startWriter()
|
||||
cl.sendInitialMessages(c, t)
|
||||
c.updateRequestsTimer = time.AfterFunc(math.MaxInt64, func() {
|
||||
if c.needRequestUpdate != "" {
|
||||
return
|
||||
}
|
||||
if c.actualRequestState.Requests.IsEmpty() {
|
||||
panic("updateRequestsTimer should have been stopped")
|
||||
}
|
||||
c.updateRequests("updateRequestsTimer")
|
||||
})
|
||||
c.updateRequestsTimer.Stop()
|
||||
err := c.mainReadLoop()
|
||||
if err != nil {
|
||||
return fmt.Errorf("main read loop: %w", err)
|
||||
|
|
|
@ -84,6 +84,7 @@ type Peer struct {
|
|||
// Stuff controlled by the local peer.
|
||||
needRequestUpdate string
|
||||
actualRequestState requestState
|
||||
updateRequestsTimer *time.Timer
|
||||
cancelledRequests roaring.Bitmap
|
||||
lastBecameInterested time.Time
|
||||
priorInterest time.Duration
|
||||
|
@ -414,6 +415,9 @@ func (cn *PeerConn) onClose() {
|
|||
if cn.pex.IsEnabled() {
|
||||
cn.pex.Close()
|
||||
}
|
||||
if cn.updateRequestsTimer != nil {
|
||||
cn.updateRequestsTimer.Stop()
|
||||
}
|
||||
cn.tickleWriter()
|
||||
if cn.conn != nil {
|
||||
cn.conn.Close()
|
||||
|
|
|
@ -253,7 +253,7 @@ func (p *Peer) applyNextRequestState() bool {
|
|||
}
|
||||
|
||||
func (p *Peer) applyRequestState(next requestState) bool {
|
||||
current := p.actualRequestState
|
||||
current := &p.actualRequestState
|
||||
if !p.setInterested(next.Interested) {
|
||||
return false
|
||||
}
|
||||
|
@ -268,8 +268,9 @@ func (p *Peer) applyRequestState(next requestState) bool {
|
|||
}
|
||||
next.Requests.Iterate(func(req uint32) bool {
|
||||
if p.cancelledRequests.Contains(req) {
|
||||
log.Printf("waiting for cancelled request %v", req)
|
||||
return false
|
||||
// Waiting for a reject or piece message, which will suitably trigger us to update our
|
||||
// requests, so we can skip this one with no additional consideration.
|
||||
return true
|
||||
}
|
||||
if maxRequests(current.Requests.GetCardinality()) >= p.nominalMaxRequests() {
|
||||
log.Printf("not assigning all requests [desired=%v, cancelled=%v, max=%v]",
|
||||
|
@ -288,6 +289,11 @@ func (p *Peer) applyRequestState(next requestState) bool {
|
|||
})
|
||||
if more {
|
||||
p.needRequestUpdate = ""
|
||||
if current.Requests.IsEmpty() {
|
||||
p.updateRequestsTimer.Stop()
|
||||
} else {
|
||||
p.updateRequestsTimer.Reset(time.Second)
|
||||
}
|
||||
}
|
||||
return more
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue