mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 02:28:09 +00:00 
			
		
		
		
	backport of commit 547bff752e (#23320)
				
					
				
			This commit is contained in:
		 hc-github-team-secure-vault-core
					hc-github-team-secure-vault-core
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							4450198a7e
						
					
				
				
					commit
					3388dab4e6
				
			
							
								
								
									
										3
									
								
								changelog/23282.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								changelog/23282.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| ```release-note:bug | ||||
| expiration: Prevent large lease loads from delaying state changes, e.g. becoming active or standby. | ||||
| ``` | ||||
| @@ -144,7 +144,7 @@ type ExpirationManager struct { | ||||
| 	leaseCheckCounter *uint32 | ||||
|  | ||||
| 	logLeaseExpirations bool | ||||
| 	expireFunc          ExpireLeaseStrategy | ||||
| 	expireFunc          atomic.Pointer[ExpireLeaseStrategy] | ||||
|  | ||||
| 	// testRegisterAuthFailure, if set to true, triggers an explicit failure on | ||||
| 	// RegisterAuth to simulate a partial failure during a token creation | ||||
| @@ -357,11 +357,11 @@ func NewExpirationManager(c *Core, view *BarrierView, e ExpireLeaseStrategy, log | ||||
| 		leaseCheckCounter: new(uint32), | ||||
|  | ||||
| 		logLeaseExpirations: os.Getenv("VAULT_SKIP_LOGGING_LEASE_EXPIRATIONS") == "", | ||||
| 		expireFunc:          e, | ||||
|  | ||||
| 		jobManager:      jobManager, | ||||
| 		revokeRetryBase: c.expirationRevokeRetryBase, | ||||
| 	} | ||||
| 	exp.expireFunc.Store(&e) | ||||
| 	if exp.revokeRetryBase == 0 { | ||||
| 		exp.revokeRetryBase = revokeRetryBase | ||||
| 	} | ||||
| @@ -843,6 +843,8 @@ func (m *ExpirationManager) processRestore(ctx context.Context, leaseID string) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func expireNoop(ctx context.Context, manager *ExpirationManager, s string, n *namespace.Namespace) {} | ||||
|  | ||||
| // Stop is used to prevent further automatic revocations. | ||||
| // This must be called before sealing the view. | ||||
| func (m *ExpirationManager) Stop() error { | ||||
| @@ -857,27 +859,24 @@ func (m *ExpirationManager) Stop() error { | ||||
| 	close(m.quitCh) | ||||
|  | ||||
| 	m.pendingLock.Lock() | ||||
| 	// Replacing the entire map would cause a race with | ||||
| 	// a simultaneous WalkTokens, which doesn't hold pendingLock. | ||||
| 	m.pending.Range(func(key, value interface{}) bool { | ||||
| 		info := value.(pendingInfo) | ||||
| 		info.timer.Stop() | ||||
| 		m.pending.Delete(key) | ||||
| 		return true | ||||
| 	}) | ||||
| 	// We don't want any lease timers that fire to do anything; they can wait | ||||
| 	// for the next ExpirationManager to handle them. | ||||
| 	newStrategy := ExpireLeaseStrategy(expireNoop) | ||||
| 	m.expireFunc.Store(&newStrategy) | ||||
| 	oldPending := m.pending | ||||
| 	m.pending, m.nonexpiring, m.irrevocable = sync.Map{}, sync.Map{}, sync.Map{} | ||||
| 	m.leaseCount = 0 | ||||
| 	m.nonexpiring.Range(func(key, value interface{}) bool { | ||||
| 		m.nonexpiring.Delete(key) | ||||
| 		return true | ||||
| 	}) | ||||
| 	m.uniquePolicies = make(map[string][]string) | ||||
| 	m.irrevocable.Range(func(key, _ interface{}) bool { | ||||
| 		m.irrevocable.Delete(key) | ||||
| 		return true | ||||
| 	}) | ||||
| 	m.irrevocableLeaseCount = 0 | ||||
| 	m.pendingLock.Unlock() | ||||
|  | ||||
| 	go oldPending.Range(func(key, value interface{}) bool { | ||||
| 		info := value.(pendingInfo) | ||||
| 		// We need to stop the timers to prevent memory leaks. | ||||
| 		info.timer.Stop() | ||||
| 		return true | ||||
| 	}) | ||||
|  | ||||
| 	if m.inRestoreMode() { | ||||
| 		for { | ||||
| 			if !m.inRestoreMode() { | ||||
| @@ -1878,7 +1877,8 @@ func (m *ExpirationManager) updatePendingInternal(le *leaseEntry) { | ||||
| 			leaseID, namespace := le.LeaseID, le.namespace | ||||
| 			// Extend the timer by the lease total | ||||
| 			timer := time.AfterFunc(leaseTotal, func() { | ||||
| 				m.expireFunc(m.quitContext, m, leaseID, namespace) | ||||
| 				expFn := *m.expireFunc.Load() // Load and deref the pointer | ||||
| 				expFn(m.quitContext, m, leaseID, namespace) | ||||
| 			}) | ||||
| 			pending = pendingInfo{ | ||||
| 				timer: timer, | ||||
| @@ -2468,8 +2468,13 @@ func (m *ExpirationManager) WalkTokens(walkFn ExpirationWalkFunction) error { | ||||
| 		return true | ||||
| 	} | ||||
|  | ||||
| 	m.pending.Range(callback) | ||||
| 	m.nonexpiring.Range(callback) | ||||
| 	m.pendingLock.RLock() | ||||
| 	toWalk := []sync.Map{m.pending, m.nonexpiring} | ||||
| 	m.pendingLock.RUnlock() | ||||
|  | ||||
| 	for _, m := range toWalk { | ||||
| 		m.Range(callback) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
| @@ -2492,8 +2497,13 @@ func (m *ExpirationManager) walkLeases(walkFn leaseWalkFunction) error { | ||||
| 		return walkFn(key.(string), expireTime) | ||||
| 	} | ||||
|  | ||||
| 	m.pending.Range(callback) | ||||
| 	m.nonexpiring.Range(callback) | ||||
| 	m.pendingLock.RLock() | ||||
| 	toWalk := []sync.Map{m.pending, m.nonexpiring} | ||||
| 	m.pendingLock.RUnlock() | ||||
|  | ||||
| 	for _, m := range toWalk { | ||||
| 		m.Range(callback) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user