[ https://issues.apache.org/jira/browse/KNOX-3156?focusedWorklogId=971969&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-971969 ]
ASF GitHub Bot logged work on KNOX-3156: ---------------------------------------- Author: ASF GitHub Bot Created on: 05/Jun/25 14:31 Start Date: 05/Jun/25 14:31 Worklog Time Spent: 10m Work Description: pzampino commented on code in PR #1053: URL: https://github.com/apache/knox/pull/1053#discussion_r2128994148 ########## 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) { Review Comment: This exception only results from a failure to acquire a lock on the persistence directory? If not, is there a way to determine that the exception was specifically for that reason? ########## gateway-provider-security-shiro/src/main/java/org/apache/knox/gateway/ShiroMessages.java: ########## @@ -44,4 +44,7 @@ public interface ShiroMessages { @Message( level = MessageLevel.WARN, text = "There was an error closing the CacheManager, reason: {0}" ) void errorClosingManagedCacheManager(@StackTrace(level=MessageLevel.WARN) Exception e); + + @Message( level = MessageLevel.WARN, text = "Unable to create Ehcache manager, changing persistence dir, reason: {0}" ) Review Comment: This message sounds like a failure. With the alternative persistence directory, the creation of the manager should succeed. Perhaps, something like "The default or configured ehcache persistence directory is unavailable; Choosing an alternative directory. reason: {0}" ? ########## 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: Is there anything else possibly configured in a CacheManagerPersistenceConfiguration in addition to the location? Could we be omitting other user-defined config by replacing the original with this simplified version? Issue Time Tracking ------------------- Worklog Id: (was: 971969) Time Spent: 20m (was: 10m) > 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: 20m > 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)