Deadlock in MemStore flusher due to JDK internally synchronizing on current 
thread
----------------------------------------------------------------------------------

                 Key: HBASE-4367
                 URL: https://issues.apache.org/jira/browse/HBASE-4367
             Project: HBase
          Issue Type: Bug
          Components: regionserver
    Affects Versions: 0.90.4
            Reporter: Todd Lipcon
            Assignee: Todd Lipcon
            Priority: Critical
             Fix For: 0.92.0


We observed a deadlock in production between the following threads:
- IPC handler thread holding the monitor lock on MemStoreFlusher inside 
reclaimMemStoreMemory, waiting to obtain MemStoreFlusher.lock (the reentrant 
lock member)
- cacheFlusher thread inside flushRegion holds MemStoreFlusher.lock, and then 
calls PriorityCompactionQueue.add, which calls 
PriorityCompactionQueue.addToRegionsInQueue, which calls 
CompactionRequest.toString(), which calls Date.toString. If this occurs just 
after a GC under memory pressure, Date.toString needs to reload locale 
information (stored in a soft reference), so it calls 
ResourceBundle.loadBundle, which uses Thread.currentThread() as a synchronizer 
(see sun bug http://bugs.sun.com/view_bug.do?bug_id=6915621). Since the current 
thread is the MemStoreFlusher itself, we have a lock order inversion and a 
deadlock.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to