mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-29 17:52:32 +00:00
Add config value that gives users options to skip calculating role for each lease (#22651)
* Add config value that gives users options to skip calculating role for each lease * add changelog * change name * add config for testing * Update changelog/22651.txt Co-authored-by: Violet Hynes <violet.hynes@hashicorp.com> * update tests, docs and reorder logic in conditional * fix comment * update comment * fix comment again * Update comments and change if order * change comment again * add other comment * fix tests * add documentation * edit docs * Update http/util.go Co-authored-by: Mike Palmiotto <mike.palmiotto@hashicorp.com> * Update vault/core.go * Update vault/core.go * update var name * udpate docs * Update vault/request_handling.go Co-authored-by: Mike Palmiotto <mike.palmiotto@hashicorp.com> * 1 more docs change --------- Co-authored-by: Violet Hynes <violet.hynes@hashicorp.com> Co-authored-by: Mike Palmiotto <mike.palmiotto@hashicorp.com>
This commit is contained in:
3
changelog/22651.txt
Normal file
3
changelog/22651.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
```release-note:improvement
|
||||||
|
core/quotas: Add configuration to allow skipping of expensive role calculations
|
||||||
|
```
|
||||||
@@ -2998,6 +2998,7 @@ func createCoreConfig(c *ServerCommand, config *server.Config, backend physical.
|
|||||||
LogicalBackends: c.LogicalBackends,
|
LogicalBackends: c.LogicalBackends,
|
||||||
Logger: c.logger,
|
Logger: c.logger,
|
||||||
DetectDeadlocks: config.DetectDeadlocks,
|
DetectDeadlocks: config.DetectDeadlocks,
|
||||||
|
ImpreciseLeaseRoleTracking: config.ImpreciseLeaseRoleTracking,
|
||||||
DisableSentinelTrace: config.DisableSentinelTrace,
|
DisableSentinelTrace: config.DisableSentinelTrace,
|
||||||
DisableCache: config.DisableCache,
|
DisableCache: config.DisableCache,
|
||||||
DisableMlock: config.DisableMlock,
|
DisableMlock: config.DisableMlock,
|
||||||
|
|||||||
@@ -112,6 +112,8 @@ type Config struct {
|
|||||||
|
|
||||||
DetectDeadlocks string `hcl:"detect_deadlocks"`
|
DetectDeadlocks string `hcl:"detect_deadlocks"`
|
||||||
|
|
||||||
|
ImpreciseLeaseRoleTracking bool `hcl:"imprecise_lease_role_tracking"`
|
||||||
|
|
||||||
EnableResponseHeaderRaftNodeID bool `hcl:"-"`
|
EnableResponseHeaderRaftNodeID bool `hcl:"-"`
|
||||||
EnableResponseHeaderRaftNodeIDRaw interface{} `hcl:"enable_response_header_raft_node_id"`
|
EnableResponseHeaderRaftNodeIDRaw interface{} `hcl:"enable_response_header_raft_node_id"`
|
||||||
|
|
||||||
@@ -412,6 +414,11 @@ func (c *Config) Merge(c2 *Config) *Config {
|
|||||||
result.DetectDeadlocks = c2.DetectDeadlocks
|
result.DetectDeadlocks = c2.DetectDeadlocks
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result.ImpreciseLeaseRoleTracking = c.ImpreciseLeaseRoleTracking
|
||||||
|
if c2.ImpreciseLeaseRoleTracking {
|
||||||
|
result.ImpreciseLeaseRoleTracking = c2.ImpreciseLeaseRoleTracking
|
||||||
|
}
|
||||||
|
|
||||||
result.EnableResponseHeaderRaftNodeID = c.EnableResponseHeaderRaftNodeID
|
result.EnableResponseHeaderRaftNodeID = c.EnableResponseHeaderRaftNodeID
|
||||||
if c2.EnableResponseHeaderRaftNodeID {
|
if c2.EnableResponseHeaderRaftNodeID {
|
||||||
result.EnableResponseHeaderRaftNodeID = c2.EnableResponseHeaderRaftNodeID
|
result.EnableResponseHeaderRaftNodeID = c2.EnableResponseHeaderRaftNodeID
|
||||||
@@ -1144,6 +1151,8 @@ func (c *Config) Sanitized() map[string]interface{} {
|
|||||||
"experiments": c.Experiments,
|
"experiments": c.Experiments,
|
||||||
|
|
||||||
"detect_deadlocks": c.DetectDeadlocks,
|
"detect_deadlocks": c.DetectDeadlocks,
|
||||||
|
|
||||||
|
"imprecise_lease_role_tracking": c.ImpreciseLeaseRoleTracking,
|
||||||
}
|
}
|
||||||
for k, v := range sharedResult {
|
for k, v := range sharedResult {
|
||||||
result[k] = v
|
result[k] = v
|
||||||
|
|||||||
@@ -849,6 +849,7 @@ func testConfig_Sanitized(t *testing.T) {
|
|||||||
"add_mount_point_rollback_metrics": false,
|
"add_mount_point_rollback_metrics": false,
|
||||||
},
|
},
|
||||||
"administrative_namespace_path": "admin/",
|
"administrative_namespace_path": "admin/",
|
||||||
|
"imprecise_lease_role_tracking": false,
|
||||||
}
|
}
|
||||||
|
|
||||||
addExpectedEntSanitizedConfig(expected, []string{"http"})
|
addExpectedEntSanitizedConfig(expected, []string{"http"})
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ func TestSysConfigState_Sanitized(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"storage": tc.expectedStorageOutput,
|
"storage": tc.expectedStorageOutput,
|
||||||
"administrative_namespace_path": "",
|
"administrative_namespace_path": "",
|
||||||
|
"imprecise_lease_role_tracking": false,
|
||||||
}
|
}
|
||||||
|
|
||||||
if tc.expectedHAStorageOutput != nil {
|
if tc.expectedHAStorageOutput != nil {
|
||||||
|
|||||||
@@ -67,6 +67,8 @@ func rateLimitQuotaWrapping(handler http.Handler, core *vault.Core) http.Handler
|
|||||||
NamespacePath: ns.Path,
|
NamespacePath: ns.Path,
|
||||||
ClientAddress: parseRemoteIPAddress(r),
|
ClientAddress: parseRemoteIPAddress(r),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This checks if any role based quota is required (LCQ or RLQ).
|
||||||
requiresResolveRole, err := core.ResolveRoleForQuotas(r.Context(), quotaReq)
|
requiresResolveRole, err := core.ResolveRoleForQuotas(r.Context(), quotaReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
core.Logger().Error("failed to lookup quotas", "path", path, "error", err)
|
core.Logger().Error("failed to lookup quotas", "path", path, "error", err)
|
||||||
|
|||||||
@@ -699,6 +699,9 @@ type Core struct {
|
|||||||
// if populated, the callback is called for every request
|
// if populated, the callback is called for every request
|
||||||
// for testing purposes
|
// for testing purposes
|
||||||
requestResponseCallback func(logical.Backend, *logical.Request, *logical.Response)
|
requestResponseCallback func(logical.Backend, *logical.Request, *logical.Response)
|
||||||
|
|
||||||
|
// If any role based quota (LCQ or RLQ) is enabled, don't track lease counts by role
|
||||||
|
impreciseLeaseRoleTracking bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// c.stateLock needs to be held in read mode before calling this function.
|
// c.stateLock needs to be held in read mode before calling this function.
|
||||||
@@ -760,6 +763,9 @@ type CoreConfig struct {
|
|||||||
// Use the deadlocks library to detect deadlocks
|
// Use the deadlocks library to detect deadlocks
|
||||||
DetectDeadlocks string
|
DetectDeadlocks string
|
||||||
|
|
||||||
|
// If any role based quota (LCQ or RLQ) is enabled, don't track lease counts by role
|
||||||
|
ImpreciseLeaseRoleTracking bool
|
||||||
|
|
||||||
// Disables the trace display for Sentinel checks
|
// Disables the trace display for Sentinel checks
|
||||||
DisableSentinelTrace bool
|
DisableSentinelTrace bool
|
||||||
|
|
||||||
@@ -1032,6 +1038,7 @@ func CreateCore(conf *CoreConfig) (*Core, error) {
|
|||||||
pendingRemovalMountsAllowed: conf.PendingRemovalMountsAllowed,
|
pendingRemovalMountsAllowed: conf.PendingRemovalMountsAllowed,
|
||||||
expirationRevokeRetryBase: conf.ExpirationRevokeRetryBase,
|
expirationRevokeRetryBase: conf.ExpirationRevokeRetryBase,
|
||||||
rollbackMountPathMetrics: conf.MetricSink.TelemetryConsts.RollbackMetricsIncludeMountPoint,
|
rollbackMountPathMetrics: conf.MetricSink.TelemetryConsts.RollbackMetricsIncludeMountPoint,
|
||||||
|
impreciseLeaseRoleTracking: conf.ImpreciseLeaseRoleTracking,
|
||||||
}
|
}
|
||||||
|
|
||||||
c.standbyStopCh.Store(make(chan struct{}))
|
c.standbyStopCh.Store(make(chan struct{}))
|
||||||
|
|||||||
@@ -1687,10 +1687,16 @@ func (c *Core) handleLoginRequest(ctx context.Context, req *logical.Request) (re
|
|||||||
// Attach the display name, might be used by audit backends
|
// Attach the display name, might be used by audit backends
|
||||||
req.DisplayName = auth.DisplayName
|
req.DisplayName = auth.DisplayName
|
||||||
|
|
||||||
// If this is not a role-based quota, we still need to associate the
|
requiresLease := resp.Auth.TokenType != logical.TokenTypeBatch
|
||||||
// login role with this lease for later lease-count quotas to be
|
|
||||||
// accurate.
|
// If role was not already determined by http.rateLimitQuotaWrapping
|
||||||
if reqRole == nil && resp.Auth.TokenType != logical.TokenTypeBatch {
|
// and a lease will be generated, calculate a role for the leaseEntry.
|
||||||
|
// We can skip this step if there are no pre-existing role-based quotas
|
||||||
|
// for this mount and Vault is configured to skip lease role-based lease counting
|
||||||
|
// until after they're created. This effectively zeroes out the lease count
|
||||||
|
// for new role-based quotas upon creation, rather than counting old leases toward
|
||||||
|
// the total.
|
||||||
|
if reqRole == nil && requiresLease && !c.impreciseLeaseRoleTracking {
|
||||||
role = c.DetermineRoleFromLoginRequest(ctx, req.MountPoint, req.Data)
|
role = c.DetermineRoleFromLoginRequest(ctx, req.MountPoint, req.Data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ func TestCoreWithSealAndUINoCleanup(t testing.T, opts *CoreConfig) *Core {
|
|||||||
conf.CensusAgent = opts.CensusAgent
|
conf.CensusAgent = opts.CensusAgent
|
||||||
conf.AdministrativeNamespacePath = opts.AdministrativeNamespacePath
|
conf.AdministrativeNamespacePath = opts.AdministrativeNamespacePath
|
||||||
conf.AllLoggers = logger.AllLoggers
|
conf.AllLoggers = logger.AllLoggers
|
||||||
|
conf.ImpreciseLeaseRoleTracking = opts.ImpreciseLeaseRoleTracking
|
||||||
|
|
||||||
if opts.Logger != nil {
|
if opts.Logger != nil {
|
||||||
conf.Logger = opts.Logger
|
conf.Logger = opts.Logger
|
||||||
@@ -1553,6 +1554,7 @@ func NewTestCluster(t testing.T, base *CoreConfig, opts *TestClusterOptions) *Te
|
|||||||
coreConfig.DisableAutopilot = base.DisableAutopilot
|
coreConfig.DisableAutopilot = base.DisableAutopilot
|
||||||
coreConfig.AdministrativeNamespacePath = base.AdministrativeNamespacePath
|
coreConfig.AdministrativeNamespacePath = base.AdministrativeNamespacePath
|
||||||
coreConfig.ServiceRegistration = base.ServiceRegistration
|
coreConfig.ServiceRegistration = base.ServiceRegistration
|
||||||
|
coreConfig.ImpreciseLeaseRoleTracking = base.ImpreciseLeaseRoleTracking
|
||||||
|
|
||||||
if base.BuiltinRegistry != nil {
|
if base.BuiltinRegistry != nil {
|
||||||
coreConfig.BuiltinRegistry = base.BuiltinRegistry
|
coreConfig.BuiltinRegistry = base.BuiltinRegistry
|
||||||
|
|||||||
@@ -221,6 +221,10 @@ a negative effect on performance due to the tracking of each lock attempt.
|
|||||||
the `VAULT_EXPERIMENTS` environment variable as a comma-separated list, or via the
|
the `VAULT_EXPERIMENTS` environment variable as a comma-separated list, or via the
|
||||||
[`-experiment`](/vault/docs/commands/server#experiment) flag.
|
[`-experiment`](/vault/docs/commands/server#experiment) flag.
|
||||||
|
|
||||||
|
- `imprecise_lease_role_tracking` `(bool: "false")` - Skip lease counting by role if there are no role based quotas enabled.
|
||||||
|
When `imprecise_lease_role_tracking` is set to true and a new role-based quota is enabled, subsequent lease counts start from 0.
|
||||||
|
`imprecise_lease_role_tracking` affects role-based lease count quotas, but reduces latencies when not using role based quotas.
|
||||||
|
|
||||||
### High availability parameters
|
### High availability parameters
|
||||||
|
|
||||||
The following parameters are used on backends that support [high availability][high-availability].
|
The following parameters are used on backends that support [high availability][high-availability].
|
||||||
|
|||||||
Reference in New Issue
Block a user