You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Andrea Cosentino (Jira)" <ji...@apache.org> on 2026/09/15 10:29:00 UTC

[jira] [Resolved] (CAMEL-24729) camel-infinispan: a lifespan set without its time unit is silently ignored

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

Andrea Cosentino resolved CAMEL-24729.
--------------------------------------
    Resolution: Fixed

> camel-infinispan: a lifespan set without its time unit is silently ignored
> --------------------------------------------------------------------------
>
>                 Key: CAMEL-24729
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24729
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-infinispan
>            Reporter: Andrea Cosentino
>            Assignee: Andrea Cosentino
>            Priority: Minor
>             Fix For: 4.23.0
>
>
> h3. Summary
> Setting {{CamelInfinispanLifespanTime}} without {{CamelInfinispanTimeUnit}} (or {{CamelInfinispanMaxIdleTime}} without {{CamelInfinispanMaxIdleTimeUnit}}) makes the producer store the entry with *no expiry at all*, silently. The half-configured expiry is discarded without a warning.
> h3. Detail
> {{InfinispanProducer}} gates every expiring write on both headers being present:
> {code:java}
> protected boolean hasLifespan(Message message) {
>     return !InfinispanUtil.isHeaderEmpty(message, InfinispanConstants.LIFESPAN_TIME)
>             && !InfinispanUtil.isHeaderEmpty(message, InfinispanConstants.LIFESPAN_TIME_UNIT);
> }
> protected boolean hasMaxIdleTime(Message message) {
>     return !InfinispanUtil.isHeaderEmpty(message, InfinispanConstants.MAX_IDLE_TIME)
>             && !InfinispanUtil.isHeaderEmpty(message, InfinispanConstants.MAX_IDLE_TIME_UNIT);
> }
> {code}
> ({{isHeaderEmpty}} is {{ObjectHelper.isEmpty(message.getHeader(header))}}.)
> When either half is missing the condition is false and the producer falls through to the plain {{cache.put(key, value)}} overload. Eight operations are affected: PUT, PUTASYNC, PUTALL, PUTALLASYNC, PUTIFABSENT, PUTIFABSENTASYNC, REPLACE, REPLACEASYNC.
> There is no fallback: neither the lifespan value nor the time unit has an endpoint option, so the headers are the only way to express expiry. A route that sets the time and forgets the unit therefore writes an entry that never expires - and nothing in the log says so. For a cache used as a TTL store this is a data-retention problem that only shows up as unbounded growth much later.
> h3. Why this is worth changing
> This is the same defect class as CAMEL-24623: the component quietly discards something the route asked for, and the result is indistinguishable from not having asked.
> One difference from CAMEL-24623 is worth noting for whoever fixes it. There the lenient behaviour was deliberate and asserted by a test since CAMEL-9624 (2016), which is why the fix only added a warning. Here there is no such contract: {{hasLifespan}}/{{hasMaxIdleTime}} were extracted in CAMEL-9740 (2016) from pre-existing inline {{isInHeaderEmpty(x) && isInHeaderEmpty(x_UNIT)}} conditions, and no test covers the half-set case - every test in {{InfinispanProducerTestSupport}} sets both headers together. So failing the exchange is defensible here, although a WARN naming the missing header is the conservative option.
> Found by the same source audit of {{components/camel-infinispan}} that produced CAMEL-24622, CAMEL-24623 and CAMEL-24624; it was reported but left out of the batch at the time.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)