Repository: hbase
Updated Branches:
  refs/heads/master 5d2708f62 -> 75a6cb2be


HBASE-14178 regionserver blocks because of waiting for offsetLock

Signed-off-by: zhangduo <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/75a6cb2b
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/75a6cb2b
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/75a6cb2b

Branch: refs/heads/master
Commit: 75a6cb2be6ae95654561213a247aa7ba62505072
Parents: 5d2708f
Author: chenheng <[email protected]>
Authored: Thu Aug 6 16:10:50 2015 +0800
Committer: zhangduo <[email protected]>
Committed: Thu Aug 6 17:00:45 2015 +0800

----------------------------------------------------------------------
 .../hadoop/hbase/io/hfile/CacheConfig.java      | 42 ++++++++++++++++++++
 .../hadoop/hbase/io/hfile/HFileReaderImpl.java  | 21 +++++-----
 2 files changed, 53 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/75a6cb2b/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 0ed3cbd..08e9048 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
@@ -431,6 +431,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/75a6cb2b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java
index 18240b1..1b8f83f 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java
@@ -1431,12 +1431,11 @@ public class HFileReaderImpl implements HFile.Reader, 
Configurable {
     TraceScope traceScope = Trace.startSpan("HFileReaderImpl.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,
@@ -1461,13 +1460,15 @@ public class HFileReaderImpl implements HFile.Reader, 
Configurable {
             // 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");
         }

Reply via email to