EHC ❯ Nullpointer at net.sf.ehcache.CacheManager.getCache(CacheManager.java:894)
-
Bug
-
Status: Closed
-
2 Major
-
Resolution: Fixed
-
ehcache-core
-
-
cdennis
-
Reporter: bromberg
-
March 01, 2012
-
0
-
Watchers: 4
-
July 27, 2012
-
March 02, 2012
Description
Hi,
we get a NPE when creating a new cache.
I looks like the Bug is in this Method: String[] net.sf.ehcache.CacheManager.getCacheNames() throws IllegalStateException
— snip — String[] list = new String[ehcaches.size()]; return ehcaches.keySet().toArray(list); //when the Array.length > the keyset: there are null values in the result! We think that the ehcaches content changes between this lines! — snip —
full stacktrace:
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768) at net.sf.ehcache.CacheManager.getCache(CacheManager.java:894) at net.sf.ehcache.config.Configuration.getAllActiveCaches(Configuration.java:215) at net.sf.ehcache.config.CacheConfiguration.verifyPoolAllocationsBeforeAddingTo(CacheConfiguration.java:1682) at net.sf.ehcache.config.CacheConfiguration.setupFor(CacheConfiguration.java:1535) at net.sf.ehcache.CacheManager.initializeEhcache(CacheManager.java:1101) at net.sf.ehcache.CacheManager.addCacheNoCheck(CacheManager.java:1156) at net.sf.ehcache.CacheManager.addCache(CacheManager.java:1051)
Comments
Fiona OShea 2012-03-01
Yi Zhang 2012-03-01
Hi Dirk can you please give us a few more details about your use case? i.e. how you’re creating the caches and why you think that the ehcache content would change (e.g. are a lot of clients creating many caches at once?) Any sample code/reproducible case showing the null cache names would be very helpful in figuring out exactly what is happening here.
Dirk Bromberg 2012-03-02
Hi,
we had one cacheManager.
At runtime we create much caches and remove them. With many threads in a webapp!
-
creating the manager (singel) manager = net.sf.ehcache.CacheManager.create();
-
often creating – creating a cache – ehCache = new Cache(new CacheConfiguration(this.cacheName, cacheSize).overflowToDisk(false).eternal(true)); manager.addCache(ehCache);
-
remove manager.removeCache(cacheName);
-
everytime Using the cache…
Chris Dennis 2012-03-02
In general I would not recommend accessing a CacheManager from multiple threads without some form of external locking. Although some of the data structures used internally are safe against concurrent access/mutation the class as a whole is not tested in this way, and is not imho intended to be used in this way.
Yi Zhang 2012-03-02
added test case verifying the problem and the fix https://svn.terracotta.org/repo/internal/qa/testng/trunk/Ehcache/EhcacheBigMemoryUsabilityTest/src/test/java/com/terracotta/qa/tc/AddRemoveCacheClusteredPounderTest.java
Fiona OShea 2012-03-02
Is this “fixed” or “as designed”?
Chris Dennis 2012-03-05
It’s fixed - as in this precise NPE should not happen any more. I still stand by my statement however that the CacheManager isn’t really intended for multi-threaded use like this.
Any thoughts on this?