diff --git a/client/internal/connect.go b/client/internal/connect.go index 17fc20c42..49b361c21 100644 --- a/client/internal/connect.go +++ b/client/internal/connect.go @@ -310,6 +310,7 @@ func (c *ConnectClient) run(mobileDependency MobileDependency, runningChan chan c.engineMutex.Lock() engine := NewEngine(engineCtx, cancel, signalClient, mgmClient, relayManager, engineConfig, mobileDependency, c.statusRecorder, checks, stateManager) engine.SetSyncResponsePersistence(c.persistSyncResponse) + engine.SetReadyChan(runningChan) c.engine = engine c.engineMutex.Unlock() @@ -330,11 +331,6 @@ func (c *ConnectClient) run(mobileDependency MobileDependency, runningChan chan log.Infof("Netbird engine started, the IP is: %s", peerConfig.GetAddress()) state.Set(StatusConnected) - if runningChan != nil { - close(runningChan) - runningChan = nil - } - <-engineCtx.Done() c.engineMutex.Lock() diff --git a/client/internal/engine.go b/client/internal/engine.go index 4f3cf0998..cdced3ca0 100644 --- a/client/internal/engine.go +++ b/client/internal/engine.go @@ -28,8 +28,8 @@ import ( "github.com/netbirdio/netbird/client/firewall" firewallManager "github.com/netbirdio/netbird/client/firewall/manager" "github.com/netbirdio/netbird/client/iface" - nbnetstack "github.com/netbirdio/netbird/client/iface/netstack" "github.com/netbirdio/netbird/client/iface/device" + nbnetstack "github.com/netbirdio/netbird/client/iface/netstack" "github.com/netbirdio/netbird/client/iface/udpmux" "github.com/netbirdio/netbird/client/internal/acl" "github.com/netbirdio/netbird/client/internal/debug" @@ -217,6 +217,10 @@ type Engine struct { // WireGuard interface monitor wgIfaceMonitor *WGIfaceMonitor + // readyChan is closed when the first sync message is received from management + readyChan chan struct{} + readyChanOnce sync.Once + // shutdownWg tracks all long-running goroutines to ensure clean shutdown shutdownWg sync.WaitGroup @@ -275,6 +279,10 @@ func NewEngine( return engine } +func (e *Engine) SetReadyChan(ch chan struct{}) { + e.readyChan = ch +} + func (e *Engine) Stop() error { if e == nil { // this seems to be a very odd case but there was the possibility if the netbird down command comes before the engine is fully started @@ -834,6 +842,13 @@ func (e *Engine) handleSync(update *mgmProto.SyncResponse) error { defer func() { log.Infof("sync finished in %s", time.Since(started)) }() + + e.readyChanOnce.Do(func() { + if e.readyChan != nil { + close(e.readyChan) + } + }) + e.syncMsgMux.Lock() defer e.syncMsgMux.Unlock()