From 2174f6d0b982a4b7787b86319f236d8eeb9b923b Mon Sep 17 00:00:00 2001 From: Andrey Bobelev Date: Fri, 29 Aug 2025 14:20:07 +0200 Subject: [PATCH] chore: make reg cache expiry tunable Mostly for the tests, opts: - tuning.register_cache_expiration - tuning.register_cache_cleanup --- hscontrol/app.go | 1 + hscontrol/oidc.go | 15 +++++++++++++-- hscontrol/state/state.go | 14 ++++++++++++-- hscontrol/types/config.go | 4 ++++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/hscontrol/app.go b/hscontrol/app.go index 774aec46..08d38478 100644 --- a/hscontrol/app.go +++ b/hscontrol/app.go @@ -164,6 +164,7 @@ func NewHeadscale(cfg *types.Config) (*Headscale, error) { &app, cfg.ServerURL, &cfg.OIDC, + &cfg.Tuning, ) if err != nil { if cfg.OIDC.OnlyStartIfOIDCIsAvailable { diff --git a/hscontrol/oidc.go b/hscontrol/oidc.go index 68361cae..f9b83912 100644 --- a/hscontrol/oidc.go +++ b/hscontrol/oidc.go @@ -69,6 +69,7 @@ func NewAuthProviderOIDC( h *Headscale, serverURL string, cfg *types.OIDCConfig, + tuning *types.Tuning, ) (*AuthProviderOIDC, error) { var err error // grab oidc config if it hasn't been already @@ -85,9 +86,19 @@ func NewAuthProviderOIDC( Scopes: cfg.Scope, } + cacheExpiration := registerCacheExpiration + if tuning.RegisterCacheExpiration != 0 { + cacheExpiration = tuning.RegisterCacheExpiration + } + + cacheCleanup := registerCacheCleanup + if tuning.RegisterCacheCleanup != 0 { + cacheCleanup = tuning.RegisterCacheCleanup + } + registrationCache := zcache.New[string, RegistrationInfo]( - registerCacheExpiration, - registerCacheCleanup, + cacheExpiration, + cacheCleanup, ) return &AuthProviderOIDC{ diff --git a/hscontrol/state/state.go b/hscontrol/state/state.go index 0a743184..4b1b4f0d 100644 --- a/hscontrol/state/state.go +++ b/hscontrol/state/state.go @@ -67,9 +67,19 @@ type State struct { // NewState creates and initializes a new State instance, setting up the database, // IP allocator, DERP map, policy manager, and loading existing users and nodes. func NewState(cfg *types.Config) (*State, error) { + cacheExpiration := registerCacheExpiration + if cfg.Tuning.RegisterCacheExpiration != 0 { + cacheExpiration = cfg.Tuning.RegisterCacheExpiration + } + + cacheCleanup := registerCacheCleanup + if cfg.Tuning.RegisterCacheCleanup != 0 { + cacheCleanup = cfg.Tuning.RegisterCacheCleanup + } + registrationCache := zcache.New[types.RegistrationID, types.RegisterNode]( - registerCacheExpiration, - registerCacheCleanup, + cacheExpiration, + cacheCleanup, ) db, err := hsdb.NewHeadscaleDatabase( diff --git a/hscontrol/types/config.go b/hscontrol/types/config.go index f23b75e8..20c63efa 100644 --- a/hscontrol/types/config.go +++ b/hscontrol/types/config.go @@ -235,6 +235,8 @@ type Tuning struct { BatchChangeDelay time.Duration NodeMapSessionBufferedChanSize int BatcherWorkers int + RegisterCacheCleanup time.Duration + RegisterCacheExpiration time.Duration } func validatePKCEMethod(method string) error { @@ -1000,6 +1002,8 @@ func LoadServerConfig() (*Config, error) { } return DefaultBatcherWorkers() }(), + RegisterCacheCleanup: viper.GetDuration("tuning.register_cache_cleanup"), + RegisterCacheExpiration: viper.GetDuration("tuning.register_cache_expiration"), }, }, nil }