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:
committed by
Audrius Butkevicius
parent
aecd7c64ce
commit
7ebf58f1bc
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user