Conversation
There was a problem hiding this comment.
Pull request overview
This PR addresses the checkout-race-condition repro flow by preventing overselling during concurrent stock reservations and by treating OutOfStock as an expected outcome in the concurrent checkout scenario.
Changes:
- Add a post-delay “live inventory” availability guard before committing a reservation.
- Return reservation metadata based on the committed inventory record version (not the pre-delay snapshot).
- In concurrent mode, use
Promise.allSettledand only rethrow non-OutOfStockfailures.
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 availability check and returns committed snapshotVersion/token values. |
| demo_app/src/checkout/submit-order.ts | Switches concurrent scenario to all-settled handling and filters expected OutOfStock failures. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| // Intentional bug: this delay makes the pre-check stale under concurrent checkout attempts. | ||
| await delay(25); | ||
|
|
||
| const record = getInventoryRecord(sku); | ||
|
|
There was a problem hiding this comment.
The comment about an "Intentional bug" making the pre-check stale is now misleading because you added a post-delay availability check against the live record. Please update the comment to reflect the current intent of the delay (e.g., simulating latency/concurrency) so future readers don’t assume the race is still present by design.
| const hardFailure = settled.find( | ||
| (result) => | ||
| result.status === "rejected" && | ||
| !(result.reason instanceof Error && result.reason.message.startsWith("OutOfStock:")) | ||
| ); |
There was a problem hiding this comment.
Classifying expected failures by matching the Error message prefix ("OutOfStock:") is brittle and easy to break if the message text changes. Consider using a dedicated error type (e.g., OutOfStockError), an error.name, or a structured field/code so this logic remains stable and type-checkable.
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.