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

Groovy category throwing MissingMethodException and MissingPropertyException when using multiple threads

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.3.11, 2.4.4
    • Fix Version/s: 2.4.12
    • Component/s: None
    • Labels:
      None
    • Environment:
      I have been able to reproduce this issue on a Cent O/S version 6.4 with Java 64 Bit JDK 1.8 and groovy 2.4.4.
    • Flags:
      Important

      Description

      When using groovy use block, we randomly get groovy.lang.MissingPropertyException when trying to access a property off a category. (Attached is an example)

      index 76
      Exception in thread "Thread-77" groovy.lang.MissingPropertyException: No such property: millisecond for class: java.lang.Integer
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:51)
      at org.codehaus.groovy.runtime.callsite.PojoMetaClassGetPropertySite.callGetProperty(PojoMetaClassGetPropertySite.java:43)
      at TimeCategoryTest$__spock_initializeFields_closure1$_closure4$_closure5.doCall(TimeCategoryTest.groovy:23)
      at TimeCategoryTest$__spock_initializeFields_closure1$_closure4$_closure5.doCall(TimeCategoryTest.groovy)
      at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
      at groovy.lang.Closure.call(Closure.java:423)
      at groovy.lang.Closure.call(Closure.java:417)
      at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:109)
      at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.access$400(GroovyCategorySupport.java:65)
      at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:249)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.use(DefaultGroovyMethods.java:403)

      or groovy.lang.MissingMethodException when trying to access a method from a category.

      index 82
      Exception in thread "Thread-207" groovy.lang.MissingMethodException: No signature of method: java.lang.String.test() is applicable for argument types: (java.lang.String) values: [ bar]
      Possible solutions: next(), toSet(), getAt(java.lang.String), wait(). trim(), toList()
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:56)
      at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
      at CategoryTest$__spock_initializeFields_closure1$_closure5.doCall(CategoryTest.groovy:24)
      at CategoryTest$__spock_initializeFields_closure1$_closure5.doCall(CategoryTest.groovy)
      at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
      at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)
      at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:292)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1016)
      at groovy.lang.Closure.call(Closure.java:423)
      at groovy.lang.Closure.call(Closure.java:417)
      at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:109)
      at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.access$400(GroovyCategorySupport.java:65)
      at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:249)
      at org.codehaus.groovy.runtime.DefaultGroovyMethods.use(DefaultGroovyMethods.java:403)

      On the server, either one of these exceptions to appear every few days or weeks.

      I found a similar issue GROOVY-2105 which contains a test that reproduces this problem on Linux. Looking back the fix that was implemented for this ticket was to add synchronized to 3 methods. These changes were late removed in a refactor of GroovyCategorySupport.

      I have attached 3 test cases that reproduce the threading issue.

      NOTE: problem does not happen 100% of the time as it is a threading and timing issue, so you may have to play with the number of threads to generate the exception. What I have attached generates the exception on my linux box most of the time.

        Attachments

        1. TimeCategoryTest.groovy
          1 kB
          James Oswald
        2. Test.groovy
          0.3 kB
          James Oswald
        3. locking.png
          117 kB
          Jochen Kemnade
        4. exceptionForTimeCategoryTest.txt
          2 kB
          James Oswald
        5. exceptionForCategoryTest.txt
          2 kB
          James Oswald
        6. CategoryTest.groovy
          1 kB
          James Oswald
        7. 0001-GROOVY-7535-fix-race-condition-between-the-modificat.patch
          2 kB
          Jochen Kemnade

          Issue Links

            Activity

              People

              • Assignee:
                jwagenleitner John Wagenleitner
                Reporter:
                joswald James Oswald
              • Votes:
                0 Vote for this issue
                Watchers:
                7 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: