fix: update conn derpmap every 5s in single tailnet (#9176)

This commit is contained in:
Dean Sheather
2023-08-23 04:20:31 -07:00
committed by GitHub
parent 53de47d4c8
commit f35423c041
9 changed files with 113 additions and 16 deletions

3
coderd/apidoc/docs.go generated
View File

@ -11976,6 +11976,9 @@ const docTemplate = `{
"app_security_key": {
"type": "string"
},
"derp_map": {
"$ref": "#/definitions/tailcfg.DERPMap"
},
"derp_mesh_key": {
"type": "string"
},

View File

@ -10937,6 +10937,9 @@
"app_security_key": {
"type": "string"
},
"derp_map": {
"$ref": "#/definitions/tailcfg.DERPMap"
},
"derp_mesh_key": {
"type": "string"
},

View File

@ -404,7 +404,7 @@ func New(options *Options) *API {
api.agentProvider, err = NewServerTailnet(api.ctx,
options.Logger,
options.DERPServer,
options.BaseDERPMap,
api.DERPMap,
func(context.Context) (tailnet.MultiAgentConn, error) {
return (*api.TailnetCoordinator.Load()).ServeMultiAgent(uuid.New()), nil
},

View File

@ -44,15 +44,16 @@ func NewServerTailnet(
ctx context.Context,
logger slog.Logger,
derpServer *derp.Server,
derpMap *tailcfg.DERPMap,
derpMapFn func() *tailcfg.DERPMap,
getMultiAgent func(context.Context) (tailnet.MultiAgentConn, error),
cache *wsconncache.Cache,
traceProvider trace.TracerProvider,
) (*ServerTailnet, error) {
logger = logger.Named("servertailnet")
originalDerpMap := derpMapFn()
conn, err := tailnet.NewConn(&tailnet.Options{
Addresses: []netip.Prefix{netip.PrefixFrom(tailnet.IP(), 128)},
DERPMap: derpMap,
DERPMap: originalDerpMap,
Logger: logger,
})
if err != nil {
@ -60,9 +61,32 @@ func NewServerTailnet(
}
serverCtx, cancel := context.WithCancel(ctx)
derpMapUpdaterClosed := make(chan struct{})
go func() {
defer close(derpMapUpdaterClosed)
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for {
select {
case <-serverCtx.Done():
return
case <-ticker.C:
}
newDerpMap := derpMapFn()
if !tailnet.CompareDERPMaps(originalDerpMap, newDerpMap) {
conn.SetDERPMap(newDerpMap)
originalDerpMap = newDerpMap
}
}
}()
tn := &ServerTailnet{
ctx: serverCtx,
cancel: cancel,
derpMapUpdaterClosed: derpMapUpdaterClosed,
logger: logger,
tracer: traceProvider.Tracer(tracing.TracerName),
conn: conn,
@ -237,8 +261,9 @@ func (s *ServerTailnet) reinitCoordinator() {
}
type ServerTailnet struct {
ctx context.Context
cancel func()
ctx context.Context
cancel func()
derpMapUpdaterClosed chan struct{}
logger slog.Logger
tracer trace.Tracer
@ -403,5 +428,6 @@ func (s *ServerTailnet) Close() error {
_ = s.cache.Close()
_ = s.conn.Close()
s.transport.CloseIdleConnections()
<-s.derpMapUpdaterClosed
return nil
}

View File

@ -15,6 +15,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/trace"
"tailscale.com/tailcfg"
"cdr.dev/slog"
"cdr.dev/slog/sloggers/slogtest"
@ -230,7 +231,7 @@ func setupAgent(t *testing.T, agentAddresses []netip.Prefix) (uuid.UUID, agent.A
context.Background(),
logger,
derpServer,
manifest.DERPMap,
func() *tailcfg.DERPMap { return manifest.DERPMap },
func(context.Context) (tailnet.MultiAgentConn, error) { return coord.ServeMultiAgent(uuid.New()), nil },
cache,
trace.NewNoopTracerProvider(),