]
Dan Berindei commented on ISPN-9917:
------------------------------------
Removing the {{WeakClassLoader}} wrapper and the {{WeakHashMap}} in
{{AbstractJCachingProvider}} may also cause problems in the JCache TCK, as some (most?)
tests do not close the cache managers they create. We'll have to make sure any leaks
don't fail the test suite.
JCachingProvider should not use weak ClassLoader references
-----------------------------------------------------------
Key: ISPN-9917
URL:
https://issues.jboss.org/browse/ISPN-9917
Project: Infinispan
Issue Type: Bug
Components: JCache
Affects Versions: 10.0.0.Alpha3, 9.4.6.Final
Reporter: Dan Berindei
Assignee: Dan Berindei
Priority: Major
Fix For: 10.0.0.Beta1, 9.4.7.Final
The idea behind {{WeakClassLoader}} is that we want users to be able to use
{{Caching.getCachingProvider().getCacheManager()}} and not worry about closing the cache
manager: instead Infinispan will close the manager when there are no more references to
the provided {{ClassLoader}}.
In order to close the manager automatically, {{AbstractJCachingProvider}} maintains a
{{WeakHashMap}} of classloaders to managers, and if the cache manager had a strong
reference to the classloader, the {{WeakHashMap}} entry would never be collected. However,
this approach causes problems when a test creates a temporary {{ClassLoader}} instance and
calls {{Caching.getCachingProvider().getCacheManager(tempClassLoader)}}, because the JVM
is free to collect {{tempClassLoader}} immediately after it's used to create the
{{WeakClassLoader}}. This can cause failures in the jcache tck with the IBM JDK:
{noformat}
[OK: 268, KO: 3, SKIP: 0] Test failed:
CachingProviderTest.closeCacheManagerByURIAndClassLoader
org.infinispan.commons.CacheConfigurationException:
org.infinispan.commons.CacheException: Unable to construct a GlobalComponentRegistry!
at
org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:344)
at org.infinispan.jcache.embedded.JCacheManager.<init>(JCacheManager.java:70)
at
org.infinispan.jcache.embedded.JCachingProvider.createCacheManager(JCachingProvider.java:46)
at
org.infinispan.jcache.AbstractJCachingProvider.getCacheManager(AbstractJCachingProvider.java:67)
at
org.jsr107.tck.spi.CachingProviderTest.closeCacheManagerByURIAndClassLoader(CachingProviderTest.java:175)
Caused by: org.infinispan.commons.CacheException: Unable to construct a
GlobalComponentRegistry!
at
org.infinispan.factories.GlobalComponentRegistry.<init>(GlobalComponentRegistry.java:164)
at
org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:329)
... 39 more
Caused by: org.infinispan.commons.CacheConfigurationException: Unable to inject
dependencies for component class
org.infinispan.notifications.cachemanagerlistener.CacheManagerNotifierImpl, path
org.infinispan.notifications.cachemanagerlistener.CacheManagerNotifier (a
org.infinispan.notifications.cachemanagerlistener.CacheManagerNotifierImpl)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.performInjection(BasicComponentRegistryImpl.java:286)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.wireWrapper(BasicComponentRegistryImpl.java:176)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.registerComponent(BasicComponentRegistryImpl.java:360)
at
org.infinispan.factories.GlobalComponentRegistry.<init>(GlobalComponentRegistry.java:120)
... 40 more
Caused by: org.infinispan.commons.CacheException: ClassLoader reference was garbage
collected
at
org.infinispan.jcache.embedded.WeakClassLoader.requireClassLoader(WeakClassLoader.java:49)
at org.infinispan.jcache.embedded.WeakClassLoader.findClass(WeakClassLoader.java:30)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:925)
at java.lang.ClassLoader.loadClass(ClassLoader.java:870)
at java.lang.ClassLoader.loadClass(ClassLoader.java:853)
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:402)
at org.infinispan.commons.util.Util.loadClassStrict(Util.java:170)
at org.infinispan.commons.util.Util.loadClass(Util.java:122)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.tryAutoInstantiation(BasicComponentRegistryImpl.java:249)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.findFactory(BasicComponentRegistryImpl.java:202)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.getComponent0(BasicComponentRegistryImpl.java:94)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.getDependency(BasicComponentRegistryImpl.java:327)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.setInjectionField(BasicComponentRegistryImpl.java:315)
at
org.infinispan.factories.impl.BasicComponentRegistryImpl.performInjection(BasicComponentRegistryImpl.java:276)
... 43 more
{noformat}