Add broadcast packet tracking with rate monitoring

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-25 19:40:39 -08:00
parent b2ec349c51
commit bbd938b924
7 changed files with 438 additions and 105 deletions

View File

@@ -206,14 +206,15 @@ func (e *ErrorTracker) GetUnreachableNodes() []string {
return nodes
}
func (e *ErrorTracker) SetUnreachable(node *Node, ip string) {
changed := e.setUnreachableLocked(node, ip)
func (e *ErrorTracker) SetUnreachable(node *Node, ip string) bool {
changed, becameUnreachable := e.setUnreachableLocked(node, ip)
if changed {
e.t.NotifyUpdate()
}
return becameUnreachable
}
func (e *ErrorTracker) setUnreachableLocked(node *Node, ip string) bool {
func (e *ErrorTracker) setUnreachableLocked(node *Node, ip string) (changed bool, becameUnreachable bool) {
e.mu.Lock()
defer e.mu.Unlock()
@@ -221,13 +222,14 @@ func (e *ErrorTracker) setUnreachableLocked(node *Node, ip string) bool {
wasUnreachable := e.unreachableNodes[node.TypeID]
e.unreachableNodes[node.TypeID] = true
becameUnreachable = !wasUnreachable
if e.suppressedUnreachable[key] {
return !wasUnreachable
return becameUnreachable, becameUnreachable
}
if _, exists := e.errors[key]; exists {
return !wasUnreachable
return becameUnreachable, becameUnreachable
}
now := time.Now()
@@ -241,17 +243,18 @@ func (e *ErrorTracker) setUnreachableLocked(node *Node, ip string) bool {
FirstSeen: now,
LastUpdated: now,
}
return true
return true, becameUnreachable
}
func (e *ErrorTracker) ClearUnreachable(node *Node, ip string) {
changed := e.clearUnreachableLocked(node, ip)
func (e *ErrorTracker) ClearUnreachable(node *Node, ip string) bool {
changed, becameReachable := e.clearUnreachableLocked(node, ip)
if changed {
e.t.NotifyUpdate()
}
return becameReachable
}
func (e *ErrorTracker) clearUnreachableLocked(node *Node, ip string) bool {
func (e *ErrorTracker) clearUnreachableLocked(node *Node, ip string) (changed bool, becameReachable bool) {
e.mu.Lock()
defer e.mu.Unlock()
@@ -261,10 +264,11 @@ func (e *ErrorTracker) clearUnreachableLocked(node *Node, ip string) bool {
wasUnreachable := e.unreachableNodes[node.TypeID]
delete(e.unreachableNodes, node.TypeID)
becameReachable = wasUnreachable
if _, exists := e.errors[key]; exists {
delete(e.errors, key)
return true
return true, becameReachable
}
return wasUnreachable
return becameReachable, becameReachable
}