Skip to content

Commit

Permalink
Prevent a deadlock in expiration (#22374)
Browse files Browse the repository at this point in the history
* Prevent a deadlock that occurs when Restore grabs lease lock then pending lock, while a revocationJob's OnFailure grabs those lock in the reverse order.

* Fix lock

* Add CL

* Grab lock before markLeaseIrrevocable

---------

Co-authored-by: hc-github-team-secure-vault-core <github-team-secure-vault-core@hashicorp.com>
  • Loading branch information
1 parent 7518664 commit abaf1d6
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
3 changes: 3 additions & 0 deletions changelog/22374.txt
@@ -0,0 +1,3 @@
```release-note:bug
expiration: Fix a deadlock that could occur when a revocation failure happens while restoring leases on startup.
```
6 changes: 5 additions & 1 deletion vault/expiration.go
Expand Up @@ -240,8 +240,8 @@ func (r *revocationJob) OnFailure(err error) {
r.m.core.metricSink.IncrCounterWithLabels([]string{"expire", "lease_expiration", "error"}, 1, []metrics.Label{metricsutil.NamespaceLabel(r.ns)})

r.m.pendingLock.Lock()
defer r.m.pendingLock.Unlock()
pendingRaw, ok := r.m.pending.Load(r.leaseID)
r.m.pendingLock.Unlock()
if !ok {
r.m.logger.Warn("failed to find lease in pending map for revocation retry", "lease_id", r.leaseID)
return
Expand Down Expand Up @@ -269,15 +269,19 @@ func (r *revocationJob) OnFailure(err error) {
return
}

r.m.pendingLock.Lock()
r.m.markLeaseIrrevocable(r.nsCtx, le, err)
r.m.pendingLock.Unlock()
return
} else {
r.m.logger.Error("failed to revoke lease", "lease_id", r.leaseID, "error", err,
"attempts", pending.revokesAttempted, "next_attempt", newTimer)
}

pending.timer.Reset(newTimer)
r.m.pendingLock.Lock()
r.m.pending.Store(r.leaseID, pending)
r.m.pendingLock.Unlock()
}

func expireLeaseStrategyFairsharing(ctx context.Context, m *ExpirationManager, leaseID string, ns *namespace.Namespace) {
Expand Down

0 comments on commit abaf1d6

Please sign in to comment.