Fix discovery in the absence of listen addresses (fixes #4418)

This makes it OK to not have any listeners working. Specifically,

- We don't complain about an empty listener address
- We don't complain about not having anything to announce to global
  discovery servers
- We don't send local discovery packets when there is nothing to
  announce.

The last point also fixes a thing where the list of addresses for local
discovery was set at startup time and never refreshed.

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4517
This commit is contained in:
Jakob Borg
2017-11-17 09:12:35 +00:00
committed by Audrius Butkevicius
parent aecd7c64ce
commit 7ebf58f1bc
5 changed files with 51 additions and 17 deletions

View File

@@ -112,24 +112,42 @@ func (c *localClient) Error() error {
return c.beacon.Error()
}
func (c *localClient) announcementPkt() Announce {
return Announce{
ID: c.myID,
Addresses: c.addrList.AllAddresses(),
InstanceID: rand.Int63(),
// announcementPkt appends the local discovery packet to send to msg. Returns
// true if the packet should be sent, false if there is nothing useful to
// send.
func (c *localClient) announcementPkt(instanceID int64, msg []byte) ([]byte, bool) {
addrs := c.addrList.AllAddresses()
if len(addrs) == 0 {
// Nothing to announce
return msg, false
}
}
func (c *localClient) sendLocalAnnouncements() {
msg := make([]byte, 4)
if cap(msg) >= 4 {
msg = msg[:4]
} else {
msg = make([]byte, 4)
}
binary.BigEndian.PutUint32(msg, Magic)
var pkt = c.announcementPkt()
pkt := Announce{
ID: c.myID,
Addresses: addrs,
InstanceID: instanceID,
}
bs, _ := pkt.Marshal()
msg = append(msg, bs...)
return msg, true
}
func (c *localClient) sendLocalAnnouncements() {
var msg []byte
var ok bool
instanceID := rand.Int63()
for {
c.beacon.Send(msg)
if msg, ok = c.announcementPkt(instanceID, msg[:0]); ok {
c.beacon.Send(msg)
}
select {
case <-c.localBcastTick: