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

Claus Ibsen reassigned CAMEL-25289:
-----------------------------------

    Assignee: shashank

> camel-iggy - after 8 failed sends or polls the producer and the consumer wait 
> forever for a pooled client; stopped producers and consumers leak their 
> connections; autoCommit=false fails without startingOffset
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25289
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25289
>             Project: Camel
>          Issue Type: Bug
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.23.0
>
>
> h3. 1. A failed request keeps its pooled client for good
> {{IggyProducer.process}} and {{IggyFetchRecords.pollMessages}} borrow an 
> {{IggyBaseClient}} from their {{IggyClientConnectionPool}} and give it back 
> only after a successful request:
> {code:java}
> IggyBaseClient client = iggyClientConnectionPool.borrowObject();
> ...
> client.messages().sendMessages(...);   // throws: the client is never returned
> iggyClientConnectionPool.returnClient(client);
> {code}
> Each failed send or poll (server restart, network error, missing topic) keeps 
> one client borrowed. The pool is a {{GenericObjectPool}} with the 
> commons-pool2 defaults: at most 8 clients and {{borrowObject}} waits forever 
> when they are all borrowed. So after 8 failures:
> * every later send waits forever in {{borrowObject}} (the calling route 
> threads hang), also after the Iggy server is back;
> * the consumer thread waits forever and the consumer consumes nothing more, 
> while the route stays started.
> Before that the consumer also polls again at once after a failure, in a tight 
> loop.
> h3. 2. Stopped producers and consumers leak their connections
> Neither the producer nor the consumer closes its pool when it stops, and 
> {{IggyClientFactory}} does not override {{destroyObject}}, so the (TCP or 
> HTTP, {{Closeable}}) clients are never closed. Every stop of a route or 
> producer leaks its connections and their threads.
> h3. 3. autoCommit=false without startingOffset
> {{startingOffset}} is documented with the default {{0}} 
> ({{@UriParam(defaultValue = "0")}}), but the field is {{null}}. With 
> {{autoCommit=false}} and no {{startingOffset}} the consumer polls with 
> {{PollingStrategy.offset(null)}} and fails with a {{NullPointerException}} at 
> {{offset.add(...)}} on every poll.
> h3. Reproduction
> {{IggyMockClientTest}} (new, no Iggy server: the client factory is replaced 
> with Mockito {{mockConstruction}}, the pool is the real 
> {{GenericObjectPool}}):
> * {{testFailedSendsDoNotExhaustThePool}}: 10 sends that fail. On main the 9th 
> send never returns: {{execution timed out after 30000 ms}}.
> * {{testProducerStopClosesTheClients}}: on main the client is never closed: 
> {{expected: <1> but was: <0>}}.
> * {{testFailedPollDiscardsTheClient}}: on main the client of the failed poll 
> is not closed before the next poll: {{expected: <1> but was: <0>}}.
> * {{testManualCommitStartsAtOffsetZeroByDefault}}: on main {{expected: 
> <PollingStrategy[kind=Offset, value=0]> but was: 
> <PollingStrategy[kind=Offset, value=null]>}}.
> h3. Proposed fix
> * The client of a failed request is invalidated (removed from the pool and 
> closed, it may be broken); a successful one is returned. The initialization 
> at start returns its client in a {{finally}}.
> * The consumer waits one second after a failed poll (the same delay as when 
> it is suspended).
> * {{IggyClientFactory.destroyObject}} closes the client; producers and 
> consumers close their pool when they stop.
> * {{startingOffset}} defaults to {{0}}, as documented.
> With the fix the 4 tests pass, and the module suite passes (13 unit tests; 
> the ITs need Docker). Note: an idle consumer still polls in a loop without 
> delay when the topic is empty (not changed here).
> Affected: 4.18.x and main (the component is not on 4.14.x).
> Duplicate check (2026-10-03): JIRA text "iggy" (25 issues: CAMEL-22222, 
> 22234, 22779, 23149, 23532, ...): none about the pool, the clients or the 
> starting offset. GitHub pull requests "iggy": only dependency upgrades and 
> the header filter change.
> _Filed with Claude Code on behalf of allthingssecurity._



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

Reply via email to