groovy
  1. groovy
  2. GROOVY-2105

Groovy category support is broken in multi-threaded environment

    Details

    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.0, 1.1-beta-1, 1.1-beta-2
    • Fix Version/s: 1.1-beta-3
    • Component/s: None
    • Labels:
      None
    • Environment:
      Windows XP, jdk 1.5.0_11
    • Number of attachments :
      1

      Description

      We're using Groovy to write controllers in Spring MVC environment. But we often see a "MissingPropertyException" for ModelAndView.viewName property. We investigated it, and found, that org.codehaus.groovy.runtime.GroovyCategorySupport#categoriesInUse counter was not zero, and we were not using any categories in that line! Thus, Groovy tried to fetch a setter from an object, then from a category, and <as we had no active category at the moment, it got null for the setter, and overwrote the valid setter from real ModelAndView. This behaviour (overriding real setter with null setter from category) was fixed in 1.1 beta. But these were only sympthoms - the real problem is the counter. It's incrementing/decrementing methods lack synchronization. There is no synchronization at all!
      The methods in question are org.codehaus.groovy.runtime.GroovyCategorySupport#newScope, org.codehaus.groovy.runtime.GroovyCategorySupport#endScope and org.codehaus.groovy.runtime.GroovyCategorySupport#hasCategoryInAnyThread. Each one uses one static long variable, and it will break almost for sure.

      So, we've written a testcase for that. It's attached to the issue.
      Sometimes we get
      groovy.lang.MissingMethodException: No signature of method: java.lang.String.test() is applicable for argument types: (java.lang.String) values:

      {" bar"}

      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:572)
      at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:450)
      at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:119)
      at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:111)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:187)
      at Test$_run_closure1_closure3_closure4.doCall(Test.groovy:12)

      After adding "synchronized" to these three methods signatures, we got no exceptions.
      This bug is similar to http://jira.codehaus.org/browse/GROOVY-1883 , but I have a bit simpler testcase and a patch proposal for that, so I opened one more issue.

      1. Test.groovy
        0.3 kB
        Max Ishchenko

        Activity

        Hide
        blackdrag blackdrag added a comment -

        fixed

        Show
        blackdrag blackdrag added a comment - fixed

          People

          • Assignee:
            blackdrag blackdrag
            Reporter:
            Max Ishchenko
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: