Fix deprecated event handling

This commit is contained in:
Zoltán Papp
2025-02-28 12:24:44 +01:00
parent 4a5edc1374
commit 4e33582aaa
5 changed files with 55 additions and 56 deletions

View File

@@ -2,6 +2,7 @@ package manager
import (
"context"
"fmt"
"sync"
log "github.com/sirupsen/logrus"
@@ -13,31 +14,20 @@ import (
// Manager manages lazy connections
// This is not a thread safe implementation, do not call exported functions concurrently
type Manager struct {
PeerActivityChan chan string
listenerMgr *listener.Manager
managedPeers map[string]lazyconn.PeerConfig
managedPeersMu sync.Mutex
ctxCancel context.CancelFunc
closeChan chan struct{}
}
func NewManager(wgIface lazyconn.WGIface) *Manager {
m := &Manager{
PeerActivityChan: make(chan string, 1),
listenerMgr: listener.NewManager(wgIface),
managedPeers: make(map[string]lazyconn.PeerConfig),
listenerMgr: listener.NewManager(wgIface),
managedPeers: make(map[string]lazyconn.PeerConfig),
}
return m
}
// Start to listen for traffic start events
func (m *Manager) Start(parentCtx context.Context) {
ctx, cancel := context.WithCancel(parentCtx)
m.ctxCancel = cancel
m.receiveLazyConnEvents(ctx)
}
func (m *Manager) AddPeer(peer lazyconn.PeerConfig) error {
m.managedPeersMu.Lock()
defer m.managedPeersMu.Unlock()
@@ -78,36 +68,37 @@ func (m *Manager) Close() {
m.managedPeersMu.Lock()
defer m.managedPeersMu.Unlock()
m.ctxCancel()
// todo prevent double call
close(m.closeChan)
m.listenerMgr.Close()
m.managedPeers = make(map[string]lazyconn.PeerConfig)
// clean up the channel for the future reuse
m.drainPeerActivityChan()
}
func (m *Manager) receiveLazyConnEvents(ctx context.Context) {
func (m *Manager) NextEvent(ctx context.Context) (string, error) {
for {
select {
case <-m.closeChan:
return "", fmt.Errorf("service closed")
case <-ctx.Done():
return
case peerID := <-m.listenerMgr.TrafficStartChan:
select {
case <-ctx.Done():
case m.PeerActivityChan <- peerID:
return "", ctx.Err()
case e := <-m.listenerMgr.TrafficStartChan:
m.managedPeersMu.Lock()
// todo instead of peer ID check, check by the peer conn instance id
pcfg, ok := m.managedPeers[e.PeerID]
if !ok {
m.managedPeersMu.Unlock()
continue
}
}
}
}
func (m *Manager) drainPeerActivityChan() {
for {
select {
case <-m.PeerActivityChan:
default:
return
if pcfg.PeerConnID != e.PeerConnId {
m.managedPeersMu.Unlock()
continue
}
m.managedPeersMu.Unlock()
return e.PeerID, nil
}
}
}