From 6107b394a05b0df496a742a5be3c7e949e55fe6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Papp?= Date: Thu, 13 Mar 2025 16:16:53 +0100 Subject: [PATCH] Use conn id instead of peer id --- .../lazyconn/inactivity/inactivity.go | 15 ++-- client/internal/lazyconn/manager/manager.go | 81 +++++++++---------- 2 files changed, 43 insertions(+), 53 deletions(-) diff --git a/client/internal/lazyconn/inactivity/inactivity.go b/client/internal/lazyconn/inactivity/inactivity.go index f7d05c297..3e1cf47e6 100644 --- a/client/internal/lazyconn/inactivity/inactivity.go +++ b/client/internal/lazyconn/inactivity/inactivity.go @@ -4,7 +4,7 @@ import ( "context" "time" - log "github.com/sirupsen/logrus" + "github.com/netbirdio/netbird/client/internal/peer" ) const ( @@ -12,21 +12,21 @@ const ( ) type InactivityMonitor struct { - peerID string + id peer.ConnID timer *time.Timer cancel context.CancelFunc } -func NewInactivityMonitor(peerID string) *InactivityMonitor { +func NewInactivityMonitor(peerID peer.ConnID) *InactivityMonitor { i := &InactivityMonitor{ - peerID: peerID, - timer: time.NewTimer(0), + id: peerID, + timer: time.NewTimer(0), } i.timer.Stop() return i } -func (i *InactivityMonitor) Start(ctx context.Context, timeoutChan chan string) { +func (i *InactivityMonitor) Start(ctx context.Context, timeoutChan chan peer.ConnID) { i.timer.Reset(inactivityThreshold) defer i.timer.Stop() @@ -36,7 +36,7 @@ func (i *InactivityMonitor) Start(ctx context.Context, timeoutChan chan string) select { case <-i.timer.C: select { - case timeoutChan <- i.peerID: + case timeoutChan <- i.id: case <-ctx.Done(): return } @@ -46,7 +46,6 @@ func (i *InactivityMonitor) Start(ctx context.Context, timeoutChan chan string) } func (i *InactivityMonitor) Stop() { - log.Info("--- cancel idle timer") i.cancel() } diff --git a/client/internal/lazyconn/manager/manager.go b/client/internal/lazyconn/manager/manager.go index 9ddad4b01..a2c27d0d0 100644 --- a/client/internal/lazyconn/manager/manager.go +++ b/client/internal/lazyconn/manager/manager.go @@ -19,17 +19,18 @@ type Manager struct { Idle chan string connStateDispatcher *peer.ConnectionDispatcher - managedPeers map[string]*lazyconn.PeerConfig - managedByConnID map[string]*lazyconn.PeerConfig + connStateListener *peer.ConnectionListener + + managedPeers map[string]*lazyconn.PeerConfig + managedPeersByConnID map[peer.ConnID]*lazyconn.PeerConfig + excludes map[string]struct{} + managedPeersMu sync.Mutex activityManager *activity.Manager - inactivityMonitors map[string]*inactivity.InactivityMonitor + inactivityMonitors map[peer.ConnID]*inactivity.InactivityMonitor - excludes map[string]struct{} - managedPeersMu sync.Mutex - cancel context.CancelFunc - connStateListener *peer.ConnectionListener - onInactive chan string + cancel context.CancelFunc + onInactive chan peer.ConnID } func NewManager(wgIface lazyconn.WGIface, connStateDispatcher *peer.ConnectionDispatcher) *Manager { @@ -37,12 +38,13 @@ func NewManager(wgIface lazyconn.WGIface, connStateDispatcher *peer.ConnectionDi OnActive: make(chan string, 1), Idle: make(chan string, 1), - connStateDispatcher: connStateDispatcher, - managedPeers: make(map[string]*lazyconn.PeerConfig), - activityManager: activity.NewManager(wgIface), - inactivityMonitors: make(map[string]*inactivity.InactivityMonitor), - excludes: make(map[string]struct{}), - onInactive: make(chan string), + connStateDispatcher: connStateDispatcher, + managedPeers: make(map[string]*lazyconn.PeerConfig), + managedPeersByConnID: make(map[peer.ConnID]*lazyconn.PeerConfig), + excludes: make(map[string]struct{}), + activityManager: activity.NewManager(wgIface), + inactivityMonitors: make(map[peer.ConnID]*inactivity.InactivityMonitor), + onInactive: make(chan peer.ConnID), } m.connStateListener = &peer.ConnectionListener{ @@ -75,10 +77,11 @@ func (m *Manager) AddPeer(peerCfg lazyconn.PeerConfig) (bool, error) { return false, err } - iw := inactivity.NewInactivityMonitor(peerCfg.PublicKey) - m.inactivityMonitors[peerCfg.PublicKey] = iw + im := inactivity.NewInactivityMonitor(peerCfg.PeerConnID) + m.inactivityMonitors[peerCfg.PeerConnID] = im m.managedPeers[peerCfg.PublicKey] = &peerCfg + m.managedPeersByConnID[peerCfg.PeerConnID] = &peerCfg return false, nil } @@ -93,14 +96,15 @@ func (m *Manager) RemovePeer(peerID string) { cfg.Log.Infof("removing lazy peer") - if im, ok := m.inactivityMonitors[peerID]; ok { + if im, ok := m.inactivityMonitors[cfg.PeerConnID]; ok { im.Stop() - delete(m.inactivityMonitors, peerID) + delete(m.inactivityMonitors, cfg.PeerConnID) cfg.Log.Debugf("inactivity monitor stopped") } m.activityManager.RemovePeer(peerID) delete(m.managedPeers, peerID) + delete(m.managedPeersByConnID, cfg.PeerConnID) cfg.Log.Debugf("activity listener removed") } @@ -117,7 +121,7 @@ func (m *Manager) RunInactivityMonitor(peerID string) (found bool) { return false } - m.inactivityMonitors[peerID].ResetTimer() + m.inactivityMonitors[cfg.PeerConnID].ResetTimer() cfg.Log.Infof("stoped activity monitor and reset inactivity monitor") return true @@ -135,7 +139,7 @@ func (m *Manager) RunActivityMonitor(peerID string) { cfg.Log.Infof("start activity monitor") // just in case free up - m.inactivityMonitors[peerID].PauseTimer() + m.inactivityMonitors[cfg.PeerConnID].PauseTimer() if err := m.activityManager.MonitorPeerActivity(*cfg); err != nil { cfg.Log.Errorf("failed to create activity monitor: %v", err) @@ -163,7 +167,7 @@ func (m *Manager) Close() { for _, iw := range m.inactivityMonitors { iw.Stop() } - m.inactivityMonitors = make(map[string]*inactivity.InactivityMonitor) + m.inactivityMonitors = make(map[peer.ConnID]*inactivity.InactivityMonitor) m.managedPeers = make(map[string]*lazyconn.PeerConfig) log.Infof("lazy connection manager closed") } @@ -176,8 +180,8 @@ func (m *Manager) Start(ctx context.Context) { return case e := <-m.activityManager.OnActivityChan: m.onPeerActivity(ctx, e) - case peerID := <-m.onInactive: - m.onPeerInactivityTimedOut(ctx, peerID) + case peerConnID := <-m.onInactive: + m.onPeerInactivityTimedOut(ctx, peerConnID) } } } @@ -186,20 +190,15 @@ func (m *Manager) onPeerActivity(ctx context.Context, e activity.OnAcitvityEvent m.managedPeersMu.Lock() defer m.managedPeersMu.Unlock() - pcfg, ok := m.managedPeers[e.PeerID] + pcfg, ok := m.managedPeersByConnID[e.PeerConnId] if !ok { return } - pcfg.Log.Infof("detected traffic initiative") - - if pcfg.PeerConnID != e.PeerConnId { - pcfg.Log.Debugf("peer conn instance id mismatch, doing nothing") - return - } + pcfg.Log.Infof("detected peer activity") pcfg.Log.Infof("starting inactivity monitor") - go m.inactivityMonitors[e.PeerID].Start(ctx, m.Idle) + go m.inactivityMonitors[e.PeerConnId].Start(ctx, m.onInactive) select { case m.OnActive <- e.PeerID: @@ -208,31 +207,23 @@ func (m *Manager) onPeerActivity(ctx context.Context, e activity.OnAcitvityEvent } } -func (m *Manager) onPeerInactivityTimedOut(ctx context.Context, peerID string) { +func (m *Manager) onPeerInactivityTimedOut(ctx context.Context, peerConnID peer.ConnID) { m.managedPeersMu.Lock() defer m.managedPeersMu.Unlock() - pcfg, ok := m.managedPeers[peerID] + pcfg, ok := m.managedPeersByConnID[peerConnID] if !ok { return } pcfg.Log.Infof("connection timed out") - /* - if pcfg.PeerConnID != e.PeerConnId { - pcfg.Log.Debugf("peer conn instance id mismatch, doing nothing") - return - } - - */ - - if _, ok := m.inactivityMonitors[peerID]; !ok { + if _, ok := m.inactivityMonitors[peerConnID]; !ok { return } select { - case m.Idle <- peerID: + case m.Idle <- pcfg.PublicKey: case <-ctx.Done(): return } @@ -246,7 +237,7 @@ func (m *Manager) onPeerConnected(conn *peer.Conn) { return } - iw, ok := m.inactivityMonitors[conn.GetKey()] + iw, ok := m.inactivityMonitors[conn.ConnID()] if !ok { conn.Log.Errorf("inactivity monitor not found for peer") return @@ -265,7 +256,7 @@ func (m *Manager) onPeerDisconnected(conn *peer.Conn) { return } - iw, ok := m.inactivityMonitors[conn.GetKey()] + iw, ok := m.inactivityMonitors[conn.ConnID()] if !ok { return }