[
https://issues.apache.org/jira/browse/KNOX-3156?focusedWorklogId=971972&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-971972
]
ASF GitHub Bot logged work on KNOX-3156:
----------------------------------------
Author: ASF GitHub Bot
Created on: 05/Jun/25 14:35
Start Date: 05/Jun/25 14:35
Worklog Time Spent: 10m
Work Description: hanicz commented on code in PR #1053:
URL: https://github.com/apache/knox/pull/1053#discussion_r2129015664
##########
gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/shirorealm/KnoxCacheManager.java:
##########
@@ -99,16 +108,54 @@ private synchronized org.ehcache.Cache<Object, Object>
createCache(String name)
private org.ehcache.CacheManager ensureCacheManager() throws
MalformedURLException {
if (manager == null) {
- manager = CacheManagerBuilder.newCacheManager(getConfiguration());
- manager.init();
+ XmlConfiguration xmlConfiguration = getConfiguration();
+ manager = CacheManagerBuilder.newCacheManager(xmlConfiguration);
+ try {
+ manager.init();
+ } catch (StateTransitionException e) {
+ LOG.errorCreatingCacheManager(e.getMessage());
+ this.resolveLockConflict(xmlConfiguration);
+ if(manager.getStatus() != Status.UNINITIALIZED) {
+ manager.close();
+ }
+ manager = CacheManagerBuilder.newCacheManager(xmlConfiguration);
+ manager.init();
+ }
cacheManagerImplicitlyCreated = true;
}
return manager;
}
- private URL getResource() {
+ /**
+ * Resolves lock conflicts by changing the persistence directory of the
cache manager.
+ * This is necessary when multiple instances of the cache manager are
created with the same configuration file,
+ * which can lead to lock conflicts.
+ *
+ * @param xmlConfiguration the XML configuration of the cache manager
+ */
+ private void resolveLockConflict(XmlConfiguration xmlConfiguration) {
+ Optional<ServiceCreationConfiguration<?>> serviceConfig =
xmlConfiguration.getServiceCreationConfigurations().stream()
+ .filter(service -> service instanceof
CacheManagerPersistenceConfiguration).findFirst();
+
+ if (serviceConfig.isPresent()) {
+ CacheManagerPersistenceConfiguration cachePersistenceConfig =
(CacheManagerPersistenceConfiguration) serviceConfig.get();
+ String path = cachePersistenceConfig.getRootDirectory().getPath();
+
xmlConfiguration.getServiceCreationConfigurations().remove(cachePersistenceConfig);
+ String newFolder = DEFAULT_FOLDER_NAME +
UUID.randomUUID().toString().substring(0, 4);
+ String newRootDirectory =
Paths.get(path).getParent().resolve(newFolder).toAbsolutePath().toString();
+ xmlConfiguration.getServiceCreationConfigurations()
Review Comment:
No, the class only holds one attribute the rootDirectory. I create an
instance of it the same way as the Ehcache code does.
Issue Time Tracking
-------------------
Worklog Id: (was: 971972)
Time Spent: 0.5h (was: 20m)
> Improve Ehcache 3.x
> -------------------
>
> Key: KNOX-3156
> URL: https://issues.apache.org/jira/browse/KNOX-3156
> Project: Apache Knox
> Issue Type: Improvement
> Affects Versions: 2.1.0
> Reporter: Tamás Hanicz
> Assignee: Tamás Hanicz
> Priority: Major
> Time Spent: 0.5h
> Remaining Estimate: 0h
>
> * Add new ability to load Ehcache config file from a file that's not on the
> classpath
> * Knox should resolve lock dir exceptions on its own in case two topologies
> use the same configuration file.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)