Add ArtPoll backoff when hearing polls from other sources

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 08:43:09 -08:00
parent 0a3e9b1daf
commit 5e7400fe51

View File

@@ -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
} }