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

Reply via email to