[ http://issues.apache.org/jira/browse/IBATIS-249?page=all ]
Sven Boden closed IBATIS-249:
-----------------------------
Fix Version: 2.2.0
Resolution: Fixed
Assign To: Sven Boden
Thanks for the IBATIS-249 patch Jonathan, changes checked in:
- Verified by at least 2 other people
- I played a little bit with it
- Logically the changes look correct
- No unit test case as it's difficult to simulate
> Race conditions in Throttle lead to thread blockage popping items from
> ThrottledPools under stress
> --------------------------------------------------------------------------------------------------
>
> Key: IBATIS-249
> URL: http://issues.apache.org/jira/browse/IBATIS-249
> Project: iBatis for Java
> Type: Bug
> Components: SQL Maps
> Versions: 2.1.7
> Reporter: Jonathan Burstein
> Assignee: Sven Boden
> Fix For: 2.2.0
> Attachments: IBATIS-249.diff
>
> com.ibatis.common.util.Throttle.increment contains a synchronization error.
> Currently, when a waiting thread returns from LOCK.wait it will increment
> count and return without checking that count is below limit. There are a
> number of situations where LOCK.wait can complete but the count will not be
> less than the limit:
> 1) The wait was interrupted
> 2) There was a spurious thread wakeup
> 3) Another thread obtained the lock between the time LOCK.notify was called
> (by a thread calling decrement) and the wait returned.
> The fix here is to re-check the value of count after exiting the wait (using
> a while loop). A small amount of extra logic is necessary to satisfy maxWait
> properly.
> ThrottledPool.pop attempts to work around these race conditions by catching
> swallowing all exceptions from throttle.increment and pool.remove(0) and
> looping until an item is obtained. Since the increment call is within the
> loop this logic can lead to multiple increments with no corresponding
> decrements. Note that an IndexOutOfBound exception from pool.remove(0) is an
> artifact of the bug in Throttle.increment -- this could never occur if
> Throttle behaved correctly.
> This routine should simple call throttle.increment and pool.remove(0). It
> should most certainly not swallow exceptions.
> Finally, ThrottledPool.push incorrectly calls throttle.decrement if the
> parameter is invalid (null or of an incorrect type).
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira