[ 
https://issues.apache.org/jira/browse/CAMEL-26705?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on CAMEL-26705 started by shashank.
----------------------------------------
> camel-sql - JdbcOrphanLockAwareIdempotentRepository and 
> JdbcCachedMessageIdRepository are not restart safe
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26705
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26705
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-sql
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>
> A stopped service runs {{doInit()}} again when it is started 
> ({{BaseService.init()}}: "allow to initialize again if stopped or failed"). 
> This happens to the idempotent repository when it is stopped and started, 
> when its route is removed and added again (route reload, JMX), or when the 
> CamelContext is restarted. 
> {{JdbcOrphanLockAwareIdempotentRepository.doInit()}} is not safe to run twice:
> * It rewrites its own field: {{updateTimestampQuery = 
> updateTimestampQuery.replaceFirst(DEFAULT_TABLENAME, getTableName())}}. With 
> a table name that contains the default name, such as 
> {{CAMEL_MESSAGEPROCESSED_ORDERS}} or {{MYSCHEMA.CAMEL_MESSAGEPROCESSED}} (the 
> case of CAMEL-20010), every restart adds the suffix again: {{UPDATE 
> CAMEL_MESSAGEPROCESSED_ORDERS_ORDERS ...}}. The keep-alive then fails on 
> every run, which is only logged at ERROR, so the leases of the node are no 
> longer refreshed and another node takes over keys it is still processing 
> after {{lockMaxAgeMillis}}. Taking over an orphan lock in {{insert}} uses the 
> same statement and fails with an SQL error.
> * It creates and schedules the keep-alive executor, which is shut down only 
> in {{doShutdown()}}. Every stop/start leaves the previous executor running, 
> and a stopped repository keeps refreshing its leases.
> {{JdbcCachedMessageIdRepository.doInit()}} rewrites its {{queryAllString}} 
> the same way; there the second start fails, because reloading the cache runs 
> the broken query.
> CAMEL-20010 fixed the first point for the statements of the parent 
> {{JdbcMessageIdRepository}} by deriving them from {{DEFAULT_*}} constants; 
> {{updateTimestampQuery}} and {{queryAllString}} were not covered.
> Expected: after any number of stop/start cycles the repositories use the same 
> SQL, and the orphan-lock repository runs one keep-alive task, and none while 
> it is stopped.
> Suggested fix: derive {{updateTimestampQuery}} and {{queryAllString}} from 
> default constants in {{doInit()}} as the parent class does, and create the 
> keep-alive executor in {{doStart()}} and shut it down in {{doStop()}}.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to