Browse Source

Don't accumulate goroutines forever

Jakob Borg 12 years ago
parent
commit
f5ea00b297
1 changed files with 25 additions and 24 deletions
  1. 25 24
      discover/discover.go

+ 25 - 24
discover/discover.go

@@ -86,6 +86,8 @@ import (
 	"net"
 	"sync"
 	"time"
+
+	"github.com/calmh/syncthing/buffers"
 )
 
 const (
@@ -217,47 +219,46 @@ func (d *Discoverer) externalLookup(node string) (string, bool) {
 		return "", false
 	}
 
-	var res = make(chan string, 1)
 	conn, err := net.DialUDP("udp", nil, extIP)
 	if err != nil {
 		log.Printf("discover/external: %v; no external lookup", err)
 		return "", false
 	}
+	defer conn.Close()
 
-	_, err = conn.Write(EncodePacket(Packet{QueryMagic, 0, node, nil}))
+	err = conn.SetDeadline(time.Now().Add(5 * time.Second))
 	if err != nil {
 		log.Printf("discover/external: %v; no external lookup", err)
 		return "", false
 	}
 
-	go func() {
-		var buf = make([]byte, 1024)
-		n, err := conn.Read(buf)
-		if err != nil {
-			log.Printf("discover/external/read: %v; no external lookup", err)
-			return
-		}
+	_, err = conn.Write(EncodePacket(Packet{QueryMagic, 0, node, nil}))
+	if err != nil {
+		log.Printf("discover/external: %v; no external lookup", err)
+		return "", false
+	}
 
-		pkt, err := DecodePacket(buf[:n])
-		if err != nil {
-			log.Printf("discover/external/read: %v; no external lookup", err)
-			return
-		}
+	var buf = buffers.Get(1024)
+	defer buffers.Put(buf)
 
-		if pkt.Magic != AnnouncementMagic {
-			log.Printf("discover/external/read: bad magic; no external lookup", err)
-			return
-		}
+	n, err := conn.Read(buf)
+	if err != nil {
+		log.Printf("discover/external/read: %v; no external lookup", err)
+		return "", false
+	}
 
-		res <- fmt.Sprintf("%s:%d", ipStr(pkt.IP), pkt.Port)
-	}()
+	pkt, err := DecodePacket(buf[:n])
+	if err != nil {
+		log.Printf("discover/external/read: %v; no external lookup", err)
+		return "", false
+	}
 
-	select {
-	case r := <-res:
-		return r, true
-	case <-time.After(5 * time.Second):
+	if pkt.Magic != AnnouncementMagic {
+		log.Printf("discover/external/read: bad magic; no external lookup", err)
 		return "", false
 	}
+
+	return fmt.Sprintf("%s:%d", ipStr(pkt.IP), pkt.Port), true
 }
 
 func (d *Discoverer) Lookup(node string) (string, bool) {