[infinispan-issues] [JBoss JIRA] (ISPN-9917) JCachingProvider should not use weak ClassLoader references

Dan Berindei (Jira) issues at jboss.org
Fri Feb 1 04:55:01 EST 2019


    [ https://issues.jboss.org/browse/ISPN-9917?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13690030#comment-13690030 ] 

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}



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the infinispan-issues mailing list