Uploaded image for project: 'Groovy'
  1. Groovy
  2. GROOVY-3512

Thread safety issue related to addBasicPersistenceMethods? explodes with an ArrayIndexOutOfBoundsException

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Blocker
    • Resolution: Not A Problem
    • None
    • 1.6.4, 1.7-beta-1
    • None
    • None
    • Sun JDK 1.6
      Windows XP

    Description

      When issuing a large amount of .save() operations in a concurrent environment we are experiencing an ArrayIndexOutOfBoundsException

      To run the test case attached you need to use H2 DB although we also have the issue with MS SQL 2005
      You might need to run the test a couple of times to experience the issue

      Stack Trace below

      java.lang.ArrayIndexOutOfBoundsException
      at org.codehaus.groovy.reflection.ParameterTypes.fitToVargs(ParameterTypes.java:193)
      at org.codehaus.groovy.reflection.ParameterTypes.correctArguments(ParameterTypes.java:159)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.createCachedMethodSite(PojoMetaMethodSite.java:153)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.createPojoMetaMethodSite(PojoMetaMethodSite.java:147)
      at groovy.lang.MetaClassImpl.createPojoCallSite(MetaClassImpl.java:2965)
      at groovy.lang.ExpandoMetaClass.createPojoCallSite(ExpandoMetaClass.java:1095)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.createPojoSite(CallSiteArray.java:113)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:146)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:54)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:132)
      at org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport$_addBasicPersistenceMethods_closure62.doCall(HibernatePluginSupport.groovy:591)
      at sun.reflect.GeneratedMethodAccessor335.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:81)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:307)
      at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.call(PogoMetaMethodSite.java:63)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
      at SubscriptionEventService$_confirm_closure2.doCall(SubscriptionEventService.groovy:82)
      at sun.reflect.GeneratedMethodAccessor534.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:910)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at groovy.lang.Closure.call(Closure.java:292)
      at groovy.lang.Closure$call$0.call(Unknown Source)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at groovy.lang.Closure$call$0.call(Unknown Source)
      at org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport$_addTransactionalMethods_closure14_closure80.doCall(HibernatePluginSupport.groovy:342)
      at sun.reflect.GeneratedMethodAccessor374.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:910)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:48)
      at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:77)
      at $Proxy25.doInTransaction(Unknown Source)
      at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
      at sun.reflect.GeneratedMethodAccessor373.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:188)
      at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at org.codehaus.groovy.grails.plugins.orm.hibernate.HibernatePluginSupport$_addTransactionalMethods_closure14.doCall(HibernatePluginSupport.groovy:341)
      at sun.reflect.GeneratedMethodAccessor372.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:910)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:892)
      at groovy.lang.Closure.call(Closure.java:279)
      at org.codehaus.groovy.runtime.metaclass.ClosureStaticMetaMethod.invoke(ClosureStaticMetaMethod.java:55)
      at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite$StaticMetaMethodSiteNoUnwrapNoCoerce.invoke(StaticMetaMethodSite.java:148)
      at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:88)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
      at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:93)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
      at SubscriptionEventService.confirm(SubscriptionEventService.groovy:76)
      at SubscriptionEventService$confirm.call(Unknown Source)
      at ZapiSimulationService.onMessage(ZapiSimulationService.groovy:44)
      at ZapiSimulationService$$FastClassByCGLIB$$ee69ff0e.invoke(<generated>)
      at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
      at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
      at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
      at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
      at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
      at ZapiSimulationService$$EnhancerByCGLIB$$2247bd8c.onMessage(<generated>)
      at sun.reflect.GeneratedMethodAccessor453.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:276)
      at org.springframework.jms.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:466)
      at org.codehaus.grails.jms.ClosureMessageListenerAdapter.super$2$invokeListenerMethod(ClosureMessageListenerAdapter.groovy)
      at sun.reflect.GeneratedMethodAccessor452.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:86)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:234)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1061)
      at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:910)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:127)
      at org.codehaus.grails.jms.ClosureMessageListenerAdapter.invokeListenerMethod(ClosureMessageListenerAdapter.groovy:21)
      at org.springframework.jms.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:359)
      at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:518)
      at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:479)
      at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:451)
      at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:323)
      at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261)
      at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:982)
      at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
      at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
      at java.lang.Thread.run(Thread.java:619)

      Attachments

        1. testcase-ts-bug-report-27042009.zip
          19 kB
          Serge Sozonoff

        Activity

          People

            blackdrag Jochen Theodorou
            ssozonoff Serge Sozonoff
            Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: