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

Claus Ibsen resolved CAMEL-25850.
---------------------------------
    Fix Version/s: 4.24.0
       Resolution: Fixed

> camel-jetty - with minThreads or maxThreads, stopping the routes of one port 
> stops the thread pool of the Jetty server of another port, which then accepts 
> no connection
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25850
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25850
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-jetty
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> With {{minThreads}} or {{maxThreads}} set on the Jetty component, 
> {{JettyHttpComponent.createServer}} creates a new {{QueuedThreadPool}} for 
> every Jetty server (one per host and port), but keeps it in a single 
> component field, {{defaultQueuedThreadPool}}, which is overwritten by the 
> next server (main 20cdb309f7d0, lines 1335-1375). When the last consumer of a 
> server disconnects ({{disconnect}}, lines 546-567, added by CAMEL-14137), the 
> server is stopped and then the pool in that field is stopped: that is the 
> pool of the last server created, not of the server being stopped. The server 
> does not stop its pool itself, as the pool was started before the server.
> So with routes on two ports, for example 
> {{from("jetty:http://0.0.0.0:8080/a";)}} and 
> {{from("jetty:http://0.0.0.0:8081/b";)}} with {{maxThreads=50}} on the 
> component, stopping the route on port 8080 (a route stop, a route removal, a 
> reload, the route controller) stops the thread pool of the server on port 
> 8081. That server then no longer accepts connections (clients get connection 
> refused or a timeout) while its route stays Started and nothing is logged. 
> The pool of the 8080 server is never stopped: its threads stay for as long as 
> the JVM runs, and every stop and start of such a route leaks one more pool.
> *Fix*: the pool created for a server is kept with that server in its 
> {{ConnectorRef}} and stopped when that server is stopped (in {{disconnect}} 
> and in the component's {{doStop}}). The component field is gone; a 
> user-supplied {{threadPool}} is still not stopped by Camel. No option changes.
> *Tests*: new {{JettyThreadPoolTwoServersTest}} (component with 
> {{minThreads=4}}, {{maxThreads=10}}, routes on two ports). 
> {{stoppingOneServerKeepsTheOtherServing}}: after stopping route a, route b 
> must still answer; on main the request fails with 
> {{java.net.ConnectException}}. {{stoppingBothServersStopsBothThreadPools}}: 
> after stopping both routes, no thread of the thread pools of the two servers 
> may be left (counted by pool name, as the module's test classes run in 
> parallel); on main {{expected: <0> but was: <4>}} (the pool that was never 
> stopped). Both pass with the fix. camel-jetty unit tests with the fix: 410 
> run, 23 skipped, 1 error in {{JettyXsltHttpTemplateTest}}, which fails the 
> same way on main in this environment (it loads a stylesheet over http from 
> 0.0.0.0).
> *How it was found*: variant analysis of CAMEL-25846 (a resource that belongs 
> to one owner kept where another owner finds and stops it), then the JUnit 
> tests.
> *Affected*: main, camel-4.23.x, camel-4.22.x and camel-4.18.x (the same field 
> and {{disconnect}}; read, not run).
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to