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

Kevin Sutter commented on OPENJPA-2507:
---------------------------------------

Interesting.  The more I look into this default Stack implementation, it 
doesn't look to be very solid.  Even in the Javadoc for Stack, it recommends 
the use of Deque instead:

"A more complete and consistent set of LIFO stack operations is provided by the 
Deque[1] interface and its implementations, which should be used in preference 
to this class. For example:

   Deque<Integer> stack = new ArrayDeque<Integer>();"

[1]  http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html

And, looking at the Deque's peek operation, it doesn't throw an exception if 
it's empty, it just returns null.  It might be better to just use the Deque 
collection instead of Stack...  Of course, this would have a larger ripple 
effect in the code base...

It's good to know that your proposed hack seems to resolve the issue for you.  
Maybe that's what we need to do for the time being and worry about the "larger 
fish" at a later time...  I have also reached out to Pinaki to see if he has 
any preference.

> Weird EmptyStackException in CriteriaQueryImpl
> ----------------------------------------------
>
>                 Key: OPENJPA-2507
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2507
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: criteria
>    Affects Versions: 2.2.0, 2.3.0
>         Environment: openjpa 2.2.0 & 2.3.0, spring-data-jpa up to 1.4.2
>            Reporter: Ioannis Alexandrakis
>            Priority: Minor
>              Labels: criteria_api, openjpa
>
> Using spring-data-jpa with openjpa, I sometimes encounter a strange error 
> (not all the times, but under heavy load it makes its appearance, sparsely 
> though):
> ....
> Caused by: java.util.EmptyStackException
>         at java.util.Stack.peek(Stack.java:<arbitrary line>)
>         at 
> org.apache.openjpa.persistence.criteria.CriteriaQueryImpl.ctx(CriteriaQueryImpl.java:<arbitrary
>  line>
> ....
> I do not know which behaviour triggers it, however I think it would be an 
> improvement to change (I did not know where exactly to file it, because it is 
> both an improvement and a bug in my opinion), in 
> org.apache.openjpa.persistence.criteria.CriteriaQueryImpl, method: Context 
> ctx(), this:
> return _contexts == null || _contexts.isEmpty() ? null :  _contexts.peek();
> to something like this:
> try {
>       return _contexts == null || _contexts.isEmpty() ? null :  
> _contexts.peek();
> } catch (EmptyStackException e) {
>     return null;
> }
> , in order to prevent a case where multiple threads modify the "_contexts" 
> between the evaluation of the inline "if".
> I am not able to reproduce it all the time, thus I can't create a useful 
> test, neither have I created a patch due to the simplicity of the 'fix'. 
> However I believe it is a harmless fix which could be considered a minor 
> improvement.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to