commit 033d7d99e30d9943a0b63024ec940efe33513896 Author: Todd Lipcon Date: Sat Apr 28 20:09:09 2012 -0700 do double checked locking on block cache diff --git conf/hbase-site.xml conf/hbase-site.xml index af4c300..bbca23e 100644 --- conf/hbase-site.xml +++ conf/hbase-site.xml @@ -22,4 +22,5 @@ */ --> +hbase.ipc.warn.response.time100000 diff --git src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java index 6dfeaa1..2fbfd23 100644 --- src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java +++ src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java @@ -289,9 +289,17 @@ public class HFileReaderV2 extends AbstractHFileReader { new BlockCacheKey(name, dataBlockOffset, dataBlockEncoder.getEffectiveEncodingInCache(isCompaction), expectedBlockType); - IdLock.Entry lockEntry = offsetLock.getLockEntry(dataBlockOffset); + + boolean useLock = false; + IdLock.Entry lockEntry = null; + blockLoads.incrementAndGet(); try { - blockLoads.incrementAndGet(); + while (true) { + + if (useLock) { + lockEntry = offsetLock.getLockEntry(dataBlockOffset); + } + // Check cache for block. If found return. if (cacheConf.isBlockCacheEnabled()) { @@ -323,6 +331,11 @@ public class HFileReaderV2 extends AbstractHFileReader { } // Carry on, please load. } + if (!useLock) { + // check cache again with lock + useLock = true; + continue; + } // Load block from filesystem. long startTimeNs = System.nanoTime(); @@ -350,8 +363,11 @@ public class HFileReaderV2 extends AbstractHFileReader { } return hfileBlock; + } } finally { - offsetLock.releaseLockEntry(lockEntry); + if (lockEntry != null) { + offsetLock.releaseLockEntry(lockEntry); + } } }