-
Bug
-
Resolution: Done
-
Major
-
5.2.6.Final
-
None
There is a race condition in LocalLockMergingSegmentReadLocker which can lead to more calls delete on the underlying DistributedSegmentReadLocker which results in the file being removed from the caches.
This happens with three or more threads acquiring and releasing locks on the same file simultaneously:
- Thread 1 (T1) acquires a lock and creates a LocalReadLock, call it L1 - the underlying lock is acquired
- T2 starts to acquire and holds a reference to L1
- T3 starts to acquire and holds a reference to L1
- T1 releases - L1 at this stage only has value of 1 - so the underlying lock is released, and L1 is removed from the map
- T2 continues - finds L1 with value 0 and acquires the underlying lock
- T3 continues - increments L1 value to 2
- T2 releases - creates a new LocalReadLock, L2 - this has zero value so the underlying lock is released, and L2 is removed from the map
- T3 releases - creates a new LocalReadLock, L3 - this has zero value so the underlying lock is released, and L3 is removed from the map
- The final step triggers a real file delete as underlying lock is released one too many times