- for _, peer := range peers {
- req := Request{pp.Integer(p.index), chunk}
- _, err := peer.request(req)
- if err == nil {
- //log.Printf("requested %v", req)
- break
+ req := Request{pp.Integer(p.index), chunk}
+ const skipAlreadyRequested = false
+ if skipAlreadyRequested {
+ alreadyRequested := false
+ p.t.iterPeers(func(p *Peer) {
+ if _, ok := p.requests[req]; ok {
+ alreadyRequested = true
+ }
+ })
+ if alreadyRequested {
+ return true
+ }
+ }
+ alreadyRequested := false
+ for peerIndex, peer := range peers {
+ if alreadyRequested {
+ // Cancel all requests from "slower" peers after the one that requested it.
+ peer.cancel(req)
+ } else {
+ err := peer.request(req)
+ if err == nil {
+ contributed[peerIndex] = struct{}{}
+ alreadyRequested = true
+ //log.Printf("requested %v", req)
+ }