[ 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)