From 7c2bc602d974fe272eb5ccb17f5a6b1306a5802e Mon Sep 17 00:00:00 2001 From: Kota-SH Date: Mon, 27 Mar 2023 04:49:55 -0500 Subject: [PATCH] CDPD-45123 Backport of HBASE-27750: Update the list of prefetched Hfiles upon block eviction (#5140) Signed-off-by: Wellington Chevreuil Change-Id: Ifdfa755a800c1c926403b90ec991d7d2e9f7da38 --- .../hbase/io/hfile/bucket/BucketCache.java | 4 ++++ .../hbase/io/hfile/TestPrefetchRSClose.java | 2 +- .../bucket/TestBucketCachePersister.java | 20 ++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) 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 80f59460627d..15ca29835eb6 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 @@ -368,6 +368,7 @@ protected void startWriterThreads() { void startBucketCachePersisterThread() { BucketCachePersister cachePersister = new BucketCachePersister(this, bucketcachePersistInterval); + cachePersister.setDaemon(true); cachePersister.start(); } @@ -600,6 +601,9 @@ void blockEvicted(BlockCacheKey cacheKey, BucketEntry bucketEntry, boolean decre cacheStats.evicted(bucketEntry.getCachedTime(), cacheKey.isPrimary()); } if (ioEngine.isPersistent()) { + if (prefetchedFileListPath != null) { + PrefetchExecutor.removePrefetchedFileWhileEvict(cacheKey.getHfileName()); + } setCacheInconsistent(true); } } 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 b0c4cafb2def..ee324e9dbaaa 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 @@ -107,7 +107,7 @@ public void testPrefetchPersistence() throws Exception { table.put(put1); TEST_UTIL.flush(tableName); } finally { - Thread.sleep(1500); + Thread.sleep(2000); } // Default interval for cache persistence is 1000ms. So after 1000ms, both the persistence files diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCachePersister.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCachePersister.java index 755a39261d33..2fbcf2850e37 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCachePersister.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCachePersister.java @@ -38,6 +38,7 @@ import org.apache.hadoop.hbase.io.hfile.HFileBlock; import org.apache.hadoop.hbase.io.hfile.HFileContext; import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder; +import org.apache.hadoop.hbase.io.hfile.PrefetchExecutor; import org.apache.hadoop.hbase.io.hfile.RandomKeyValueUtil; import org.apache.hadoop.hbase.regionserver.StoreFileWriter; import org.apache.hadoop.hbase.testclassification.IOTests; @@ -119,7 +120,7 @@ public void testPrefetchPersistenceCrash() throws Exception { @Test public void testPrefetchPersistenceCrashNegative() throws Exception { - long bucketCachePersistInterval = 3000; + long bucketCachePersistInterval = Long.MAX_VALUE; Configuration conf = setupBucketCacheConfig(bucketCachePersistInterval); BucketCache bucketCache = setupBucketCache(conf); CacheConfig cacheConf = new CacheConfig(conf, bucketCache); @@ -132,6 +133,23 @@ public void testPrefetchPersistenceCrashNegative() throws Exception { cleanupBucketCache(bucketCache); } + @Test + public void testPrefetchListUponBlockEviction() throws Exception { + Configuration conf = setupBucketCacheConfig(200); + BucketCache bucketCache1 = setupBucketCache(conf); + CacheConfig cacheConf = new CacheConfig(conf, bucketCache1); + FileSystem fs = HFileSystem.get(conf); + // Load Blocks in cache + Path storeFile = writeStoreFile("TestPrefetch3", conf, cacheConf, fs); + readStoreFile(storeFile, 0, fs, cacheConf, conf, bucketCache1); + Thread.sleep(500); + // Evict Blocks from cache + BlockCacheKey bucketCacheKey = bucketCache1.backingMap.entrySet().iterator().next().getKey(); + assertTrue(PrefetchExecutor.isFilePrefetched(storeFile.getName())); + bucketCache1.evictBlock(bucketCacheKey); + assertFalse(PrefetchExecutor.isFilePrefetched(storeFile.getName())); + } + public void readStoreFile(Path storeFilePath, long offset, FileSystem fs, CacheConfig cacheConf, Configuration conf, BucketCache bucketCache) throws Exception { // Open the file