Add ArtPoll backoff when hearing polls from other sources
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
45
discovery.go
45
discovery.go
@@ -18,20 +18,22 @@ type Node struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Discovery struct {
|
type Discovery struct {
|
||||||
sender *Sender
|
sender *Sender
|
||||||
receiver *Receiver
|
receiver *Receiver
|
||||||
nodes map[string]*Node
|
nodes map[string]*Node
|
||||||
nodesMu sync.RWMutex
|
nodesMu sync.RWMutex
|
||||||
localIP [4]byte
|
localIP [4]byte
|
||||||
localMAC [6]byte
|
localMAC [6]byte
|
||||||
broadcast net.IP
|
broadcast net.IP
|
||||||
shortName string
|
shortName string
|
||||||
longName string
|
longName string
|
||||||
inputUnivs []Universe
|
inputUnivs []Universe
|
||||||
outputUnivs []Universe
|
outputUnivs []Universe
|
||||||
pollTargets []*net.UDPAddr
|
pollTargets []*net.UDPAddr
|
||||||
done chan struct{}
|
done chan struct{}
|
||||||
onChange func(*Node)
|
onChange func(*Node)
|
||||||
|
lastPollHeard time.Time
|
||||||
|
pollMu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDiscovery(sender *Sender, shortName, longName string, inputUnivs, outputUnivs []Universe, pollTargets []*net.UDPAddr) *Discovery {
|
func NewDiscovery(sender *Sender, shortName, longName string, inputUnivs, outputUnivs []Universe, pollTargets []*net.UDPAddr) *Discovery {
|
||||||
@@ -86,6 +88,14 @@ func (d *Discovery) pollLoop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Discovery) sendPolls() {
|
func (d *Discovery) sendPolls() {
|
||||||
|
d.pollMu.Lock()
|
||||||
|
lastHeard := d.lastPollHeard
|
||||||
|
d.pollMu.Unlock()
|
||||||
|
|
||||||
|
if time.Since(lastHeard) < 15*time.Second {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for _, target := range d.pollTargets {
|
for _, target := range d.pollTargets {
|
||||||
d.sender.SendPoll(target)
|
d.sender.SendPoll(target)
|
||||||
}
|
}
|
||||||
@@ -145,6 +155,13 @@ func (d *Discovery) HandlePollReply(src *net.UDPAddr, pkt *PollReplyPacket) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *Discovery) HandlePoll(src *net.UDPAddr) {
|
func (d *Discovery) HandlePoll(src *net.UDPAddr) {
|
||||||
|
localIP := net.IP(d.localIP[:])
|
||||||
|
if !src.IP.Equal(localIP) {
|
||||||
|
d.pollMu.Lock()
|
||||||
|
d.lastPollHeard = time.Now()
|
||||||
|
d.pollMu.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
if d.receiver == nil {
|
if d.receiver == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user