shashank created CAMEL-25811:
--------------------------------
Summary: camel-keycloak - the consumer silently skips the older
events when more than maxResults events happen between two polls
Key: CAMEL-25811
URL: https://issues.apache.org/jira/browse/CAMEL-25811
Project: Camel
Issue Type: Bug
Components: camel-keycloak
Reporter: shashank
Assignee: shashank
{{KeycloakConsumer}} (main 62c9a3ebe409) asks Keycloak for
{{first}}/{{maxResults}} events in each poll ({{pollEvents}} line 122,
{{pollAdminEvents}} line 217; {{maxResults}} default 100, {{first}} default 0)
and then makes the newest event its checkpoint ({{lastEventTime =
highestEventTime}}, lines 178 and 277). Events older than the checkpoint are
skipped in every later poll ({{eventTime < lastEventTime}}, lines 140 and 237).
Keycloak returns the events most recent first (the existing
{{KeycloakConsumerLatestEventsTest}} models it the same way). So when more than
{{maxResults}} user events (or admin events) happen between two polls, a poll
gets the newest {{maxResults}} of them and moves the checkpoint to the newest
one; the older new events are not in the answer, and the next poll, which again
asks for the newest {{maxResults}}, skips anything older than the checkpoint.
They are never routed and nothing is logged. This happens in a busy realm (more
than 100 logins within one poll delay), with a smaller {{maxResults}} as in the
examples of the documentation (50), and at the first poll after Keycloak was
unreachable or the polls failed for a while: all but the newest {{maxResults}}
events of that time are lost. The documentation promises fingerprint-based
deduplication so that events are not processed twice; it says nothing about
{{maxResults}} dropping events.
*Fix*: once a checkpoint is set, a poll also reads the following pages
({{first}} + {{maxResults}}, ...), until a page reaches an event older than the
checkpoint or is shorter than {{maxResults}}. When new events arrive while the
pages are read, the next page repeats events of the previous one; the existing
fingerprints skip them. The fingerprint cache is now limited after the poll
(where only the fingerprints at the checkpoint are left) instead of in the
middle of the events of a poll, so a poll of more than 1000 events does not
route events twice. The first poll is unchanged (the latest {{maxResults}}
events). Doc note in the consumer page (and its catalog copy), upgrade note in
the 4.24 guide (a poll can now route more than {{maxResults}} events).
*Tests*: new {{KeycloakConsumerMoreThanMaxResultsTest}} (mocked
{{RealmResource}} that honours {{first}} and {{max}} and returns the newest
events first, {{maxResults=2}}, polls called directly).
{{routesTheEventsBeyondMaxResults}} (one event, then three new ones) fails on
main: {{mock://events Received message count. Expected: <4> but was: <3>}};
{{routesTheAdminEventsBeyondMaxResults}} the same for admin events ({{Expected:
<4> but was: <3>}}); {{newEventsArrivingWhilePagingAreRoutedOnce}} (a new event
arrives while the pages are read) fails on main with {{Expected: <7> but was:
<4>}}. All three pass with the fix. camel-keycloak unit tests: 144 run, 0
failures (the ITs need Docker and were not run).
*How it was found*: variant analysis of CAMEL-25806 (camel-jira newIssues) and
CAMEL-25807 (camel-github2 commits), pattern "a polling consumer fetches the
newest M items and moves its cursor to the newest item it saw", then the JUnit
test above.
*Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same single
{{getEvents}} / {{getAdminEvents}} call with {{config.getMaxResults()}} and the
same checkpoint; read, not run). That Keycloak returns the events newest first
is the default order of its admin events endpoints; not run against a Keycloak
server.
_Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)