You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by wc...@apache.org on 2023/11/02 21:06:08 UTC

(hbase) branch branch-2 updated: HBASE-27794: Tooling for parsing/reading the prefetch files list file (#5468) (#5491)

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

wchevreuil pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 8b1f690adaf HBASE-27794: Tooling for parsing/reading the prefetch files list file (#5468) (#5491)
8b1f690adaf is described below

commit 8b1f690adafea6a2df3012f1fc5708d3dea702b0
Author: Kota-SH <sh...@gmail.com>
AuthorDate: Thu Nov 2 16:06:02 2023 -0500

    HBASE-27794: Tooling for parsing/reading the prefetch files list file (#5468) (#5491)
    
    Signed-off-by: Wellington Chevreuil <wc...@apache.org>
    
    (cherry picked from commit fa4c8960e587e9f62442c35fd11a85e1cc4b4690)
---
 .../main/java/org/apache/hadoop/hbase/client/Admin.java |  5 +++++
 .../java/org/apache/hadoop/hbase/client/AsyncAdmin.java |  5 +++++
 .../org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java |  5 +++++
 .../java/org/apache/hadoop/hbase/client/HBaseAdmin.java | 11 ++++++++++-
 .../apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java  | 13 +++++++++++++
 .../hadoop/hbase/shaded/protobuf/ProtobufUtil.java      | 17 +++++++++++++++++
 hbase-protocol-shaded/src/main/protobuf/Admin.proto     | 10 ++++++++++
 .../org/apache/hadoop/hbase/io/hfile/BlockCache.java    |  9 +++++++++
 .../hadoop/hbase/io/hfile/CombinedBlockCache.java       | 10 ++++++++++
 .../apache/hadoop/hbase/io/hfile/HFilePreadReader.java  |  5 +++--
 .../hadoop/hbase/io/hfile/bucket/BucketCache.java       |  5 +++--
 .../apache/hadoop/hbase/master/MasterRpcServices.java   |  8 ++++++++
 .../apache/hadoop/hbase/regionserver/RSRpcServices.java | 13 +++++++++++++
 .../hadoop/hbase/io/hfile/TestPrefetchRSClose.java      | 16 +++++++++++++++-
 .../hbase/io/hfile/TestPrefetchWithBucketCache.java     |  2 +-
 .../apache/hadoop/hbase/master/MockRegionServer.java    |  8 ++++++++
 .../apache/hadoop/hbase/thrift2/client/ThriftAdmin.java |  8 ++++++++
 17 files changed, 143 insertions(+), 7 deletions(-)

diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
index ab3df597bfa..871c1b82149 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java
@@ -3317,4 +3317,9 @@ public interface Admin extends Abortable, Closeable {
    * @throws IOException if a remote or network exception occurs
    */
   Future<Void> truncateRegionAsync(byte[] regionName) throws IOException;
+
+  /**
+   * Get the list of cached files
+   */
+  List<String> getCachedFilesList(ServerName serverName) throws IOException;
 }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
index 6b95e19a22a..bde7e950e56 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java
@@ -1702,4 +1702,9 @@ public interface AsyncAdmin {
    * Flush master local region
    */
   CompletableFuture<Void> flushMasterStore();
+
+  /**
+   * Get the list of cached files
+   */
+  CompletableFuture<List<String>> getCachedFilesList(ServerName serverName);
 }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
index 4c9138e7306..cf473291319 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java
@@ -911,4 +911,9 @@ class AsyncHBaseAdmin implements AsyncAdmin {
   public CompletableFuture<Void> flushMasterStore() {
     return wrap(rawAdmin.flushMasterStore());
   }
+
+  @Override
+  public CompletableFuture<List<String>> getCachedFilesList(ServerName serverName) {
+    return wrap(rawAdmin.getCachedFilesList(serverName));
+  }
 }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
index c54e561cc21..601f13b4889 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java
@@ -2078,7 +2078,7 @@ public class HBaseAdmin implements Admin {
       throw new IllegalArgumentException("Invalid region: " + Bytes.toStringBinary(regionName));
     }
 
-    TableName tableName = hri.getTable();
+    TableName tableName = (hri != null) ? hri.getTable() : null;
 
     MasterProtos.TruncateRegionResponse response =
       executeCallable(getTruncateRegionCallable(tableName, hri));
@@ -2086,6 +2086,15 @@ public class HBaseAdmin implements Admin {
     return new TruncateRegionFuture(this, tableName, response);
   }
 
+  /**
+   * Get the list of cached files
+   */
+  @Override
+  public List<String> getCachedFilesList(ServerName serverName) throws IOException {
+    return ProtobufUtil.getCachedFilesList(rpcControllerFactory.newController(),
+      this.connection.getAdmin(serverName));
+  }
+
   private MasterCallable<MasterProtos.TruncateRegionResponse>
     getTruncateRegionCallable(TableName tableName, RegionInfo hri) {
     return new MasterCallable<MasterProtos.TruncateRegionResponse>(getConnection(),
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
index 7a560e51e0a..cf103f401fc 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java
@@ -129,6 +129,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionS
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactionSwitchResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
@@ -4264,4 +4266,15 @@ class RawAsyncHBaseAdmin implements AsyncAdmin {
           (s, c, req, done) -> s.flushMasterStore(c, req, done), resp -> null))
       .call();
   }
+
+  @Override
+  public CompletableFuture<List<String>> getCachedFilesList(ServerName serverName) {
+    GetCachedFilesListRequest.Builder request = GetCachedFilesListRequest.newBuilder();
+    return this.<List<String>> newAdminCaller()
+      .action((controller, stub) -> this.<GetCachedFilesListRequest, GetCachedFilesListResponse,
+        List<String>> adminCall(controller, stub, request.build(),
+          (s, c, req, done) -> s.getCachedFilesList(c, req, done),
+          resp -> resp.getCachedFilesList()))
+      .serverName(serverName).call();
+  }
 }
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
index a3b55e5ef16..477e869296a 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
@@ -149,6 +149,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearSlowLogResponses;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
@@ -1746,6 +1748,21 @@ public final class ProtobufUtil {
     return getRegionInfos(response);
   }
 
+  /**
+   * Get the list of cached files
+   */
+  public static List<String> getCachedFilesList(final RpcController controller,
+    final AdminService.BlockingInterface admin) throws IOException {
+    GetCachedFilesListRequest request = GetCachedFilesListRequest.newBuilder().build();
+    GetCachedFilesListResponse response = null;
+    try {
+      response = admin.getCachedFilesList(controller, request);
+    } catch (ServiceException se) {
+      throw getRemoteException(se);
+    }
+    return new ArrayList<>(response.getCachedFilesList());
+  }
+
   /**
    * Get the list of region info from a GetOnlineRegionResponse
    * @param proto the GetOnlineRegionResponse
diff --git a/hbase-protocol-shaded/src/main/protobuf/Admin.proto b/hbase-protocol-shaded/src/main/protobuf/Admin.proto
index 0c25be1a7f2..ae0bd78fbf9 100644
--- a/hbase-protocol-shaded/src/main/protobuf/Admin.proto
+++ b/hbase-protocol-shaded/src/main/protobuf/Admin.proto
@@ -283,6 +283,13 @@ message ExecuteProceduresRequest {
 message ExecuteProceduresResponse {
 }
 
+message GetCachedFilesListRequest {
+}
+
+message GetCachedFilesListResponse {
+  repeated string cached_files = 1;
+}
+
 /**
  * Slow/Large log (LogRequest) use-case specific RPC request. This request payload will be
  * converted in bytes and sent to generic RPC API: GetLogEntries
@@ -406,4 +413,7 @@ service AdminService {
   rpc GetLogEntries(LogRequest)
     returns(LogEntry);
 
+  rpc GetCachedFilesList(GetCachedFilesListRequest)
+    returns(GetCachedFilesListResponse);
+
 }
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 6c05402f5a5..fee9325fae2 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
@@ -18,6 +18,8 @@
 package org.apache.hadoop.hbase.io.hfile;
 
 import java.util.Iterator;
+import java.util.Map;
+import java.util.Optional;
 import org.apache.yetus.audience.InterfaceAudience;
 
 /**
@@ -146,4 +148,11 @@ public interface BlockCache extends Iterable<CachedBlock> {
   default boolean isMetaBlock(BlockType blockType) {
     return blockType != null && blockType.getCategory() != BlockType.BlockCategory.DATA;
   }
+
+  /**
+   * Returns the list of fully cached files
+   */
+  default Optional<Map<String, Boolean>> getFullyCachedFiles() {
+    return Optional.empty();
+  }
 }
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 4ad6dc3683f..5ff2ee02a6e 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
@@ -18,6 +18,8 @@
 package org.apache.hadoop.hbase.io.hfile;
 
 import java.util.Iterator;
+import java.util.Map;
+import java.util.Optional;
 import org.apache.hadoop.hbase.io.HeapSize;
 import org.apache.hadoop.hbase.io.hfile.bucket.BucketCache;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -369,6 +371,14 @@ public class CombinedBlockCache implements ResizableBlockCache, HeapSize {
     return new BlockCache[] { this.l1Cache, this.l2Cache };
   }
 
+  /**
+   * Returns the list of fully cached files
+   */
+  @Override
+  public Optional<Map<String, Boolean>> getFullyCachedFiles() {
+    return this.l2Cache.getFullyCachedFiles();
+  }
+
   @Override
   public void setMaxSize(long size) {
     this.l1Cache.setMaxSize(size);
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFilePreadReader.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFilePreadReader.java
index 1ac9a4ffb84..f1579ea53b8 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFilePreadReader.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/HFilePreadReader.java
@@ -42,8 +42,9 @@ public class HFilePreadReader extends HFileReaderImpl {
     final MutableBoolean fileAlreadyCached = new MutableBoolean(false);
     Optional<BucketCache> bucketCacheOptional =
       BucketCache.getBucketCacheFromCacheConfig(cacheConf);
-    bucketCacheOptional.ifPresent(bc -> fileAlreadyCached
-      .setValue(bc.getFullyCachedFiles().get(path.getName()) == null ? false : true));
+    bucketCacheOptional.flatMap(BucketCache::getFullyCachedFiles).ifPresent(fcf -> {
+      fileAlreadyCached.setValue(fcf.get(path.getName()) == null ? false : true);
+    });
     // Prefetch file blocks upon open if requested
     if (
       cacheConf.shouldPrefetchOnOpen() && cacheIfCompactionsOff()
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
index f7f6f8a8ee0..5b1757b8507 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java
@@ -1950,8 +1950,9 @@ public class BucketCache implements BlockCache, HeapSize {
     return backingMapValidated;
   }
 
-  public Map<String, Boolean> getFullyCachedFiles() {
-    return fullyCachedFiles;
+  @Override
+  public Optional<Map<String, Boolean>> getFullyCachedFiles() {
+    return Optional.of(fullyCachedFiles);
   }
 
   public static Optional<BucketCache> getBucketCacheFromCacheConfig(CacheConfig cacheConf) {
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
index d4cfaaaf47a..2924ebef000 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
@@ -152,6 +152,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.Rev
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CompactRegionResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
@@ -3065,6 +3067,12 @@ public class MasterRpcServices extends RSRpcServices
     throw new ServiceException("Invalid request params");
   }
 
+  @Override
+  public GetCachedFilesListResponse getCachedFilesList(RpcController controller,
+    GetCachedFilesListRequest request) throws ServiceException {
+    throw new ServiceException(new DoNotRetryIOException("Unsupported method on master"));
+  }
+
   private MasterProtos.BalancerDecisionsResponse
     getBalancerDecisions(MasterProtos.BalancerDecisionsRequest request) {
     final NamedQueueRecorder namedQueueRecorder = this.regionServer.getNamedQueueRecorder();
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
index 834e3a6301a..09dc35963c2 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java
@@ -188,6 +188,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProc
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
@@ -4033,6 +4035,17 @@ public class RSRpcServices implements HBaseRPCErrorHandler, AdminService.Blockin
     throw new ServiceException("Invalid request params");
   }
 
+  @Override
+  public GetCachedFilesListResponse getCachedFilesList(RpcController controller,
+    GetCachedFilesListRequest request) throws ServiceException {
+    GetCachedFilesListResponse.Builder responseBuilder = GetCachedFilesListResponse.newBuilder();
+    List<String> fullyCachedFiles = new ArrayList<>();
+    regionServer.getBlockCache().flatMap(BlockCache::getFullyCachedFiles).ifPresent(fcf -> {
+      fullyCachedFiles.addAll(fcf.keySet());
+    });
+    return responseBuilder.addAllCachedFiles(fullyCachedFiles).build();
+  }
+
   public RpcScheduler getRpcScheduler() {
     return rpcServer.getScheduler();
   }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchRSClose.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchRSClose.java
index 3794c6c28d7..5164d582fa0 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchRSClose.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchRSClose.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.util.List;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -30,11 +31,14 @@ import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.MiniHBaseCluster;
 import org.apache.hadoop.hbase.StartMiniClusterOption;
 import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
+import org.apache.hadoop.hbase.regionserver.HRegionServer;
+import org.apache.hadoop.hbase.regionserver.HStoreFile;
 import org.apache.hadoop.hbase.testclassification.IOTests;
 import org.apache.hadoop.hbase.testclassification.LargeTests;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -111,7 +115,17 @@ public class TestPrefetchRSClose {
 
     // Default interval for cache persistence is 1000ms. So after 1000ms, both the persistence files
     // should exist.
-    assertTrue(new File(testDir + "/bucket.persistence").exists());
+
+    HRegionServer regionServingRS = cluster.getRegionServer(1).getRegions(tableName).size() == 1
+      ? cluster.getRegionServer(1)
+      : cluster.getRegionServer(0);
+
+    Admin admin = TEST_UTIL.getAdmin();
+    List<String> cachedFilesList = admin.getCachedFilesList(regionServingRS.getServerName());
+    assertEquals(1, cachedFilesList.size());
+    for (HStoreFile h : regionServingRS.getRegions().get(0).getStores().get(0).getStorefiles()) {
+      assertTrue(cachedFilesList.contains(h.getPath().getName()));
+    }
 
     // Stop the RS
     cluster.stopRegionServer(0);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchWithBucketCache.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchWithBucketCache.java
index 768e41019d8..f9f48ff8535 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchWithBucketCache.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/TestPrefetchWithBucketCache.java
@@ -123,7 +123,7 @@ public class TestPrefetchWithBucketCache {
     BlockCacheKey key = snapshot.keySet().stream().findFirst().get();
     LOG.debug("removing block {}", key);
     bc.getBackingMap().remove(key);
-    bc.getFullyCachedFiles().remove(storeFile.getName());
+    bc.getFullyCachedFiles().ifPresent(fcf -> fcf.remove(storeFile.getName()));
     assertTrue(snapshot.size() > bc.getBackingMap().size());
     LOG.debug("Third read should prefetch again, as we removed one block for the file.");
     readStoreFile(storeFile);
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
index 72a3ad044c3..736560e18cb 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java
@@ -95,6 +95,8 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProc
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.FlushRegionResponse;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionRequest;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetOnlineRegionResponse;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoRequest;
@@ -694,6 +696,12 @@ class MockRegionServer implements AdminProtos.AdminService.BlockingInterface,
     return null;
   }
 
+  @Override
+  public GetCachedFilesListResponse getCachedFilesList(RpcController controller,
+    GetCachedFilesListRequest request) throws ServiceException {
+    return null;
+  }
+
   @Override
   public GetSpaceQuotaSnapshotsResponse getSpaceQuotaSnapshots(RpcController controller,
     GetSpaceQuotaSnapshotsRequest request) throws ServiceException {
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
index 183efd6288a..76deb6fdd6a 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/client/ThriftAdmin.java
@@ -898,6 +898,14 @@ public class ThriftAdmin implements Admin {
     throw new NotImplementedException("Truncate Region Async not supported in ThriftAdmin");
   }
 
+  /**
+   * Get the list of cached files
+   */
+  @Override
+  public List<String> getCachedFilesList(ServerName serverName) {
+    throw new NotImplementedException("getCachedFilesList not supported in ThriftAdmin");
+  }
+
   @Override
   public void splitRegion(byte[] regionName, byte[] splitPoint) {
     throw new NotImplementedException("splitRegion not supported in ThriftAdmin");