Conversation
There was a problem hiding this comment.
Pull request overview
This PR addresses the demo checkout oversell/race scenario by preventing inventory from going negative under concurrent checkouts and by treating “out of stock” as an expected outcome when running the concurrent repro harness.
Changes:
- Add a post-delay availability check in
reserveStockto prevent overselling during concurrent reservations. - Update the concurrent checkout scenario runner to use
Promise.allSettledand only fail on non-OutOfStock errors.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| demo_app/src/inventory/reserve-stock.ts | Adds a post-delay inventory guard and aligns returned reservation metadata with the committed record state. |
| demo_app/src/checkout/submit-order.ts | Changes concurrent scenario execution to tolerate expected OutOfStock rejections while still surfacing unexpected failures. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| const hardFailure = settled.find( | ||
| (result) => | ||
| result.status === "rejected" && | ||
| !(result.reason instanceof Error && result.reason.message.startsWith("OutOfStock:")) | ||
| ); |
There was a problem hiding this comment.
runCheckoutRaceScenario is classifying expected failures by checking Error.message.startsWith("OutOfStock:"). This is brittle (message text changes/bundling can break it) and couples checkout flow to a string format. Prefer a structured signal (e.g., a dedicated OutOfStockError class, an exported type guard like isOutOfStockError(), or a stable error code property) and check that instead.
| if (record.available < quantity) { | ||
| throw new Error(`OutOfStock: ${sku}`); | ||
| } |
There was a problem hiding this comment.
The in-function comment above the delay still says the delay is an “intentional bug” that makes the pre-check stale, but the newly-added post-delay availability check changes the behavior (the stale pre-check is now mitigated). Please update that comment to reflect the current intent so future readers don’t think the race is still present by design.
Summary
Resolve
checkout-race-conditionforcheckout-apiwith a validated ReplayX patch candidate.Changed Files
Validation
Rollback
Revert the live inventory guard and concurrent checkout settlement handling.