return cn.peerImpl._request(ppReq), nil
}
+var peerUpdateRequestsPeerCancelReason = "Peer.cancel"
+
func (me *Peer) cancel(r RequestIndex) {
if !me.deleteRequest(r) {
panic("request not existing should have been guarded")
}
me.decPeakRequests()
if me.isLowOnRequests() {
- me.updateRequests("Peer.cancel")
+ me.updateRequests(peerUpdateRequestsPeerCancelReason)
}
}
}
}
+var peerUpdateRequestsRemoteRejectReason = "Peer.remoteRejectedRequest"
+
// Returns true if it was valid to reject the request.
func (c *Peer) remoteRejectedRequest(r RequestIndex) bool {
if c.deleteRequest(r) {
return false
}
if c.isLowOnRequests() {
- c.updateRequests("Peer.remoteRejectedRequest")
+ c.updateRequests(peerUpdateRequestsRemoteRejectReason)
}
c.decExpectedChunkReceive(r)
return true
panic("changed")
}
- if p.needRequestUpdate == "Peer.remoteRejectedRequest" {
+ // don't add requests on reciept of a reject - because this causes request back
+ // to potentially permanently unresponive peers - which just adds network noise. If
+ // the peer can handle more requests it will send an "unchoked" message - which
+ // will cause it to get added back to the request queue
+ if p.needRequestUpdate == peerUpdateRequestsRemoteRejectReason {
continue
}
existing := t.requestingPeer(req)
if existing != nil && existing != p {
- if p.needRequestUpdate == "Peer.cancel" {
+ // don't steal on cancel - because this is triggered by t.cancelRequest below
+ // which means that the cancelled can immediately try to steal back a request
+ // it has lost which can lead to circular cancel/add processing
+ if p.needRequestUpdate == peerUpdateRequestsPeerCancelReason {
continue
}