shashank created CAMEL-26049:
--------------------------------
Summary: camel-coap - CamelContext.stop() leaves the non-daemon
CoapServer threads running, and every producer start leaks a bound client
endpoint
Key: CAMEL-26049
URL: https://issues.apache.org/jira/browse/CAMEL-26049
Project: Camel
Issue Type: Bug
Components: camel-coap
Reporter: shashank
Assignee: shashank
Two leaks, both because Californium 3.14 only releases threads and sockets on
{{destroy()}} (main 0c1e85c8631c):
# {{CoAPComponent.doStop}} calls {{stop()}} on its {{CoapServer}}s, never
{{destroy()}}, and keeps the {{servers}} map. {{CoapServer.stop()}} keeps the
server executors ({{CoapServer(main)#N}}, {{CoapServer(secondary)#N}}, not
daemon threads). After a CamelContext with a coap consumer is stopped the JVM
does not exit on its own (Camel Main, standalone, containers then need a
SIGKILL), and every CamelContext in the same JVM adds 3 threads.
# {{CoAPProducer}} creates its client with {{CoAPEndpoint.createCoapClient}},
which builds the client's own {{CoapEndpoint}} (bound UDP socket with receiver
and sender threads, or DTLS/TCP connector threads). {{doStop}} calls
{{client.shutdown()}}, which only shuts the client's executors down (javap) and
does not destroy that endpoint. Each route restart, and each producer evicted
from a {{toD}} or ProducerTemplate cache, leaks a bound socket and 2 or more
threads.
*Fix*: {{CoAPComponent.doStop}} destroys the servers and clears the map
(consumers get the server from {{getServer}} on each start, so a restarted
context creates them again); {{CoAPProducer.doStop}} destroys the endpoint of
the client it created. A client set on the component or endpoint is left alone.
*Tests*: new {{CoAPComponentStopDestroysServersTest}} (2) and
{{CoAPProducerStopDestroysEndpointTest}} (1).
* {{stoppingTheCamelContextReleasesTheServerThreads}} fails on main:
{{non-daemon CoapServer threads still alive after CamelContext.stop() ==>
expected: <[]> but was: <[CoapServer(main)#1, CoapServer(secondary)#1,
CoapServer(secondary)#2]>}};
* {{routeRestartsReleaseTheEndpointsOfTheStoppedProducers}} fails on main:
{{UDP receiver threads of stopped CoAP producers still alive after 5 restarts
==> expected: <0> but was: <10>}};
* {{aCamelContextStartedAgainServesAgain}} is a control that passes on main and
with the fix.
Unit tests of camel-coap with the fix: 85 run, 0 failures.
*Not changed*: the observe consumer ({{CoAPObserver}}) keeps its client
endpoint too, but there the endpoint must stay until the cancel request of
CAMEL-25742 has gone out; {{CoAPConsumer}} has no {{doStop}} (a stopped route
stays registered on its resource). Follow-ups.
*How it was found*: a per-class thread/fd leak check over module test suites
and a route restart probe (r75).
*Affected*: main, camel-4.23.x, camel-4.22.x, camel-4.18.x and camel-4.14.x
(same code). Read, not run.
_Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)