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>
pull/17513/head
Jordan Whited 2 months ago committed by GitHub
parent 0f4dec928e
commit e2233b7942
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -367,7 +367,7 @@ tailscale.com/cmd/tailscaled dependencies: (generated by github.com/tailscale/de
💣 tailscale.com/net/tshttpproxy from tailscale.com/feature/useproxy 💣 tailscale.com/net/tshttpproxy from tailscale.com/feature/useproxy
tailscale.com/net/tstun from tailscale.com/cmd/tailscaled+ tailscale.com/net/tstun from tailscale.com/cmd/tailscaled+
tailscale.com/net/udprelay from tailscale.com/feature/relayserver tailscale.com/net/udprelay from tailscale.com/feature/relayserver
tailscale.com/net/udprelay/endpoint from tailscale.com/feature/relayserver+ tailscale.com/net/udprelay/endpoint from tailscale.com/net/udprelay+
tailscale.com/net/udprelay/status from tailscale.com/client/local+ tailscale.com/net/udprelay/status from tailscale.com/client/local+
tailscale.com/omit from tailscale.com/ipn/conffile tailscale.com/omit from tailscale.com/ipn/conffile
tailscale.com/paths from tailscale.com/client/local+ tailscale.com/paths from tailscale.com/client/local+

@ -21,10 +21,8 @@ import (
"tailscale.com/ipn/ipnext" "tailscale.com/ipn/ipnext"
"tailscale.com/ipn/localapi" "tailscale.com/ipn/localapi"
"tailscale.com/net/udprelay" "tailscale.com/net/udprelay"
"tailscale.com/net/udprelay/endpoint"
"tailscale.com/net/udprelay/status" "tailscale.com/net/udprelay/status"
"tailscale.com/tailcfg" "tailscale.com/tailcfg"
"tailscale.com/types/key"
"tailscale.com/types/logger" "tailscale.com/types/logger"
"tailscale.com/types/ptr" "tailscale.com/types/ptr"
"tailscale.com/util/eventbus" "tailscale.com/util/eventbus"
@ -91,13 +89,6 @@ type extension struct {
hasNodeAttrDisableRelayServer bool // tailcfg.NodeAttrDisableRelayServer 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]. // Name implements [ipnext.Extension].
func (e *extension) Name() string { func (e *extension) Name() string {
return featureName return featureName
@ -182,7 +173,11 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
debugSessionsCh := e.debugSessionsCh debugSessionsCh := e.debugSessionsCh
return func(ec *eventbus.Client) { 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() { defer func() {
if rs != nil { if rs != nil {
rs.Close() rs.Close()
@ -194,7 +189,6 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
return return
case respCh := <-debugSessionsCh: case respCh := <-debugSessionsCh:
if rs == nil { if rs == nil {
// Don't initialize the server simply for a debug request.
respCh <- nil respCh <- nil
continue continue
} }
@ -202,7 +196,8 @@ func (e *extension) consumeEventbusTopics(ec *eventbus.Client, port int) func(*e
respCh <- sessions respCh <- sessions
case req := <-reqSub.Events(): case req := <-reqSub.Events():
if rs == nil { 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()) rs, err = udprelay.NewServer(e.logf, port, overrideAddrs())
if err != nil { if err != nil {
e.logf("error initializing server: %v", err) e.logf("error initializing server: %v", err)

@ -8,6 +8,7 @@ import (
"tailscale.com/ipn" "tailscale.com/ipn"
"tailscale.com/tsd" "tailscale.com/tsd"
"tailscale.com/types/logger"
"tailscale.com/types/ptr" "tailscale.com/types/ptr"
"tailscale.com/util/eventbus" "tailscale.com/util/eventbus"
) )
@ -96,6 +97,7 @@ func Test_extension_profileStateChanged(t *testing.T) {
sys := tsd.NewSystem() sys := tsd.NewSystem()
bus := sys.Bus.Get() bus := sys.Bus.Get()
e := &extension{ e := &extension{
logf: logger.Discard,
port: tt.fields.port, port: tt.fields.port,
bus: bus, bus: bus,
} }
@ -154,6 +156,7 @@ func Test_extension_handleBusLifetimeLocked(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
e := &extension{ e := &extension{
logf: logger.Discard,
bus: eventbus.New(), bus: eventbus.New(),
shutdown: tt.shutdown, shutdown: tt.shutdown,
port: tt.port, port: tt.port,

@ -536,6 +536,7 @@ func (s *Server) listenOn(port int) error {
s.uc6 = bc s.uc6 = bc
s.uc6Port = uint16(portUint) s.uc6Port = uint16(portUint)
} }
s.logf("listening on %s:%d", network, portUint)
} }
return nil return nil
} }

Loading…
Cancel
Save