// DHT: http://www.bittorrent.org/beps/bep_0005.html
extensionBytes = "\x00\x00\x00\x00\x00\x10\x00\x01"
- socketsPerTorrent = 40
+ socketsPerTorrent = 40
+ torrentPeersHighWater = 1000
+ torrentPeersLowWater = socketsPerTorrent * 5
)
// Currently doesn't really queue, but should in the future.
t.wantPeers.Broadcast()
}
-// Adds peers to the swarm for the torrent corresponding to infoHash.
-func (me *Client) AddPeers(infoHash InfoHash, peers []Peer) error {
- me.mu.Lock()
- defer me.mu.Unlock()
- t := me.torrent(infoHash)
- if t == nil {
- return errors.New("no such torrent")
- }
+func (me *Client) addPeers(t *torrent, peers []Peer) {
blocked := 0
for i, p := range peers {
if me.ipBlockRange(p.IP) == nil {
}
t.AddPeers(peers)
me.openNewConns(t)
+}
+
+// Adds peers to the swarm for the torrent corresponding to infoHash.
+func (me *Client) AddPeers(infoHash InfoHash, peers []Peer) error {
+ me.mu.Lock()
+ defer me.mu.Unlock()
+ t := me.torrent(infoHash)
+ if t == nil {
+ return errors.New("no such torrent")
+ }
+ me.addPeers(t, peers)
return nil
}
return false
default:
}
- if len(t.Peers) < socketsPerTorrent*5 {
+ if len(t.Peers) < torrentPeersLowWater {
return true
}
cl.mu.Unlock()
}).String()] = struct{}{}
}
// log.Printf("%s: %d new peers from DHT", t, len(v.Peers))
- err = cl.AddPeers(t.InfoHash, func() (ret []Peer) {
+ cl.mu.Lock()
+ cl.addPeers(t, func() (ret []Peer) {
for _, cp := range v.Peers {
ret = append(ret, Peer{
IP: cp.IP[:],
}
return
}())
- if err != nil {
- log.Printf("error adding peers from dht for torrent %q: %s", t, err)
+ numPeers := len(t.Peers)
+ cl.mu.Unlock()
+ if numPeers >= torrentPeersHighWater {
break getPeers
}
case <-t.ceasingNetworking: