You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@knox.apache.org by "Larry McCay (JIRA)" <ji...@apache.org> on 2018/01/09 20:30:00 UTC

[jira] [Updated] (KNOX-1165) Knox - Another unnamed CacheManager already exists in the same VM.

     [ https://issues.apache.org/jira/browse/KNOX-1165?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Larry McCay updated KNOX-1165:
------------------------------
    Fix Version/s: 1.1.0

> Knox - Another unnamed CacheManager already exists in the same VM.
> ------------------------------------------------------------------
>
>                 Key: KNOX-1165
>                 URL: https://issues.apache.org/jira/browse/KNOX-1165
>             Project: Apache Knox
>          Issue Type: Bug
>          Components: KnoxSSO, Server
>    Affects Versions: 0.12.0
>         Environment: JDK 1.8
> CentOS-6 (64bit)
>            Reporter: Ernani Pereira de Mattos Junior
>            Priority: Critical
>              Labels: patch
>             Fix For: 1.1.0
>
>
> PROBLEM: 
> Issue is described on the note ""Error:Shiro environment initialization failed" when starting KNOX"; 
>  
> ERROR env.EnvironmentLoader (EnvironmentLoader.java:initEnvironment(146)) - Shiro environment initialization failed 
> org.apache.shiro.cache.CacheException: net.sf.ehcache.CacheException: Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 
> After implementing the solution of creating a new ehcache.xml and reference as <ehcache name="knox-mytopology1"> we still see the issue: 
> Caused by: net.sf.ehcache.CacheException: Another CacheManager with same name 'knox-tp' already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
> STEPS TO REPRODUCE: 
> When enabling the following parameters: 
> <param> 
> <name>main.cacheManager</name> 
> <value>org.apache.shiro.cache.ehcache.EhCacheManager</value> 
> </param> 
> <param> 
> <name>main.securityManager.cacheManager</name> 
> <value>$cacheManager</value> 
> </param> 
> <param> 
> <name>main.ldapRealm.authenticationCachingEnabled</name> 
> <value>true</value> 
> </param> 
> MORE INFO: 
> This KNOX-804 was open to solve this same issue but is not documented anywhere, but we can see the coding changes in GitHub.
> -> The issue seems to be a racing condition on the Shiro lib class, in which depending on the processing power of the server there are two threads within the same "if" statement;
> ref: https://github.com/apache/shiro/blob/master/support/ehcache/src/main/java/org/apache/shiro/cache/ehcache/EhCacheManager.java 
> 1. The Default constructor only builds the Object, and does not do much: 
> /** 
> * Default no argument constructor 
> */ 
> public EhCacheManager() { 
> } 
> 2. Accordingly with shiro documentation: 
> /** 
> * Initializes this instance. 
> * <p/> 
> * If a {@link #setCacheManager CacheManager} has been 
> * explicitly set (e.g. via Dependency Injection or programmatically) prior to calling this 
> * method, this method does nothing. 
> * <p/> 
> * However, if no {@code CacheManager} has been set, the default Ehcache singleton will be initialized, where 
> * Ehcache will look for an {@code ehcache.xml} file at the root of the classpath. If one is not found, 
> * Ehcache will use its own failsafe configuration file. 
> * <p/> 
> * Because Shiro cannot use the failsafe defaults (fail-safe expunges cached objects after 2 minutes, 
> * something not desirable for Shiro sessions), this class manages an internal default configuration for 
> * this case. 
> * 
> * @throws org.apache.shiro.cache.CacheException 
> * if there are any CacheExceptions thrown by EhCache. 
> * @see net.sf.ehcache.CacheManager#create 
> */ 
> public final void init() throws CacheException { 
> ensureCacheManager(); 
> } 
> private net.sf.ehcache.CacheManager ensureCacheManager() { 
> ***It fails in here. 
> } 
> 2.1 This is the head of the exception: 
> The source of the existing CacheManager is: InputStreamConfigurationSource [stream=java.io.BufferedInputStream@675ffd1d] 
> at org.apache.shiro.cache.ehcache.EhCacheManager.ensureCacheManager(EhCacheManager.java:224) 
> at org.apache.shiro.cache.ehcache.EhCacheManager.init(EhCacheManager.java:199) 
> at org.apache.shiro.util.LifecycleUtils.init(LifecycleUtils.java:45) 
> at org.apache.shiro.util.LifecycleUtils.init(LifecycleUtils.java:40) 
> 3. Starting from Knox-804, the KnoxCacheManager was introduced. 
> public class KnoxCacheManager extends EhCacheManager { 
> + 
> + public KnoxCacheManager() { 
> + setCacheManager(net.sf.ehcache.CacheManager.create()); 
> + } 
> +} 
> *Remember that Init() will do nothing if anything in case the setCacheManager is explicitly set. 
> ref: 
> https://github.com/apache/knox/commit/f9d8e07d768459240c8665f139cc140575dc5216



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)