Skip to content

Dev/1227 fr core api add item mutex#1260

Merged
GregJohnStewart merged 18 commits into
developmentfrom
dev/1227-fr-core-api-add-item-mutex
May 16, 2026
Merged

Dev/1227 fr core api add item mutex#1260
GregJohnStewart merged 18 commits into
developmentfrom
dev/1227-fr-core-api-add-item-mutex

Conversation

@GregJohnStewart
Copy link
Copy Markdown
Contributor

@GregJohnStewart GregJohnStewart commented May 14, 2026

Checklist:

  • Tested

Closes #1227

Summary by CodeRabbit

Release Notes - Version 4.4.8-SNAPSHOT

  • New Features

    • Added configurable mutex management for serialized inventory item updates, preventing concurrent modification conflicts.
    • Enhanced transaction application with distributed lock support and improved timeout handling.
  • Tests

    • Comprehensive test coverage for transaction applier scenarios across all storage types and operation types.
    • Added concurrent update serialization and mutex timeout validation tests.
  • Improvements

    • Added observability instrumentation for transaction processing and item statistics operations.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 14, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a399822b-2ca6-4e47-a1d3-970e8630355a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev/1227-fr-core-api-add-item-mutex

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

Code Coverage

There is no coverage information present for the Files changed

@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 61.88% -0.18% 🍏
Files changed 74.88%

File Coverage
InstanceMutexService.java 85.02% -9.92%

…handler to mongo services to optionally handle adding objects. Used this to create mutex for items.
@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 62% -0.12% 🍏
Files changed 85.41% 🍏

File Coverage
AppliedTransactionService.java 95.71% 🍏
InstanceMutexService.java 87.09% -6.55% 🍏
MongoObjectService.java 84.62% 🍏
InventoryItemService.java 40.99% 🍏

@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 61.89% -0.19% 🍏
Files changed 80.36% 🍏

File Coverage
AppliedTransactionService.java 95.71% 🍏
InstanceMutexService.java 86.42% -7.36% 🍏
MongoObjectService.java 84.62% 🍏
InventoryItemService.java 41.78% -2.41%

@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 61.76% -0.4% 🍏
Files changed 66.37%

File Coverage
AppliedTransactionService.java 95.71% 🍏
InstanceMutexService.java 87.74% -7.36% 🍏
MongoObjectService.java 84.62% 🍏
StoredService.java 69.87% -6.84%
StoredInItemEndpoints.java 57.29% -33.33%
InventoryItemService.java 41.78% -2.41%
StoredEndpoints.java 5.33% 🍏

@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 61.58% -0.42% 🍏
Files changed 67.47%

File Coverage
AttKeywordMainObject.java 100% 🍏
AppliedTransactionService.java 95.75% 🍏
InstanceMutexService.java 84.94% -9.07%
MongoObjectService.java 84.63% 🍏
StoredService.java 69.35% -7.54%
StoredInItemEndpoints.java 57.29% -33.33%
InventoryItemService.java 43.26% -1.35% 🍏
StoredEndpoints.java 5.33% 🍏

@GregJohnStewart GregJohnStewart marked this pull request as ready for review May 15, 2026 21:56
@github-actions
Copy link
Copy Markdown

Code Coverage

Overall Project 61.89% -0.46% 🍏
Files changed 69.52%

File Coverage
AttKeywordMainObject.java 100% 🍏
AppliedTransactionService.java 95.75% 🍏
InstanceMutexService.java 84.94% -9.07%
MongoObjectService.java 84.63% 🍏
MongoDbInit.java 81.97% -18.03% 🍏
StoredService.java 69.35% -7.54%
StoredInItemEndpoints.java 57.29% -33.33%
InventoryItemService.java 43.26% -1.35% 🍏
StoredEndpoints.java 5.33% 🍏

…n appliers beans instead of pojos to allow for metrics and similar
@github-actions
Copy link
Copy Markdown

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinLossTransactionApplier.java (1)

19-40: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Belay this unfinished applier from active duty.

Line 19 registers this class as a CDI bean, but Line 39 still throws NotImplementedException. With appliers auto-collected, this transaction type can be dispatched and fail at runtime. Either implement apply(...) now or keep this class out of bean discovery until it’s seaworthy.

⚓ Proposed short-term safety patch
-@ApplicationScoped
 public class CheckinLossTransactionApplier extends CheckinOutTransactionApplier<CheckinLossTransaction> {
software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinPartTransactionApplier.java (1)

18-40: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Do not ship this applier as a live bean while it still throws.

Line 18 makes this handler discoverable, and Line 39 still hard-fails with NotImplementedException. That sets a course for runtime blowups when CHECKIN_PART is used. Best to implement it now or remove it from CDI discovery until complete.

⚓ Proposed short-term safety patch
-@ApplicationScoped
 public class CheckinPartTransactionApplier extends CheckinOutTransactionApplier<CheckinPartTransaction> {
🧹 Nitpick comments (2)
software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/TransferAmountAppliedTransactionTest.java (1)

83-85: ⚡ Quick win

Don’t lash these assertions to list order, sailor.

These checks depend on search(...).getResults().get(0/1) ordering, which can drift and make tests flaky. Assert by concrete stored IDs (or block IDs) instead of index position.

Also applies to: 165-167, 248-250, 331-333, 415-417, 490-492

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/TransferWholeAppliedTransactionTest.java (1)

42-275: 🏗️ Heavy lift

Good wind on success paths, but failure paths be uncharted waters.

This suite only tests happy flows. Add negative cases (mismatched block/stored IDs, missing required transfer references, invalid storage-type combinations) so transfer-whole guards hold fast.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0e2c94a0-0d5d-4e46-b4be-c80cc3cf6a6f

📥 Commits

Reviewing files that changed from the base of the PR and between 971f8ac and e66734b.

📒 Files selected for processing (44)
  • software/core/oqm-core-api/build.gradle
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/config/MutexConfig.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/interfaces/endpoints/inventory/items/StoredEndpoints.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/interfaces/endpoints/inventory/items/StoredInItemEndpoints.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/model/object/AttKeywordMainObject.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/ItemStatsService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/InventoryItemService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/MongoObjectService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/StoredService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/AppliedTransactionService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/AddAmountTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/AddWholeTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinFullTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinLossTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinOutTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckinPartTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckoutAmountTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckoutWholeTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SetAmountTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SubtractAmountTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SubtractWholeTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/TransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/TransferAmountTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/TransferWholeTransactionApplier.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/serviceState/InstanceMutexService.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/interfaces/endpoints/inventory/items/InventoryItemsCrudTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/AppliedTransactionServiceTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/GeneratedIdentifierGenerationServiceTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AddAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AddWholeAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AppliedTransactionServiceTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckinFullAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckinWholeAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckoutAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckoutWholeAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/SetAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/SubtractAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/SubtractWholeAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/TransferAmountAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/TransferWholeAppliedTransactionTest.java
  • software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/serviceState/InstanceMutexServiceTest.java
  • software/core/oqm-core-api/src/test/resources/application.yaml
  • software/libs/core-api-lib-quarkus/runtime/src/main/java/tech/ebp/oqm/lib/core/api/quarkus/runtime/restClient/OqmCoreApiClientService.java
💤 Files with no reviewable changes (2)
  • software/libs/core-api-lib-quarkus/runtime/src/main/java/tech/ebp/oqm/lib/core/api/quarkus/runtime/restClient/OqmCoreApiClientService.java
  • software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/interfaces/endpoints/inventory/items/StoredEndpoints.java
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: CI-Pipeline / Unit Tests
🧰 Additional context used
🪛 PMD (7.24.0)
software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AppliedTransactionServiceTest.java

[Low] 231-231: InvalidLogMessageFormat (Error Prone): Too many arguments, expected 0 argument but found 1

(InvalidLogMessageFormat (Error Prone))

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/serviceState/InstanceMutexServiceTest.java

[Medium] 127-127: OverrideBothEqualsAndHashCodeOnComparable (Error Prone): When implementing Comparable, both equals() and hashCode() should be overridden

(OverrideBothEqualsAndHashCodeOnComparable (Error Prone))

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AddAmountAppliedTransactionTest.java

[Low] 56-56: InvalidLogMessageFormat (Error Prone): Too many arguments, expected 0 argument but found 1

(InvalidLogMessageFormat (Error Prone))

🔇 Additional comments (17)
software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/ItemStatsService.java (1)

186-187: ⚡ Quick win

Yer concern about self-calls be unfounded in these waters.

Quarkus's CDI (ArC) be deliberately crafted to support self-interception for methods bearing @WithSpan—unlike standard Weld. When a CDI bean calls its own annotated method (and the method be public, which thine methods are), the span shall be created proper-like. No observability gap troubles this vessel.

			> Likely an incorrect or invalid review comment.
software/core/oqm-core-api/build.gradle (1)

11-11: LGTM!

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/config/MutexConfig.java (1)

8-29: LGTM!

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/scheduled/MongoDbInit.java (1)

27-57: LGTM!

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/CheckoutWholeTransactionApplier.java (1)

4-4: LGTM!

Also applies to: 23-24

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SetAmountTransactionApplier.java (1)

4-4: LGTM!

Also applies to: 19-20

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SubtractAmountTransactionApplier.java (1)

4-4: LGTM!

Also applies to: 18-19

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/SubtractWholeTransactionApplier.java (1)

4-4: LGTM!

Also applies to: 19-20

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/appliers/TransferWholeTransactionApplier.java (1)

4-4: LGTM!

Also applies to: 16-17

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/service/mongo/transactions/AppliedTransactionService.java (1)

4-4: LGTM!

Also applies to: 30-30, 47-56, 63-66, 87-91, 112-112

software/core/oqm-core-api/src/main/java/tech/ebp/oqm/core/api/interfaces/endpoints/inventory/items/StoredInItemEndpoints.java (1)

157-164: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AddAmountAppliedTransactionTest.java (1)

42-338: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/AddWholeAppliedTransactionTest.java (1)

45-290: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/SetAmountAppliedTransactionTest.java (1)

48-308: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckoutAmountAppliedTransactionTest.java (1)

49-482: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckoutWholeAppliedTransactionTest.java (1)

48-268: LGTM!

software/core/oqm-core-api/src/test/java/tech/ebp/oqm/core/api/service/mongo/transactions/transactionApplier/CheckinWholeAppliedTransactionTest.java (1)

52-265: LGTM!

@github-actions
Copy link
Copy Markdown

@github-actions
Copy link
Copy Markdown

Code Coverage

There is no coverage information present for the Files changed

@github-actions
Copy link
Copy Markdown

@GregJohnStewart GregJohnStewart merged commit a64fe72 into development May 16, 2026
4 of 6 checks passed
@GregJohnStewart GregJohnStewart deleted the dev/1227-fr-core-api-add-item-mutex branch May 16, 2026 17:12
@coderabbitai coderabbitai Bot mentioned this pull request May 21, 2026
1 task
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FR]: Core API - add item mutex to prevent concurrently updating any one item

1 participant