proxy: allow overriding tunnel-cache TTL via env var

The tunnel-peer validation cache (peer -> user/groups from ValidateTunnelPeer)
memoizes positive results for a fixed 5 minutes, so an authorization change
(e.g. a revoked peer) can take up to 5 minutes to take effect on the proxy.

Add NB_PROXY_TUNNEL_CACHE_TTL to override the default at construction. The
value is a Go duration string (e.g. "30s", "2m"); unset, unparseable, or
non-positive values keep the 300s default and log a warning. Operators who
need faster propagation can lower it (trading more ValidateTunnelPeer RPCs for
freshness).
This commit is contained in:
mlsmaycon
2026-07-26 17:42:21 +00:00
parent 1e5b0a5c89
commit d9b753eda2
2 changed files with 63 additions and 5 deletions
+29
View File
@@ -169,3 +169,32 @@ func TestTunnelCache_BoundedSizeEvictsOldest(t *testing.T) {
assert.NotNil(t, cache.get(keys[1]), "second-newest must remain cached")
assert.NotNil(t, cache.get(keys[2]), "newest must remain cached")
}
func TestTunnelCacheTTLFromEnv(t *testing.T) {
t.Run("unset uses default", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, "")
assert.Equal(t, tunnelCacheTTL, tunnelCacheTTLFromEnv())
})
t.Run("valid duration overrides", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, "45s")
assert.Equal(t, 45*time.Second, tunnelCacheTTLFromEnv())
})
t.Run("whitespace trimmed", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, " 2m ")
assert.Equal(t, 2*time.Minute, tunnelCacheTTLFromEnv())
})
t.Run("unparseable uses default", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, "nonsense")
assert.Equal(t, tunnelCacheTTL, tunnelCacheTTLFromEnv())
})
t.Run("non-positive uses default", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, "0s")
assert.Equal(t, tunnelCacheTTL, tunnelCacheTTLFromEnv())
t.Setenv(envTunnelCacheTTL, "-30s")
assert.Equal(t, tunnelCacheTTL, tunnelCacheTTLFromEnv())
})
t.Run("constructor honors override", func(t *testing.T) {
t.Setenv(envTunnelCacheTTL, "90s")
assert.Equal(t, 90*time.Second, newTunnelValidationCache().ttl)
})
}