mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-16 19:49:56 +00:00
UpdateFromServerDomains resolved the infrastructure domains (signal, relay, STUN, TURN) synchronously, in a serial loop with a 5s timeout per domain. It runs deep inside handleSync, under the engine syncMsgMux (and the DNS server mutex). When DNS is unhealthy each lookup waits out its full timeout, so the sync lock is held for many seconds — observed as a 16.6s wait for the lock by a signal handler in the field. That starves the signal/p2p processing that shares syncMsgMux, which in turn prevents the handshake that would make DNS healthy again: a self-reinforcing loop. The cache cannot simply be skipped: it is a prerequisite for the relay connection. The relay dials its server by hostname, resolved through the NetBird DNS chain where this resolver sits on top (PriorityMgmtCache); on a miss it falls through to upstream — the dead path the cache exists to bypass. Instead, record intent on sync and resolve on demand: - UpdateFromServerDomains now marks each requested domain pending and kicks off resolution in the background via a dedicated singleflight group (resolveGroup), then returns immediately. No DNS I/O, no timeout, no blocking under the lock. - ServeDNS, on a miss for a pending domain, waits on the in-flight resolve (joining the same singleflight flight, bounded by dnsTimeout) instead of falling through to the dead upstream. The wait now happens in the relay/DNS-serving goroutine, never under syncMsgMux. - UpdateServerConfig registers the cache handler from the requested domains (RequestedDomains) rather than the already-resolved ones, so the resolver owns the names before resolution completes and can intercept the lookup. Background resolves use context.Background() so a fast-returning sync cannot cancel an in-flight resolve. WaitForPendingResolves lets tests (and any warm-cache path) wait for the background work to settle. Cache semantics are otherwise unchanged: TTL, stale-while-revalidate refresh, backoff, and the flow-domain exclusion all stay.