Allan Yang created HBASE-21292:
----------------------------------

             Summary: IdLock.getLockEntry() may hang if interrupted
                 Key: HBASE-21292
                 URL: https://issues.apache.org/jira/browse/HBASE-21292
             Project: HBase
          Issue Type: Bug
            Reporter: Allan Yang
            Assignee: Allan Yang
             Fix For: 1.4.9, 2.0.2, 2.1.0


This is a rare case found by my colleague which really happened on our 
production env. 
Thread may hang(or enter a infinite loop ) when try to call 
IdLock.getLockEntry(). Here is the case:
1. Thread1 owned the IdLock, while Thread2(the only one waiting) was waiting 
for it.
2. Thread1 called releaseLockEntry, it will set IdLock.locked = false, but 
since Thread2 was waiting, it won't call map.remove(entry.id)
3. While Thread1 was calling releaseLockEntry, Thread2 was interrupted. So no 
one will remove this IdLock from the map.
4. If another thread try to call getLockEntry on this IdLock, it will end up in 
a infinite loop. Since existing = map.putIfAbsent(entry.id, entry)) != null and 
existing.locked=false

It is hard to write a UT since it is a very rare race condition.




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to