Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-9917

JCachingProvider should not use weak ClassLoader references

    XMLWordPrintable

Details

    • Bug
    • Resolution: Obsolete
    • Major
    • None
    • 10.0.0.Alpha3, 9.4.6.Final
    • JCache
    • None

    Description

      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:

      [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
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            dberinde@redhat.com Dan Berindei (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: