]> Sergey Matveev's repositories - btrtrc.git/commitdiff
dht: Tidy up GetPeers()
authorMatt Joiner <anacrolix@gmail.com>
Sun, 7 Dec 2014 03:22:12 +0000 (21:22 -0600)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 7 Dec 2014 03:22:12 +0000 (21:22 -0600)
dht/getpeers.go

index 1f136c9c741197488fb78b9c7da17043d955374e..8277a5c190ebeee5a6bc60a0bca08d613c9a77fa 100644 (file)
@@ -4,6 +4,7 @@ import (
        "log"
        "net"
        "sync"
+       "time"
 
        "bitbucket.org/anacrolix/go.torrent/util"
 )
@@ -24,18 +25,6 @@ func (me *peerDiscovery) Close() {
 }
 
 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) {
@@ -44,15 +33,29 @@ func (s *Server) GetPeers(infoHash string) (*peerStream, error) {
                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