shashank created CAMEL-26868:
--------------------------------

             Summary: camel-sql - JdbcCachedMessageIdRepository: a key removed 
in a transaction of the caller can stay in the cache after its row is deleted
                 Key: CAMEL-26868
                 URL: https://issues.apache.org/jira/browse/CAMEL-26868
             Project: Camel
          Issue Type: Bug
          Components: camel-sql
            Reporter: shashank
            Assignee: shashank


{{JdbcCachedMessageIdRepository.remove}} (and {{clear}}) removes the key from 
its cache before and after the delete. When the repository is used in a 
transaction of the caller on the same DataSource (or JTA), the delete joins 
that transaction and is only committed later: for example a direct {{remove}} 
or {{clear}} in a transaction, or the idempotent consumer removing the key of a 
failure that a dead letter channel handled inside an enclosing transaction that 
commits. Until then, another thread still sees the row: its {{add}} of the key 
finds the row, returns false (a duplicate) and caches the key. When the 
caller's transaction commits, the row is gone but the key stays in the cache, 
so every later {{add}} of that key is rejected as a duplicate without a row, 
until the cache is reloaded (a restart).

Expected: once the remove is committed, the key is not in the cache.

Possible fix: also remove the key from the cache in the {{afterCommit}} of the 
caller's transaction (a transaction synchronization, as {{add}} uses since 
CAMEL-26770 to cache a key only after its row is committed).

Found in the review of CAMEL-26770 (apache/camel#29533), from reading the code; 
confirmed with a test (H2: remove in an open transaction on one thread, add on 
another, then commit).

_Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to