From c78d8616fc3514964b901df9cd2074ee6ffeb62a Mon Sep 17 00:00:00 2001 From: Dominik Roos Date: Tue, 21 May 2024 18:18:51 +0200 Subject: [PATCH 1/2] pkg/pan: do not recursively lock Recursive read locks are explicitly forbidden in Go and can lead to dead locks. --- pkg/pan/stats.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/pan/stats.go b/pkg/pan/stats.go index f4158ff8..701ce631 100644 --- a/pkg/pan/stats.go +++ b/pkg/pan/stats.go @@ -130,7 +130,7 @@ func (s *pathStatsDB) FirstMoreAlive(p *Path, paths []*Path) int { defer s.mutex.RUnlock() for i, pc := range paths { - if s.IsMoreAlive(pc, p) { + if s.isMoreAlive(pc, p) { return i } } @@ -144,7 +144,10 @@ func (s *pathStatsDB) FirstMoreAlive(p *Path, paths []*Path) int { func (s *pathStatsDB) IsMoreAlive(a, b *Path) bool { s.mutex.RLock() defer s.mutex.RUnlock() + return s.isMoreAlive(a, b) +} +func (s *pathStatsDB) IsMoreAlive(a, b *Path) bool { newestA := s.newestDownNotification(a) oldestB := s.oldestDownNotification(b) return newestA.Before(oldestB.Add(-pathDownNotificationTimeout)) // XXX: what is this value, what does it mean? From 493b828e724e28e6073aa3db78f7d239a629f2d2 Mon Sep 17 00:00:00 2001 From: Dominik Roos Date: Tue, 21 May 2024 18:41:13 +0200 Subject: [PATCH 2/2] Update stats.go --- pkg/pan/stats.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/pan/stats.go b/pkg/pan/stats.go index 701ce631..e7daf779 100644 --- a/pkg/pan/stats.go +++ b/pkg/pan/stats.go @@ -130,7 +130,7 @@ func (s *pathStatsDB) FirstMoreAlive(p *Path, paths []*Path) int { defer s.mutex.RUnlock() for i, pc := range paths { - if s.isMoreAlive(pc, p) { + if s.isMoreAliveLocked(pc, p) { return i } } @@ -144,10 +144,10 @@ func (s *pathStatsDB) FirstMoreAlive(p *Path, paths []*Path) int { func (s *pathStatsDB) IsMoreAlive(a, b *Path) bool { s.mutex.RLock() defer s.mutex.RUnlock() - return s.isMoreAlive(a, b) + return s.isMoreAliveLocked(a, b) } -func (s *pathStatsDB) IsMoreAlive(a, b *Path) bool { +func (s *pathStatsDB) isMoreAliveLocked(a, b *Path) bool { newestA := s.newestDownNotification(a) oldestB := s.oldestDownNotification(b) return newestA.Before(oldestB.Add(-pathDownNotificationTimeout)) // XXX: what is this value, what does it mean?