Quantcast

[jira] [Commented] (GROOVY-7535) Groovy category throwing MissingMethodException and MissingPropertyException when using multiple threads

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[jira] [Commented] (GROOVY-7535) Groovy category throwing MissingMethodException and MissingPropertyException when using multiple threads

JIRA jira@apache.org

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

John Wagenleitner commented on GROOVY-7535:
-------------------------------------------

The {{AtomicInteger#get}} shouldn't lock but would be a {{volatile}} read (and other methods use CAS and not locks).  While I don't think having that volatile read in {{hasCategoryInCurrentThread}} will cause too much of a performance issue, I do agree that it's awkward to be using the {{AtomicInteger}} in the synchronized blocks.  Given that there is only a need to observe 0 or non-Zero for {{categoriesInUse}} and a precise number does not matter, except when decrementing which is synchronized. I also think the {{int}} counter version is better as long as there's a [some comment|https://github.com/apache/groovy/pull/540/commits/6fddddb2a39741d68358701230a929728338e7aa] to explain why there is no synchronized read in {{hasCategoryInCurrentThread}}.  In either case, I think one additional change should be to deprecate the {{hasCategoryInAnyThread}} method.

I think the original fix that was put into 2.4.6 did not fix the issue and may have just reduced the number of instructions that the threads could interleave on in order to reproduce.  I'd like to see what others think, if in agreement then as [~paulk] mentioned this should be re-opened.

> 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
>            Assignee: Pascal Schumacher
>             Fix For: 2.4.6
>
>         Attachments: 0001-GROOVY-7535-fix-race-condition-between-the-modificat.patch, CategoryTest.groovy, exceptionForCategoryTest.txt, exceptionForTimeCategoryTest.txt, locking.png, Test.groovy, TimeCategoryTest.groovy
>
>
> 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.15#6346)
Loading...