Conversation
There was a problem hiding this comment.
Pull request overview
Resolves the checkout race condition by preventing overselling during concurrent reservations and making the concurrent checkout scenario treat expected out-of-stock outcomes as non-fatal.
Changes:
- Add a post-delay (commit-time) availability check in
reserveStockto prevent stale pre-checks from overselling. - Return reservation metadata based on the committed inventory record version.
- Update concurrent checkout scenario execution to use
Promise.allSettledand ignore expected out-of-stock failures.
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 commit-time inventory guard and aligns returned reservation metadata with committed state. |
| demo_app/src/checkout/submit-order.ts | Uses allSettled for concurrent runs and only escalates non-out-of-stock failures. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| const record = getInventoryRecord(sku); | ||
|
|
||
| if (record.available < quantity) { | ||
| throw new Error(`OutOfStock: ${sku}`); |
There was a problem hiding this comment.
The out-of-stock guard after the delay fixes the TOCTOU behavior, but the nearby comment about an “Intentional bug” making the pre-check stale is now misleading (the stale pre-check no longer causes an incorrect commit). Consider updating/removing that comment and/or removing the earlier snapshot-based pre-check to avoid keeping a stale-check pattern in the example.
| const hardFailure = settled.find( | ||
| (result) => | ||
| result.status === "rejected" && | ||
| !(result.reason instanceof Error && result.reason.message.startsWith("OutOfStock:")) | ||
| ); |
There was a problem hiding this comment.
Filtering expected failures by checking error.message.startsWith("OutOfStock:") is brittle (message text is not a stable API) and makes it easy to accidentally treat a real error as ignorable after a message change. Prefer a typed error (e.g., class OutOfStockError extends Error) or an explicit error code/name check, ideally via a small helper like isOutOfStockError(reason).
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.