Skip to content

Commit

Permalink
Add config value that gives users options to skip calculating role fo…
Browse files Browse the repository at this point in the history
…r 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 <[email protected]>

* 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 <[email protected]>

* Update vault/core.go

* Update vault/core.go

* update var name

* udpate docs

* Update vault/request_handling.go

Co-authored-by: Mike Palmiotto <[email protected]>

* 1 more docs change

---------

Co-authored-by: Violet Hynes <[email protected]>
Co-authored-by: Mike Palmiotto <[email protected]>
  • Loading branch information
3 people authored Sep 1, 2023
1 parent 897cbbc commit bd36e66
Show file tree
Hide file tree
Showing 10 changed files with 40 additions and 4 deletions.
3 changes: 3 additions & 0 deletions changelog/22651.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:improvement
core/quotas: Add configuration to allow skipping of expensive role calculations
```
1 change: 1 addition & 0 deletions command/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2998,6 +2998,7 @@ func createCoreConfig(c *ServerCommand, config *server.Config, backend physical.
LogicalBackends: c.LogicalBackends,
Logger: c.logger,
DetectDeadlocks: config.DetectDeadlocks,
ImpreciseLeaseRoleTracking: config.ImpreciseLeaseRoleTracking,
DisableSentinelTrace: config.DisableSentinelTrace,
DisableCache: config.DisableCache,
DisableMlock: config.DisableMlock,
Expand Down
9 changes: 9 additions & 0 deletions command/server/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ type Config struct {

DetectDeadlocks string `hcl:"detect_deadlocks"`

ImpreciseLeaseRoleTracking bool `hcl:"imprecise_lease_role_tracking"`

EnableResponseHeaderRaftNodeID bool `hcl:"-"`
EnableResponseHeaderRaftNodeIDRaw interface{} `hcl:"enable_response_header_raft_node_id"`

Expand Down Expand Up @@ -412,6 +414,11 @@ func (c *Config) Merge(c2 *Config) *Config {
result.DetectDeadlocks = c2.DetectDeadlocks
}

result.ImpreciseLeaseRoleTracking = c.ImpreciseLeaseRoleTracking
if c2.ImpreciseLeaseRoleTracking {
result.ImpreciseLeaseRoleTracking = c2.ImpreciseLeaseRoleTracking
}

result.EnableResponseHeaderRaftNodeID = c.EnableResponseHeaderRaftNodeID
if c2.EnableResponseHeaderRaftNodeID {
result.EnableResponseHeaderRaftNodeID = c2.EnableResponseHeaderRaftNodeID
Expand Down Expand Up @@ -1144,6 +1151,8 @@ func (c *Config) Sanitized() map[string]interface{} {
"experiments": c.Experiments,

"detect_deadlocks": c.DetectDeadlocks,

"imprecise_lease_role_tracking": c.ImpreciseLeaseRoleTracking,
}
for k, v := range sharedResult {
result[k] = v
Expand Down
1 change: 1 addition & 0 deletions command/server/config_test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,7 @@ func testConfig_Sanitized(t *testing.T) {
"add_mount_point_rollback_metrics": false,
},
"administrative_namespace_path": "admin/",
"imprecise_lease_role_tracking": false,
}

addExpectedEntSanitizedConfig(expected, []string{"http"})
Expand Down
1 change: 1 addition & 0 deletions http/sys_config_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ func TestSysConfigState_Sanitized(t *testing.T) {
},
"storage": tc.expectedStorageOutput,
"administrative_namespace_path": "",
"imprecise_lease_role_tracking": false,
}

if tc.expectedHAStorageOutput != nil {
Expand Down
2 changes: 2 additions & 0 deletions http/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ func rateLimitQuotaWrapping(handler http.Handler, core *vault.Core) http.Handler
NamespacePath: ns.Path,
ClientAddress: parseRemoteIPAddress(r),
}

// This checks if any role based quota is required (LCQ or RLQ).
requiresResolveRole, err := core.ResolveRoleForQuotas(r.Context(), quotaReq)
if err != nil {
core.Logger().Error("failed to lookup quotas", "path", path, "error", err)
Expand Down
7 changes: 7 additions & 0 deletions vault/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,9 @@ type Core struct {
// if populated, the callback is called for every request
// for testing purposes
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.
Expand Down Expand Up @@ -760,6 +763,9 @@ type CoreConfig struct {
// Use the deadlocks library to detect deadlocks
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
DisableSentinelTrace bool

Expand Down Expand Up @@ -1032,6 +1038,7 @@ func CreateCore(conf *CoreConfig) (*Core, error) {
pendingRemovalMountsAllowed: conf.PendingRemovalMountsAllowed,
expirationRevokeRetryBase: conf.ExpirationRevokeRetryBase,
rollbackMountPathMetrics: conf.MetricSink.TelemetryConsts.RollbackMetricsIncludeMountPoint,
impreciseLeaseRoleTracking: conf.ImpreciseLeaseRoleTracking,
}

c.standbyStopCh.Store(make(chan struct{}))
Expand Down
14 changes: 10 additions & 4 deletions vault/request_handling.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
req.DisplayName = auth.DisplayName

// If this is not a role-based quota, we still need to associate the
// login role with this lease for later lease-count quotas to be
// accurate.
if reqRole == nil && resp.Auth.TokenType != logical.TokenTypeBatch {
requiresLease := resp.Auth.TokenType != logical.TokenTypeBatch

// If role was not already determined by http.rateLimitQuotaWrapping
// 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)
}

Expand Down
2 changes: 2 additions & 0 deletions vault/testing.go
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ func TestCoreWithSealAndUINoCleanup(t testing.T, opts *CoreConfig) *Core {
conf.CensusAgent = opts.CensusAgent
conf.AdministrativeNamespacePath = opts.AdministrativeNamespacePath
conf.AllLoggers = logger.AllLoggers
conf.ImpreciseLeaseRoleTracking = opts.ImpreciseLeaseRoleTracking

if opts.Logger != nil {
conf.Logger = opts.Logger
Expand Down Expand Up @@ -1553,6 +1554,7 @@ func NewTestCluster(t testing.T, base *CoreConfig, opts *TestClusterOptions) *Te
coreConfig.DisableAutopilot = base.DisableAutopilot
coreConfig.AdministrativeNamespacePath = base.AdministrativeNamespacePath
coreConfig.ServiceRegistration = base.ServiceRegistration
coreConfig.ImpreciseLeaseRoleTracking = base.ImpreciseLeaseRoleTracking

if base.BuiltinRegistry != nil {
coreConfig.BuiltinRegistry = base.BuiltinRegistry
Expand Down
4 changes: 4 additions & 0 deletions website/content/docs/configuration/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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
[`-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

The following parameters are used on backends that support [high availability][high-availability].
Expand Down

0 comments on commit bd36e66

Please sign in to comment.