Fix requests still being made when downloading is disallowed
https://github.com/anacrolix/torrent/issues/889
This commit is contained in:
parent
b5a11f047e
commit
bdcb6c9fcd
3
peer.go
3
peer.go
|
@ -480,9 +480,6 @@ func (cn *Peer) updateRequests(reason string) {
|
|||
if cn.needRequestUpdate != "" {
|
||||
return
|
||||
}
|
||||
if reason != peerUpdateRequestsTimerReason && !cn.isLowOnRequests() {
|
||||
return
|
||||
}
|
||||
cn.needRequestUpdate = reason
|
||||
cn.handleUpdateRequests()
|
||||
}
|
||||
|
|
|
@ -173,6 +173,9 @@ func (p *Peer) getDesiredRequestState() (desired desiredRequestState) {
|
|||
if t.closed.IsSet() {
|
||||
return
|
||||
}
|
||||
if t.dataDownloadDisallowed.Bool() {
|
||||
return
|
||||
}
|
||||
input := t.getRequestStrategyInput()
|
||||
requestHeap := desiredPeerRequests{
|
||||
peer: p,
|
||||
|
@ -257,13 +260,6 @@ func (p *Peer) applyRequestState(next desiredRequestState) {
|
|||
|
||||
t := p.t
|
||||
originalRequestCount := current.Requests.GetCardinality()
|
||||
// We're either here on a timer, or because we ran out of requests. Both are valid reasons to
|
||||
// alter peakRequests.
|
||||
if originalRequestCount != 0 && p.needRequestUpdate != peerUpdateRequestsTimerReason {
|
||||
panic(fmt.Sprintf(
|
||||
"expected zero existing requests (%v) for update reason %q",
|
||||
originalRequestCount, p.needRequestUpdate))
|
||||
}
|
||||
for requestHeap.Len() != 0 && maxRequests(current.Requests.GetCardinality()+current.Cancelled.GetCardinality()) < p.nominalMaxRequests() {
|
||||
req := heap.Pop(requestHeap)
|
||||
existing := t.requestingPeer(req)
|
||||
|
|
18
torrent.go
18
torrent.go
|
@ -2483,15 +2483,27 @@ func (t *Torrent) onWriteChunkErr(err error) {
|
|||
}
|
||||
|
||||
func (t *Torrent) DisallowDataDownload() {
|
||||
t.cl.lock()
|
||||
defer t.cl.unlock()
|
||||
t.disallowDataDownloadLocked()
|
||||
}
|
||||
|
||||
func (t *Torrent) disallowDataDownloadLocked() {
|
||||
t.dataDownloadDisallowed.Set()
|
||||
t.iterPeers(func(p *Peer) {
|
||||
// Could check if peer request state is empty/not interested?
|
||||
p.updateRequests("disallow data download")
|
||||
p.cancelAllRequests()
|
||||
})
|
||||
}
|
||||
|
||||
func (t *Torrent) AllowDataDownload() {
|
||||
t.cl.lock()
|
||||
defer t.cl.unlock()
|
||||
t.dataDownloadDisallowed.Clear()
|
||||
t.iterPeers(func(p *Peer) {
|
||||
p.updateRequests("allow data download")
|
||||
})
|
||||
}
|
||||
|
||||
// Enables uploading data, if it was disabled.
|
||||
|
@ -2499,9 +2511,9 @@ func (t *Torrent) AllowDataUpload() {
|
|||
t.cl.lock()
|
||||
defer t.cl.unlock()
|
||||
t.dataUploadDisallowed = false
|
||||
for c := range t.conns {
|
||||
c.updateRequests("allow data upload")
|
||||
}
|
||||
t.iterPeers(func(p *Peer) {
|
||||
p.updateRequests("allow data upload")
|
||||
})
|
||||
}
|
||||
|
||||
// Disables uploading data, if it was enabled.
|
||||
|
|
Loading…
Reference in New Issue