"log"
"net"
"sync"
+ "time"
"bitbucket.org/anacrolix/go.torrent/util"
)
}
func (s *Server) GetPeers(infoHash string) (*peerStream, error) {
- disc := &peerDiscovery{
- peerStream: &peerStream{
- Values: make(chan peerStreamValue),
- stop: make(chan struct{}),
- },
- triedAddrs: make(map[string]struct{}, 500),
- contactAddrs: make(chan net.Addr),
- transactionClosed: make(chan struct{}),
- server: s,
- infoHash: infoHash,
- }
- go disc.loop()
s.mu.Lock()
startAddrs := func() (ret []net.Addr) {
for _, n := range s.closestGoodNodes(160, infoHash) {
return
}()
s.mu.Unlock()
- for _, addr := range startAddrs {
- disc.contact(addr)
- }
if len(startAddrs) == 0 {
addr, err := bootstrapAddr()
if err != nil {
- disc.Close()
return nil, err
}
+ startAddrs = append(startAddrs, addr)
+ }
+ disc := &peerDiscovery{
+ peerStream: &peerStream{
+ Values: make(chan peerStreamValue),
+ stop: make(chan struct{}),
+ },
+ triedAddrs: make(map[string]struct{}, 500),
+ contactAddrs: make(chan net.Addr),
+ transactionClosed: make(chan struct{}),
+ server: s,
+ infoHash: infoHash,
+ }
+ go disc.loop()
+ for i, addr := range startAddrs {
+ if i != 0 {
+ time.Sleep(time.Microsecond)
+ }
disc.contact(addr)
}
return disc.peerStream, nil