lib/discover: Don't leak goroutines (#5950)

This commit is contained in:
Simon Frei
2019-08-22 12:30:57 +02:00
committed by GitHub
parent 24d4290d03
commit 534f07d9ca
4 changed files with 147 additions and 220 deletions

View File

@@ -22,6 +22,7 @@ import (
"github.com/syncthing/syncthing/lib/events"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
"github.com/syncthing/syncthing/lib/util"
"github.com/thejerf/suture"
)
@@ -73,30 +74,20 @@ func NewLocal(id protocol.DeviceID, addr string, addrList AddressLister, evLogge
if err != nil {
return nil, err
}
c.startLocalIPv4Broadcasts(bcPort)
c.beacon = beacon.NewBroadcast(bcPort)
} else {
// A multicast client
c.name = "IPv6 local"
c.startLocalIPv6Multicasts(addr)
c.beacon = beacon.NewMulticast(addr)
}
c.Add(c.beacon)
c.Add(util.AsService(c.recvAnnouncements))
go c.sendLocalAnnouncements()
c.Add(util.AsService(c.sendLocalAnnouncements))
return c, nil
}
func (c *localClient) startLocalIPv4Broadcasts(localPort int) {
c.beacon = beacon.NewBroadcast(localPort)
c.Add(c.beacon)
go c.recvAnnouncements(c.beacon)
}
func (c *localClient) startLocalIPv6Multicasts(localMCAddr string) {
c.beacon = beacon.NewMulticast(localMCAddr)
c.Add(c.beacon)
go c.recvAnnouncements(c.beacon)
}
// Lookup returns a list of addresses the device is available at.
func (c *localClient) Lookup(device protocol.DeviceID) (addresses []string, err error) {
if cache, ok := c.Get(device); ok {
@@ -144,7 +135,7 @@ func (c *localClient) announcementPkt(instanceID int64, msg []byte) ([]byte, boo
return msg, true
}
func (c *localClient) sendLocalAnnouncements() {
func (c *localClient) sendLocalAnnouncements(stop chan struct{}) {
var msg []byte
var ok bool
instanceID := rand.Int63()
@@ -156,13 +147,22 @@ func (c *localClient) sendLocalAnnouncements() {
select {
case <-c.localBcastTick:
case <-c.forcedBcastTick:
case <-stop:
return
}
}
}
func (c *localClient) recvAnnouncements(b beacon.Interface) {
func (c *localClient) recvAnnouncements(stop chan struct{}) {
b := c.beacon
warnedAbout := make(map[string]bool)
for {
select {
case <-stop:
return
default:
}
buf, addr := b.Recv()
if len(buf) < 4 {
l.Debugf("discover: short packet from %s")