feature/relayserver: init server at config time instead of request time (#17484)

The lazy init led to confusion and a belief that was something was
wrong. It's reasonable to expect the daemon to listen on the port at the
time it's configured.

Updates tailscale/corp#33094

Signed-off-by: Jordan Whited <jordan@tailscale.com>
This commit is contained in:
Jordan Whited
2025-10-09 11:45:03 -07:00
committed by GitHub
parent 0f4dec928e
commit e2233b7942
4 changed files with 12 additions and 13 deletions
+7 -12
View File
@@ -21,10 +21,8 @@ import (
"tailscale.com/ipn/ipnext"
"tailscale.com/ipn/localapi"
"tailscale.com/net/udprelay"
"tailscale.com/net/udprelay/endpoint"
"tailscale.com/net/udprelay/status"
"tailscale.com/tailcfg"
"tailscale.com/types/key"
"tailscale.com/types/logger"
"tailscale.com/types/ptr"
"tailscale.com/util/eventbus"
@@ -91,13 +89,6 @@ type extension struct {
hasNodeAttrDisableRelayServer bool // tailcfg.NodeAttrDisableRelayServer
}
// relayServer is the interface of [udprelay.Server].
type relayServer interface {
AllocateEndpoint(discoA key.DiscoPublic, discoB key.DiscoPublic) (endpoint.ServerEndpoint, error)
Close() error
GetSessions() []status.ServerSession
}
// Name implements [ipnext.Extension].
func (e *extension) Name() string {
return featureName
@@ -182,7 +173,11 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
debugSessionsCh := e.debugSessionsCh
return func(ec *eventbus.Client) {
var rs relayServer // lazily initialized
rs, err := udprelay.NewServer(e.logf, port, overrideAddrs())
if err != nil {
e.logf("error initializing server: %v", err)
}
defer func() {
if rs != nil {
rs.Close()
@@ -194,7 +189,6 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
return
case respCh := <-debugSessionsCh:
if rs == nil {
// Don't initialize the server simply for a debug request.
respCh <- nil
continue
}
@@ -202,7 +196,8 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
respCh <- sessions
case req := <-reqSub.Events():
if rs == nil {
var err error
// The server may have previously failed to initialize if
// the configured port was in use, try again.
rs, err = udprelay.NewServer(e.logf, port, overrideAddrs())
if err != nil {
e.logf("error initializing server: %v", err)