[
https://issues.apache.org/jira/browse/CAMEL-26302?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-26302 started by shashank.
----------------------------------------
> camel-ehcache - removing the route that consumes from a cache closes the
> cache that the other routes still use, so every cache action fails with
> "State is UNINITIALIZED"
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26302
> URL: https://issues.apache.org/jira/browse/CAMEL-26302
> Project: Camel
> Issue Type: Bug
> Components: camel-ehcache
> Reporter: shashank
> Assignee: shashank
> Priority: Major
>
> When a route is removed, the core stops and shuts down the endpoint of its
> consumer ({{RouteService.doShutdown}}), also when other routes still use the
> same endpoint. For an ehcache endpoint this releases caches that other routes
> still hold (main c536c99caaaa):
> * {{EhcacheEndpoint.doStop}} (line 112) releases the endpoint's reference on
> its {{EhcacheManager}}. Without {{cacheManager}},
> {{cacheManagerConfiguration}} or {{configurationUri}} the endpoint has its
> own cache manager, so this is the last reference and it closes the
> {{CacheManager}} with all its caches.
> * {{EhcacheEndpoint.doShutdown}} (line 118) shuts the {{EhcacheManager}}
> down, which closes every cache it created without a configuration
> ({{EhcacheManager.doShutdown}}, line 66). With {{cacheManager}},
> {{cacheManagerConfiguration}} or {{configurationUri}} the manager is shared
> by all the endpoints that use it, so this closes the caches of other
> endpoints too.
> The producers of the other routes keep the {{Cache}} they got when they were
> created, so from then on every action (PUT, GET, ...) fails with
> {{IllegalStateException: State is UNINITIALIZED}}, also after the removed
> route is added again. Nothing else is logged.
> Examples:
> # {{from("ehcache:orders?configuration=#ordersConfig")}} (a route that reacts
> to cache events) and {{to("ehcache:orders?configuration=#ordersConfig")}} in
> other routes. As each endpoint uri without a cache manager option has its own
> cache manager (CAMEL-26237), a consumer and a producer of the same cache must
> use the same uri, so they share the endpoint. Removing the event route breaks
> the producer routes.
> # {{cacheManager=#myManager}} on all endpoints, with some caches configured
> in the manager and others created on demand: removing a route that consumes
> events of a configured cache closes the on-demand caches of the other
> endpoints.
> A route is removed by a route reload (dev mode, route watcher), a removed
> route template or Kamelet, JMX or the control bus.
> *Fix*: the producers and consumers hold a reference on the {{EhcacheManager}}
> while they are started (as the endpoints already do), so the cache manager is
> closed by the last of them; an endpoint shuts the {{EhcacheManager}} down
> only when nothing uses it any more, and the last reference also closes the
> caches created without a configuration (an endpoint shut down with a removed
> route is not shut down again). {{EhcacheManagerTest}} now counts the
> producers too (4 references for two endpoints with their producers instead of
> 2).
> *Tests*: new {{EhcacheRemoveRouteTest}}: {{removeEventRouteOfSameEndpoint}},
> {{removeEventRouteOfSharedCacheManager}}, {{removeEventRouteThenAddItAgain}}
> and {{removeEventRouteThenStopClosesCacheCreatedOnDemand}} fail on main (3
> runs, each with {{IllegalStateException: State is UNINITIALIZED}} on the
> first action after the removal) and pass with the fix. With the fix
> camel-ehcache has 77 tests, 0 failures.
> *How it was found*: a code sweep for endpoints whose {{doStop}} releases
> something that other routes on the same uri still use, after a random
> lifecycle-sequence harness found the same kind of defect in camel-disruptor
> (CAMEL-26286).
> *Affected*: main, camel-4.22.x, camel-4.18.x and camel-4.14.x (same
> {{doStop}}/{{doShutdown}}; read, not run).
> *Related*: CAMEL-26237 (each endpoint uri without a cache manager option
> builds its own cache manager; a consumer on a cache without configuration
> gets no events). Sharing the default cache manager per component, as proposed
> there, would make the second case above the default one.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)