EHC ❯ heuristic errors after restart prevent registration of a cache into BTM
Bug
Status:Closed
2 Major
Resolution:Fixed
ehcache-core
lorban
Reporter:lorban
April 20, 2010
0
Watchers:0
July 27, 2012
May 31, 2010
Description
During startup, BTM tries to recover every single XA cache. If some heuristic error gets reported BTM refuses to register the cache, thus completely preventing it to be used at all:
2010-04-20 11:14:35,096 ERROR [DefaultTransactionManagerLookup] unable to register resource of cache org.springframework.samples.petclinic.PetType@petClinic.cacheManager with BTM
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup.registerResourceWithBitronix(DefaultTransactionManagerLookup.java:130)
at net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup.register(DefaultTransactionManagerLookup.java:90)
at net.sf.ehcache.Cache.initialise(Cache.java:995)
at net.sf.ehcache.CacheManager.addCacheNoCheck(CacheManager.java:909)
at net.sf.ehcache.CacheManager.addConfiguredCaches(CacheManager.java:606)
at net.sf.ehcache.CacheManager.init(CacheManager.java:338)
at net.sf.ehcache.CacheManager.(CacheManager.java:208)
at net.sf.ehcache.hibernate.EhCacheRegionFactory.start(EhCacheRegionFactory.java:66)
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:221)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:227)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:273)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1367)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1333)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:471)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:308)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:297)
at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:224)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:503)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:473)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:598)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:569)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessAfterInstantiation(PersistenceAnnotationBeanPostProcessor.java:308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:957)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:427)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:502)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:180)
at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation(CommonAnnotationBeanPostProcessor.java:290)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:957)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
at org.terracotta.petclinic.perftest.util.SpringFactory.getApplicationContext(SpringFactory.java:65)
at org.terracotta.petclinic.perftest.util.SpringFactory.getApplicationContext(SpringFactory.java:38)
at org.terracotta.petclinic.perftest.util.SpringFactory.getControllerBean(SpringFactory.java:77)
at org.terracotta.petclinic.perftest.type.BaseTest.setup(BaseTest.java:42)
at org.terracotta.petclinic.perftest.type.ReadOnlyTest.setup(ReadOnlyTest.java:14)
at org.terracotta.petclinic.perftest.AbstractPerfTest.doSetupTest(AbstractPerfTest.java:188)
at org.terracotta.petclinic.perftest.AbstractPerfTest.startTest(AbstractPerfTest.java:111)
at org.terracotta.petclinic.perftest.PetClinicPerfTest.main(PetClinicPerfTest.java:267)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:290)
at java.lang.Thread.run(Thread.java:637)
Caused by: bitronix.tm.internal.BitronixRuntimeException: error recovering net.sf.ehcache.transaction.manager.btm.EhCacheXAResourceProducer@424ee67e
at net.sf.ehcache.transaction.manager.btm.EhCacheXAResourceProducer.init(EhCacheXAResourceProducer.java:196)
at net.sf.ehcache.transaction.manager.btm.EhCacheXAResourceProducer.registerXAResource(EhCacheXAResourceProducer.java:75)
... 82 more
Caused by: bitronix.tm.recovery.RecoveryException: error recovering resource 'org.springframework.samples.petclinic.PetType@petClinic.cacheManager' due to an imcompatible heuristic decision
at bitronix.tm.recovery.IncrementalRecoverer.recover(IncrementalRecoverer.java:81)
at bitronix.tm.resource.ResourceRegistrar.register(ResourceRegistrar.java:59)
at net.sf.ehcache.transaction.manager.btm.EhCacheXAResourceProducer.init(EhCacheXAResourceProducer.java:194)
... 83 more
Ideally this should be handled by the EhCacheXAResourceProducer and it should so something about the problem: either report the problematic keys, or invalidate them or completely clean up the cache.
Comments
Alexander Snaps2010-04-21
Maybe we should add some system property the use would set when restarting his failed app (that has heuristics), to clear these entries (or the entire cache)… We need to figure how the tooling around handling these cases need to look like… for PM?
Ludovic Orban2010-05-31
This actually is a limitation of BTM, no other TM is affected. Let’s have that fixed at the right place.
Maybe we should add some system property the use would set when restarting his failed app (that has heuristics), to clear these entries (or the entire cache)… We need to figure how the tooling around handling these cases need to look like… for PM?