Benjamin BONNET created CAMEL-17613:
---------------------------------------
Summary: Race condition in AggregateProcessor with Jdbc Repository
Key: CAMEL-17613
URL: https://issues.apache.org/jira/browse/CAMEL-17613
Project: Camel
Issue Type: Bug
Components: camel-core, camel-sql
Affects Versions: 3.11.4
Reporter: Benjamin BONNET
Hi,
using aggregate with a JdbcAggregationRepository, we are encountering a race
condition that may leave a completed exchange in completed table even after
that completed exchange has been sent. Unfortunately, that leads to duplicates
since recovery task will eventually try and recover it.
Normally, when the exchange completes, it is deleted from repo exchange table
and inserted into repo completed exchange table. Then exchange is sent and
deleted from repo completed exchange table.
But, due to the fact those two actions are run by different threads (and in
different transactions) that order may vary.
Here is a normal sequence :
AggregateProcessor.doProcess
doAggregation
doAggregationComplete
onCompletion
JdbcAggregationRepository.remove : => INSERT ... INTO _completed
onSubmitCompletion
AggregateOnCompletion.onComplete (via executorService)
JdbcAggregationRepository.confirm : => DELETE FROM _completed
With the use of executorService, confirm is run by another thread and may
commit before remove commits. Eventually, when that occurs, one can check that
DELETE statement returns 0 (number of deleted rows) instead of 1.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)