unexpectedChunksReceived = expvar.NewInt("chunksReceivedUnexpected")
chunksReceived = expvar.NewInt("chunksReceived")
- peersFoundByDHT = expvar.NewInt("peersFoundByDHT")
- peersFoundByPEX = expvar.NewInt("peersFoundByPEX")
- peersFoundByTracker = expvar.NewInt("peersFoundByTracker")
+ peersAddedBySource = expvar.NewMap("peersAddedBySource")
uploadChunksPosted = expvar.NewInt("uploadChunksPosted")
unexpectedCancels = expvar.NewInt("unexpectedCancels")
return
}())
me.mu.Unlock()
- peersFoundByPEX.Add(int64(len(pexMsg.Added)))
}()
default:
err = fmt.Errorf("unexpected extended message ID: %v", msg.ExtendedID)
// The spec says to scrub these yourselves. Fine.
continue
}
- t.addPeer(p)
+ t.addPeer(p, me)
}
- me.openNewConns(t)
}
func (cl *Client) cachedMetaInfoFilename(ih InfoHash) string {
}).String()
allAddrs[key] = struct{}{}
}
- peersFoundByDHT.Add(int64(len(addPeers)))
cl.mu.Lock()
cl.addPeers(t, addPeers)
numPeers := len(t.Peers)
cl.mu.Unlock()
// log.Printf("%s: %d new peers from %s", t, len(peers), tr)
- peersFoundByTracker.Add(int64(len(peers)))
time.Sleep(time.Second * time.Duration(resp.Interval))
return nil
}
}
-func (t *torrent) addPeer(p Peer) {
- t.Peers[peersKey{string(p.IP), p.Port}] = p
+func (t *torrent) addPeer(p Peer, cl *Client) {
+ cl.openNewConns(t)
+ if len(t.Peers) >= torrentPeersHighWater {
+ return
+ }
+ key := peersKey{string(p.IP), p.Port}
+ if _, ok := t.Peers[key]; ok {
+ return
+ }
+ t.Peers[key] = p
+ peersAddedBySource.Add(string(p.Source), 1)
+ cl.openNewConns(t)
+
}
func (t *torrent) invalidateMetadata() {