shashank created CAMEL-25702:
--------------------------------

             Summary: 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


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)

Reply via email to