Minimal change to ensure that the bulky leaseEntry isn't kept in memory. (#10726)
This commit is contained in:
parent
0becd555cf
commit
c2bdeb9e7d
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:improvement
|
||||||
|
core: reduce memory used by leases
|
||||||
|
```
|
|
@ -116,10 +116,10 @@ type ExpirationManager struct {
|
||||||
testRegisterAuthFailure uberAtomic.Bool
|
testRegisterAuthFailure uberAtomic.Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type ExpireLeaseStrategy func(context.Context, *ExpirationManager, *leaseEntry)
|
type ExpireLeaseStrategy func(context.Context, *ExpirationManager, string, *namespace.Namespace)
|
||||||
|
|
||||||
// revokeIDFunc is invoked when a given ID is expired
|
// revokeIDFunc is invoked when a given ID is expired
|
||||||
func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, le *leaseEntry) {
|
func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, leaseID string, ns *namespace.Namespace) {
|
||||||
for attempt := uint(0); attempt < maxRevokeAttempts; attempt++ {
|
for attempt := uint(0); attempt < maxRevokeAttempts; attempt++ {
|
||||||
releasePermit := func() {}
|
releasePermit := func() {}
|
||||||
if m.revokePermitPool != nil {
|
if m.revokePermitPool != nil {
|
||||||
|
@ -129,10 +129,10 @@ func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, le *le
|
||||||
m.logger.Trace("expiring lease; got permit pool")
|
m.logger.Trace("expiring lease; got permit pool")
|
||||||
}
|
}
|
||||||
|
|
||||||
metrics.IncrCounterWithLabels([]string{"expire", "lease_expiration"}, 1, []metrics.Label{{"namespace", le.namespace.ID}})
|
metrics.IncrCounterWithLabels([]string{"expire", "lease_expiration"}, 1, []metrics.Label{{"namespace", ns.ID}})
|
||||||
|
|
||||||
revokeCtx, cancel := context.WithTimeout(ctx, DefaultMaxRequestDuration)
|
revokeCtx, cancel := context.WithTimeout(ctx, DefaultMaxRequestDuration)
|
||||||
revokeCtx = namespace.ContextWithNamespace(revokeCtx, le.namespace)
|
revokeCtx = namespace.ContextWithNamespace(revokeCtx, ns)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
select {
|
select {
|
||||||
|
@ -145,12 +145,12 @@ func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, le *le
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-m.quitCh:
|
case <-m.quitCh:
|
||||||
m.logger.Error("shutting down, not attempting further revocation of lease", "lease_id", le.LeaseID)
|
m.logger.Error("shutting down, not attempting further revocation of lease", "lease_id", leaseID)
|
||||||
releasePermit()
|
releasePermit()
|
||||||
cancel()
|
cancel()
|
||||||
return
|
return
|
||||||
case <-m.quitContext.Done():
|
case <-m.quitContext.Done():
|
||||||
m.logger.Error("core context canceled, not attempting further revocation of lease", "lease_id", le.LeaseID)
|
m.logger.Error("core context canceled, not attempting further revocation of lease", "lease_id", leaseID)
|
||||||
releasePermit()
|
releasePermit()
|
||||||
cancel()
|
cancel()
|
||||||
return
|
return
|
||||||
|
@ -158,7 +158,7 @@ func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, le *le
|
||||||
}
|
}
|
||||||
|
|
||||||
m.coreStateLock.RLock()
|
m.coreStateLock.RLock()
|
||||||
err := m.Revoke(revokeCtx, le.LeaseID)
|
err := m.Revoke(revokeCtx, leaseID)
|
||||||
m.coreStateLock.RUnlock()
|
m.coreStateLock.RUnlock()
|
||||||
releasePermit()
|
releasePermit()
|
||||||
cancel()
|
cancel()
|
||||||
|
@ -166,12 +166,12 @@ func expireLeaseStrategyRevoke(ctx context.Context, m *ExpirationManager, le *le
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
metrics.IncrCounterWithLabels([]string{"expire", "lease_expiration", "error"}, 1, []metrics.Label{{"namespace", le.namespace.ID}})
|
metrics.IncrCounterWithLabels([]string{"expire", "lease_expiration", "error"}, 1, []metrics.Label{{"namespace", ns.ID}})
|
||||||
|
|
||||||
m.logger.Error("failed to revoke lease", "lease_id", le.LeaseID, "error", err)
|
m.logger.Error("failed to revoke lease", "lease_id", leaseID, "error", err)
|
||||||
time.Sleep((1 << attempt) * revokeRetryBase)
|
time.Sleep((1 << attempt) * revokeRetryBase)
|
||||||
}
|
}
|
||||||
m.logger.Error("maximum revoke attempts reached", "lease_id", le.LeaseID)
|
m.logger.Error("maximum revoke attempts reached", "lease_id", leaseID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewExpirationManager creates a new ExpirationManager that is backed
|
// NewExpirationManager creates a new ExpirationManager that is backed
|
||||||
|
@ -1524,9 +1524,10 @@ func (m *ExpirationManager) updatePendingInternal(le *leaseEntry) {
|
||||||
pending.timer.Reset(leaseTotal)
|
pending.timer.Reset(leaseTotal)
|
||||||
// No change to lease count in this case
|
// No change to lease count in this case
|
||||||
} else {
|
} else {
|
||||||
|
leaseID, namespace := le.LeaseID, le.namespace
|
||||||
// Extend the timer by the lease total
|
// Extend the timer by the lease total
|
||||||
timer := time.AfterFunc(leaseTotal, func() {
|
timer := time.AfterFunc(leaseTotal, func() {
|
||||||
m.expireFunc(m.quitContext, m, le)
|
m.expireFunc(m.quitContext, m, leaseID, namespace)
|
||||||
})
|
})
|
||||||
pending = pendingInfo{
|
pending = pendingInfo{
|
||||||
timer: timer,
|
timer: timer,
|
||||||
|
|
Loading…
Reference in New Issue