[
https://issues.apache.org/jira/browse/CAMEL-25725?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-25725.
---------------------------------
Resolution: Fixed
> camel-iggy - messageExpiry is documented in seconds but passed to Iggy
> unchanged, which reads it in microseconds, so a topic created by Camel
> expires its messages a million times too early
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25725
> URL: https://issues.apache.org/jira/browse/CAMEL-25725
> Project: Camel
> Issue Type: Bug
> Reporter: shashank
> Assignee: shashank
> Priority: Major
> Fix For: 4.24.0
>
>
> The {{messageExpiry}} option of camel-iggy is documented as "Message expiry
> time in seconds (0 means no expiry)". {{IggyEndpoint.initializeTopic}} (main
> e339a2e9019f) creates the topic, when it does not exist and
> {{autoCreateTopic=true}} (the default), with:
> {code:java}
> client.topics().createTopic(StreamId.of(stream),
> iggyConfiguration.getPartitionsCount(),
> iggyConfiguration.getCompressionAlgorithm(),
> BigInteger.valueOf(iggyConfiguration.getMessageExpiry()),
> BigInteger.valueOf(iggyConfiguration.getMaxTopicSize()),
> topic,
> options);
> {code}
> The Iggy Java client (0.9.0, {{TopicsTcpClient.createTopicOptions}}) sends
> the value unchanged as the u64 option {{message_expiry}}, and the server
> converts it with {{IggyExpiry::from(u64)}} = {{IggyDuration::from(value)}} =
> {{Duration::from_micros(value)}} (apache/iggy
> {{core/common/src/utils/expiry.rs}} and {{duration.rs}}; the topic option key
> is documented as "{{Uint64}} micros or a humantime string" in
> {{core/common/src/types/options/mod.rs}}; 0 is the server default, u64::MAX
> never expire). So:
> * {{messageExpiry=3600}} (one hour) creates a topic whose messages expire
> after 3.6 ms;
> * {{messageExpiry=604800}} (one week) gives 0.6 s.
> There is no error and no log: the server removes the expired data at its next
> clean-up, also data that a consumer has not read yet. Users who set the
> option get the opposite of what they asked for.
> Trigger: {{messageExpiry}} > 0 with {{autoCreateTopic=true}} (default), on
> the producer or the consumer endpoint that creates the topic.
> h3. Reproduction
> New test {{IggyTopicMessageExpiryTest}} (4 tests, mocked Iggy client, no
> server) captures the expiry passed to {{createTopic}}. Three fail on main:
> * {{messageExpiry=3600}}: expected 3600000000, main 3600;
> * {{messageExpiry=1}}: expected 1000000, main 1;
> * {{messageExpiry=9223372036854775807}}: expected u64::MAX (never expire),
> main 9223372036854775807 (about 2.5 hours in microseconds).
> {{messageExpiry=0}} stays 0 (passes on main, kept as a guard).
> A Z3 model of the chain (seconds, BigInteger, server u64 micros with the 0
> and u64::MAX sentinels) finds the counterexample for every positive value on
> main and shows that the fix gives the documented expiry for all values in [0,
> Long.MAX_VALUE].
> h3. Proposed fix
> Convert the seconds to microseconds; a value above u64::MAX microseconds
> (about 584 000 years) becomes u64::MAX; 0 and negative values are passed as
> before. With the fix the camel-iggy unit tests pass: 17 run, 0 failures, 0
> errors, 0 skipped. Note for the 4.24 upgrade guide: topics created before
> keep their wrong expiry and must be changed on the Iggy server.
> Affected: main (tested); camel-4.23.x (Iggy client 0.9.0) has the same line;
> camel-4.22.x (client 0.8.0) and camel-4.18.x (client 0.6.0) pass the value
> the same way, the unit of those older clients was not checked (read, not run).
> Duplicate check (2026-10-17): JIRA text "iggy" (all camel-iggy issues:
> CAMEL-22222, 22234, 22779, 23149, 23532, 25289), none about the expiry.
> GitHub pull requests "iggy expiry": none.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)