Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.14.0
-
None
-
Unknown
Description
CAMEL-6097 Patched a pretty clear race condition between the completion thread (CT) and recovery thread (RT) but leaves several holes when exercised with a Jdbc repository and a separate aggregation thread (AT).
#1 is relevant to all repository backends.
#2 only affects fully transactional backends
I'm currently taking a look into this bug as its a show-stopper that persistent repositories actually decreases reliability. (Untested) workaround is to add an in-memory idemptotentconsumer immediately after the aggregation.
Here AT starts and completes an aggregation between defensive copy and when RT repo scanning starts. CT then confirms it (in memory ) before repo scanning ends.
AT | RT | CT | |
---|---|---|---|
inProg COPY to inProgCopy | |||
repo START x | |||
repo REMOVE x | |||
<commit> | |||
inProg ADD x | |||
repo SCAN (sees x) | |||
process x | |||
repo CONFIRM x | |||
inProg REMOVE x | |||
<commit> | |||
x not inProg or inProgCopy | |||
process x | |||
repo CONFIRM x | Fails silently as this is doInTransactionWithoutResult | ||
<commit> |
SQLWarning ignored: SQL state '02000', error code '10000', message [No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table.]
Side note: inProgressExchanges is updated by a Synchronisation inside the UOW so is immediately visible although any DB change may not be visible for ages (in threading terms) as the entire transaction must commit first.
Attachments
Issue Links
- is related to
-
CAMEL-6097 Race condition in AggregatorProcessor recovery sometimes causes duplicates
- Resolved
-
CAMEL-4271 jdbc aggregation repository - recovery taks and cluster issue
- Resolved
- links to