LockManager has a possible deadlock.
- Number of locks is limited by using a GenericObjectPool. If N locks are already acquired, new requestors need to wait. This wait in getLockForLocking happens in a callback executed from ConcurrentHashMap#compute while holding a lock on a map entry.
- While releasing a lock, decrementActiveLockCount implicitly requires a lock on an entry in ConcurrentHashMap.