Marc Carter created CAMEL-8010:
----------------------------------
Summary: Race condition in AggregatorProcessor recovery sometimes
causes duplicates (still)
Key: CAMEL-8010
URL: https://issues.apache.org/jira/browse/CAMEL-8010
Project: Camel
Issue Type: Bug
Components: camel-core
Affects Versions: 2.14.0
Reporter: Marc Carter
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 (ACID) repository.
#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.
h4. Sequence #1
Here CT starts and completes an aggregation between defensive copy and whenrepo
scanning starts. CT then confirms it before repo scanning ends.
|| RT || CT ||
| inProg COPY to inProgCopy | |
| | inProg ADD x |
| | repo START x |
| | repo REMOVE x |
| | <commit> |
| repo SCAN (sees x) | |
| | {color:red}process x{color} |
| | repo CONFIRM x |
| | inProg REMOVE x |
| | <commit> |
| x not inProg or inProgCopy | |
| {color:red}process x{color} | |
| <commit> | |
h4. Sequence #2
More pernicious is that CT removes x from inProg and the database whilst still
_inside_ the transaction. This means the inProg change is visible immediately
to RT but the database change certainly is not (assuming rational deafult of
READ_COMMITTED)
|| RT || CT ||
| | inProg ADD x |
| | repo START x |
| | repo REMOVE x |
| | <commit> |
| | {color:red}process x{color} |
| | repo CONFIRM x |
| | inProg REMOVE x |
| inProg COPY to inProgCopy | |
| repo SCAN (sees x) | |
| | <commit> |
| x not inProg or inProgCopy | |
| {color:red}process x{color} | |
| <commit> | |
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)