Repository: hbase Updated Branches: refs/heads/branch-1.0 7141d8f0b -> 949092004
HBASE-14178 regionserver blocks because of waiting for offsetLock Signed-off-by: zhangduo <zhang...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/94909200 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/94909200 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/94909200 Branch: refs/heads/branch-1.0 Commit: 949092004379c7f2e8f08896c90b59d3a9272fbb Parents: 7141d8f Author: chenheng <chenh...@fenbi.com> Authored: Thu Aug 6 16:42:34 2015 +0800 Committer: zhangduo <zhang...@apache.org> Committed: Thu Aug 6 17:18:13 2015 +0800 ---------------------------------------------------------------------- .../hadoop/hbase/io/hfile/CacheConfig.java | 42 ++++++++++++++++++++ .../hadoop/hbase/io/hfile/HFileReaderV2.java | 20 +++++----- 2 files changed, 52 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/94909200/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java index d7159ab..1caf91c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CacheConfig.java @@ -413,6 +413,48 @@ public class CacheConfig { return isBlockCacheEnabled() && this.prefetchOnOpen; } + /** + * Return true if we may find this type of block in block cache. + * <p/> + * TODO: today {@code family.isBlockCacheEnabled()} only means {@code cacheDataOnRead}, so here we + * consider lots of other configurations such as {@code cacheDataOnWrite}. We should fix this in + * the future, {@code cacheDataOnWrite} should honor the CF level {@code isBlockCacheEnabled} + * configuration. + */ + public boolean shouldReadBlockFromCache(BlockType blockType) { + if (!isBlockCacheEnabled()) { + return false; + } + if (cacheDataOnRead) { + return true; + } + if (prefetchOnOpen) { + return true; + } + if (cacheDataOnWrite) { + return true; + } + if (blockType == null) { + return true; + } + if (blockType.getCategory() == BlockCategory.BLOOM || + blockType.getCategory() == BlockCategory.INDEX) { + return true; + } + return false; + } + + /** + * If we make sure the block could not be cached, we will not acquire the lock + * otherwise we will acquire lock + */ + public boolean shouldLockOnCacheMiss(BlockType blockType) { + if (blockType == null) { + return true; + } + return shouldCacheBlockOnRead(blockType.getCategory()); + } + @Override public String toString() { if (!isBlockCacheEnabled()) { http://git-wip-us.apache.org/repos/asf/hbase/blob/94909200/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java index 21f7878..2de9415 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderV2.java @@ -390,12 +390,11 @@ public class HFileReaderV2 extends AbstractHFileReader { TraceScope traceScope = Trace.startSpan("HFileReaderV2.readBlock"); try { while (true) { - if (useLock) { - lockEntry = offsetLock.getLockEntry(dataBlockOffset); - } - // Check cache for block. If found return. - if (cacheConf.isBlockCacheEnabled()) { + if (cacheConf.shouldReadBlockFromCache(expectedBlockType)) { + if (useLock) { + lockEntry = offsetLock.getLockEntry(dataBlockOffset); + } // Try and get the block from the block cache. If the useLock variable is true then this // is the second time through the loop and it should not be counted as a block cache miss. HFileBlock cachedBlock = getCachedBlock(cacheKey, cacheBlock, useLock, isCompaction, @@ -420,13 +419,14 @@ public class HFileReaderV2 extends AbstractHFileReader { // Cache-hit. Return! return cachedBlock; } + if (!useLock && cacheBlock && cacheConf.shouldLockOnCacheMiss(expectedBlockType)) { + // check cache again with lock + useLock = true; + continue; + } // Carry on, please load. } - if (!useLock) { - // check cache again with lock - useLock = true; - continue; - } + if (Trace.isTracing()) { traceScope.getSpan().addTimelineAnnotation("blockCacheMiss"); }