Hierarchical Keyring: cold-cache stampede — N concurrent decrypts → N DynamoDB/KMS calls
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 52/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- aws, node.js, typescript
Research direction
Start at the Node Hierarchical Keyring's getBranchKeyMaterials path and trace how the materials cache handles a cold-cache lookup. Reproduce the issue with concurrent decrypts or encrypts for one branch-key version and verify that one in-flight keystore request is shared, settled entries are removed, and a failed request can be retried.
Written by the indexing model from the issue text.
Description
Security issue notifications
If you discover a potential security issue in the AWS Encryption SDK we ask that you notify AWS Security via our vulnerability reporting page. Please do not create a public GitHub issue.
Problem:
The Node Hierarchical Keyring doesn't de-dupe concurrent branch-key lookups. If I fire a lot of decrypts for the same branch key at once against a cold cache, they all miss the cache together (it's only filled after the keystore call returns), so each one hits the keystore on its own.
So instead of one lookup I get N DynamoDB GetItem + N KMS Decrypt calls. Easy to repro: await Promise.all of ~3000 decrypts for the same key version, and you see ~3000 keystore calls instead of 1. Encrypt has the same problem since it shares the same code path.
Solution:
Add single-flight to getBranchKeyMaterials: on a miss, the first caller starts the keystore fetch and stores the in-flight promise (keyed by cache entry id); everyone else for the same key awaits that promise instead of starting their own. The entry is dropped once it settles, so the materials cache still owns caching and TTL, and a failed request isn't shared — the next call just retries.
Out of scope:
The legacy caching CMM has the same gap but it's a separate path, so I'm not touching it here.
- Dominant language
- TypeScript
- Stars
- 260
- Forks
- 68
- PR merge metrics
- No merged PRs in 30d
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from aws/aws-encryption-sdk-javascript
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
aws/aws-encryption-sdk-javascript#1656 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 68/100
aws/aws-encryption-sdk-javascript#1691 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
aws/aws-encryption-sdk-javascript#1665 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 35/100
aws/aws-encryption-sdk-javascript#1520 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 35/100
aws/aws-encryption-sdk-javascript#1192 · 3 comments ·
All issues in aws/aws-encryption-sdk-javascript
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
bug clawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P2 regression
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
calcite-components needs triage refactor
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Esri/calcite-design-system#15203 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 78/100
fullcalendar/fullcalendar#8106 ·