You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2020/08/21 16:31:55 UTC

[hbase] branch master updated: HBASE-24915 Improve BlockCache read performance by specifying BlockType (#2288)

This is an automated email from the ASF dual-hosted git repository.

stack pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 5b515de  HBASE-24915 Improve BlockCache read performance by specifying BlockType (#2288)
5b515de is described below

commit 5b515de7924367dcdf1d0ac5d1217b4265b7657a
Author: 1996fanrui <19...@gmail.com>
AuthorDate: Sat Aug 22 00:31:39 2020 +0800

    HBASE-24915 Improve BlockCache read performance by specifying BlockType (#2288)
    
    
    Signed-off-by: Viraj Jasani <vj...@apache.org>
    Signed-off-by: stack <st...@apache.org>
---
 .../org/apache/hadoop/hbase/io/hfile/BlockCache.java | 15 +++++++++++++++
 .../hadoop/hbase/io/hfile/CombinedBlockCache.java    | 20 +++++++++++++++++++-
 .../hadoop/hbase/io/hfile/HFileReaderImpl.java       |  3 ++-
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
index 6849a97..f54edae 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java
@@ -56,6 +56,21 @@ public interface BlockCache extends Iterable<CachedBlock> {
     boolean updateCacheMetrics);
 
   /**
+   * Fetch block from cache.
+   * @param cacheKey Block to fetch.
+   * @param caching Whether this request has caching enabled (used for stats)
+   * @param repeat Whether this is a repeat lookup for the same block
+   *        (used to avoid double counting cache misses when doing double-check locking)
+   * @param updateCacheMetrics Whether to update cache metrics or not
+   * @param blockType BlockType
+   * @return Block or null if block is not in 2 cache.
+   */
+  default Cacheable getBlock(BlockCacheKey cacheKey, boolean caching, boolean repeat,
+      boolean updateCacheMetrics, BlockType blockType) {
+    return getBlock(cacheKey, caching, repeat, updateCacheMetrics);
+  }
+
+  /**
    * Evict block from cache.
    * @param cacheKey Block to evict
    * @return true if block existed and was evicted, false if not
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
index 36916359..5544ece 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java
@@ -61,7 +61,7 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
 
   @Override
   public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory) {
-    boolean metaBlock = buf.getBlockType().getCategory() != BlockCategory.DATA;
+    boolean metaBlock = isMetaBlock(buf.getBlockType());
     if (metaBlock) {
       l1Cache.cacheBlock(cacheKey, buf, inMemory);
     } else {
@@ -74,6 +74,10 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
     cacheBlock(cacheKey, buf, false);
   }
 
+  private boolean isMetaBlock(BlockType blockType) {
+    return blockType.getCategory() != BlockCategory.DATA;
+  }
+
   @Override
   public Cacheable getBlock(BlockCacheKey cacheKey, boolean caching,
       boolean repeat, boolean updateCacheMetrics) {
@@ -87,6 +91,20 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
   }
 
   @Override
+  public Cacheable getBlock(BlockCacheKey cacheKey, boolean caching, boolean repeat,
+      boolean updateCacheMetrics, BlockType blockType) {
+    if (blockType == null) {
+      return getBlock(cacheKey, caching, repeat, updateCacheMetrics);
+    }
+    boolean metaBlock = isMetaBlock(blockType);
+    if (metaBlock) {
+      return l1Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);
+    } else {
+      return l2Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);
+    }
+  }
+
+  @Override
   public boolean evictBlock(BlockCacheKey cacheKey) {
     return l1Cache.evictBlock(cacheKey) || l2Cache.evictBlock(cacheKey);
   }
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 5c51fe0..de0b15f 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
@@ -1115,7 +1115,8 @@ public abstract class HFileReaderImpl implements HFile.Reader, Configurable {
     BlockCache cache = cacheConf.getBlockCache().orElse(null);
     if (cache != null) {
       HFileBlock cachedBlock =
-          (HFileBlock) cache.getBlock(cacheKey, cacheBlock, useLock, updateCacheMetrics);
+          (HFileBlock) cache.getBlock(cacheKey, cacheBlock, useLock,
+            updateCacheMetrics, expectedBlockType);
       if (cachedBlock != null) {
         if (cacheConf.shouldCacheCompressed(cachedBlock.getBlockType().getCategory())) {
           HFileBlock compressedBlock = cachedBlock;