func()

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)
	}
}