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

[jira] [Resolved] (CAMEL-25702) camel-ibm-secrets-manager - the secret refresh task stops for good, without a log line, at the first IBM Event Streams record it cannot read, so later secret rotations no longer reload the CamelContext

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

Claus Ibsen resolved CAMEL-25702.
---------------------------------
    Resolution: Fixed

Merged in https://github.com/apache/camel/pull/27987

> camel-ibm-secrets-manager - the secret refresh task stops for good, without a log line, at the first IBM Event Streams record it cannot read, so later secret rotations no longer reload the CamelContext
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25702
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25702
>             Project: Camel
>          Issue Type: Bug
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> With {{camel.vault.ibm.refreshEnabled=true}} Camel Main schedules {{IBMEventStreamReloadTriggerTask}} through {{PeriodTaskScheduler.scheduledTask}}: the task is submitted once and is expected to run for as long as Camel runs. Its {{run()}} polls the IBM Event Streams topic in a loop and reloads the CamelContext when a {{secret_rotated}} event names a watched secret.
> Nothing in the loop catches an exception (main d46d51c24550, {{IBMEventStreamReloadTriggerTask.run()}} lines 175-226). Any record the task cannot read ends it:
> * a record value that is not JSON ({{JsonProcessingException}} is wrapped in a {{RuntimeException}} and rethrown, line 188);
> * a JSON record with {{data}} but without {{data.event_type}} ({{NullPointerException}}, line 192);
> * a {{secret_rotated}} event without {{secrets}}, or a secret without {{secret_name}} / {{event_time}} ({{NullPointerException}}).
> The exception goes into the {{Future}} of the single-thread executor of the period task scheduler, which nobody reads: nothing is logged, the CamelContext keeps running, and from then on no secret rotation reloads it, so the routes keep the old (rotated, possibly revoked) credentials. Only a restart of the application brings the refresh back.
> Trigger: the refresh feature with its documented configuration and one record on the topic that does not have the shape the task expects (a test message, an event of another source or type routed to the same topic, a schema change).
> h3. Reproduction
> New {{IBMEventStreamReloadTriggerTaskTest}} (no IBM services): the task is started with a vault configuration (its {{doStart}} creates the Kafka consumer, which never connects), the consumer is replaced by a scripted {{KafkaConsumer}} subclass that returns one unreadable record and then a {{secret_rotated}} event of a watched secret; a {{DefaultContextReloadStrategy}} subclass counts the reloads. For each of the three unreadable records above, on main:
> {noformat}
> the rotation of a watched secret did not trigger a reload after the record [not json] ==> expected: <true> but was: <false>
> {noformat}
> h3. Proposed fix
> Each record is handled in its own {{try}}: a record that cannot be processed is skipped with a WARN (offset, topic, cause) and the loop goes on with the next one. A failure of {{KafkaConsumer.poll}} itself still ends the task, as before (the Kafka client retries connection problems inside {{poll}}; what it throws is an authentication, authorization or configuration error).
> camel-ibm-secrets-manager unit tests with the fix: 6 run, 0 failures, 0 skipped. Not run: the integration tests (IBM Cloud), a real Event Streams topic.
> How it was found: reading the vault refresh tasks that are scheduled once ({{scheduledTask}}: Kubernetes secrets, Kubernetes config maps, IBM) after the Kubernetes tasks were fixed for the same "ends for good" shape; the test confirmed it.
> Affected: main (tested). camel-4.23.x, camel-4.22.x and camel-4.18.x have the same loop (lines 180-192; read, not run).
> Duplicate check (2026-10-16): JIRA text "IBMEventStreamReloadTriggerTask" (CAMEL-24470, environment credentials), "ibm secrets manager" with "refresh" (CAMEL-21905, CAMEL-21918, CAMEL-21920, CAMEL-25553); GitHub pull requests "ibm secrets manager reload" (#25648, #27680, #25013; none about a failing record).
> _Filed with Claude Code on behalf of allthingssecurity._



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