[ 
https://issues.apache.org/jira/browse/GROOVY-7535?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14979967#comment-14979967
 ] 

Jochen Theodorou commented on GROOVY-7535:
------------------------------------------

sorry, first had answered on dev, because I thought it was a normal thread :) 
What kind of cpu are you using James?

As for the change, the explicit synchronization was removed by a logic using an 
AtomicInteger and an int to allow unsychronized checks for category usage. The 
idea is the following: A category is only visible in the same thread that it is 
used, so updates to categoriesInUse from the same thread are visible and 
hasCategoryInCurrentThread will return true. For the actual counting of the 
number of active categories overall we use the AtomicInteger 
atomicCategoryUsageCounter, which will also be used to update categoriesInUse. 
hasCategoryInAnyThread should always return true if any category is active. The 
actual building of the category methods list happens in a thread local and is 
read in a thread local. I would love to learn where this all fails.

> Groovy category throwing MissingMethodException and MissingPropertyException 
> when using multiple threads
> --------------------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-7535
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7535
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.3.11, 2.4.4
>         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.
>            Reporter: James Oswald
>         Attachments: CategoryTest.groovy, Test.groovy, 
> TimeCategoryTest.groovy, exceptionForCategoryTest.txt, 
> exceptionForTimeCategoryTest.txt
>
>
> When using groovy use block, we randomly get 
> groovy.lang.MissingPropertyException when trying to access a property off a 
> category.  (Attached is an example)
> {quote}
> 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)
> {quote}
> or groovy.lang.MissingMethodException when trying to access a method from a 
> category.
> {quote}
> 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)
> {quote}
> 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.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to