if cn.needRequestUpdate != "" {
return
}
- if reason != peerUpdateRequestsTimerReason && !cn.isLowOnRequests() {
- return
- }
cn.needRequestUpdate = reason
cn.handleUpdateRequests()
}
if t.closed.IsSet() {
return
}
+ if t.dataDownloadDisallowed.Bool() {
+ return
+ }
input := t.getRequestStrategyInput()
requestHeap := desiredPeerRequests{
peer: p,
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)
}
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.
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.