in lib/torrent/scheduler/events.go [272:300]
func (e announceResultEvent) apply(s *state) {
ctrl, ok := s.torrentControls[e.infoHash]
if !ok {
s.log("hash", e.infoHash).Info("Dispatcher closed after announce response received")
return
}
s.announceQueue.Ready(e.infoHash)
if ctrl.dispatcher.Complete() {
// Torrent is already complete, don't open any new connections.
return
}
for _, p := range e.peers {
if p.PeerID == s.sched.pctx.PeerID {
// Tracker may return our own peer.
continue
}
if s.conns.Blacklisted(p.PeerID, e.infoHash) {
continue
}
if err := s.conns.AddPending(p.PeerID, e.infoHash, nil); err != nil {
if err == connstate.ErrTorrentAtCapacity {
break
}
continue
}
go s.sched.initializeOutgoingHandshake(
p, ctrl.dispatcher.Stat(), ctrl.dispatcher.RemoteBitfields(), ctrl.namespace)
}
}