Skip to content

Commit 79f170d

Browse files
backport of commit 91ec1a7 (#24362)
Co-authored-by: Scott Miller <[email protected]>
1 parent b0b53cf commit 79f170d

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

changelog/24336.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
core: Fix a timeout initializing Vault by only using a short timeout persisting barrier keyring encryption counts.
3+
```

vault/barrier_aes_gcm.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ const (
3434

3535
autoRotateCheckInterval = 5 * time.Minute
3636
legacyRotateReason = "legacy rotation"
37+
// The keyring is persisted before the root key.
38+
keyringTimeout = 1 * time.Second
3739
)
3840

3941
// Versions of the AESGCM storage methodology
@@ -208,11 +210,18 @@ func (b *AESGCMBarrier) Initialize(ctx context.Context, key, sealKey []byte, rea
208210
// persistKeyring is used to write out the keyring using the
209211
// root key to encrypt it.
210212
func (b *AESGCMBarrier) persistKeyring(ctx context.Context, keyring *Keyring) error {
211-
const (
212-
// The keyring is persisted before the root key.
213-
keyringTimeout = 1 * time.Second
214-
)
213+
return b.persistKeyringInternal(ctx, keyring, false)
214+
}
215+
216+
// persistKeyringBestEffort is like persistKeyring but 'best effort', ie times out early
217+
// for non critical keyring writes (encryption/rotation tracking)
218+
func (b *AESGCMBarrier) persistKeyringBestEffort(ctx context.Context, keyring *Keyring) error {
219+
return b.persistKeyringInternal(ctx, keyring, true)
220+
}
215221

222+
// persistKeyring is used to write out the keyring using the
223+
// root key to encrypt it.
224+
func (b *AESGCMBarrier) persistKeyringInternal(ctx context.Context, keyring *Keyring, bestEffort bool) error {
216225
// Create the keyring entry
217226
keyringBuf, err := keyring.Serialize()
218227
defer memzero(keyringBuf)
@@ -238,10 +247,16 @@ func (b *AESGCMBarrier) persistKeyring(ctx context.Context, keyring *Keyring) er
238247
Value: value,
239248
}
240249

241-
// We reduce the timeout on the initial 'put' but if this succeeds we will
242-
// allow longer later on when we try to persist the root key .
243-
ctxKeyring, cancelKeyring := context.WithTimeout(ctx, keyringTimeout)
244-
defer cancelKeyring()
250+
ctxKeyring := ctx
251+
252+
if bestEffort {
253+
// We reduce the timeout on the initial 'put' but if this succeeds we will
254+
// allow longer later on when we try to persist the root key .
255+
var cancelKeyring func()
256+
ctxKeyring, cancelKeyring = context.WithTimeout(ctx, keyringTimeout)
257+
defer cancelKeyring()
258+
}
259+
245260
if err := b.backend.Put(ctxKeyring, pe); err != nil {
246261
return fmt.Errorf("failed to persist keyring: %w", err)
247262
}
@@ -1228,7 +1243,7 @@ func (b *AESGCMBarrier) persistEncryptions(ctx context.Context) error {
12281243
newEncs := upe + 1
12291244
activeKey.Encryptions += uint64(newEncs)
12301245
newKeyring := b.keyring.Clone()
1231-
err := b.persistKeyring(ctx, newKeyring)
1246+
err := b.persistKeyringBestEffort(ctx, newKeyring)
12321247
if err != nil {
12331248
return err
12341249
}

0 commit comments

Comments
 (0)