Skip to content

Commit 8fcca4a

Browse files
committed
HBASE-27795: Define RPC API for cache cleaning
1 parent fa4c896 commit 8fcca4a

File tree

17 files changed

+328
-0
lines changed

17 files changed

+328
-0
lines changed

hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2634,4 +2634,9 @@ List<LogEntry> getLogEntries(Set<ServerName> serverNames, String logType, Server
26342634
* Get the list of cached files
26352635
*/
26362636
List<String> getCachedFilesList(ServerName serverName) throws IOException;
2637+
2638+
/**
2639+
* Clean BucketCache
2640+
*/
2641+
Map<String, Integer> cleanBucketCache(ServerName serverName) throws IOException;
26372642
}

hbase-client/src/main/java/org/apache/hadoop/hbase/client/AdminOverAsyncAdmin.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,4 +1130,12 @@ public void flushMasterStore() throws IOException {
11301130
public List<String> getCachedFilesList(ServerName serverName) throws IOException {
11311131
return get(admin.getCachedFilesList(serverName));
11321132
}
1133+
1134+
/**
1135+
* Clean BucketCache
1136+
*/
1137+
@Override
1138+
public Map<String,Integer> cleanBucketCache(ServerName serverName) throws IOException {
1139+
return get(admin.cleanBucketCache(serverName));
1140+
}
11331141
}

hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncAdmin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,4 +1848,9 @@ CompletableFuture<List<LogEntry>> getLogEntries(Set<ServerName> serverNames, Str
18481848
* Get the list of cached files
18491849
*/
18501850
CompletableFuture<List<String>> getCachedFilesList(ServerName serverName);
1851+
1852+
/**
1853+
* Clean BucketCache
1854+
*/
1855+
CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName);
18511856
}

hbase-client/src/main/java/org/apache/hadoop/hbase/client/AsyncHBaseAdmin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,4 +1000,9 @@ public CompletableFuture<Void> flushMasterStore() {
10001000
public CompletableFuture<List<String>> getCachedFilesList(ServerName serverName) {
10011001
return wrap(rawAdmin.getCachedFilesList(serverName));
10021002
}
1003+
1004+
@Override
1005+
public CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName) {
1006+
return wrap(rawAdmin.cleanBucketCache(serverName));
1007+
}
10031008
}

hbase-client/src/main/java/org/apache/hadoop/hbase/client/RawAsyncHBaseAdmin.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@
122122
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeRequest;
123123
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeResponse;
124124
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
125+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheRequest;
126+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheResponse;
125127
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest;
126128
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;
127129
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest;
@@ -4532,4 +4534,18 @@ List<String>> adminCall(controller, stub, request.build(),
45324534
resp -> resp.getCachedFilesList()))
45334535
.serverName(serverName).call();
45344536
}
4537+
4538+
/**
4539+
* Clean BucketCache
4540+
*/
4541+
@Override
4542+
public CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName) {
4543+
CleanBucketCacheRequest.Builder request = CleanBucketCacheRequest.newBuilder();
4544+
return this.<Map<String, Integer>> newAdminCaller()
4545+
.action((controller, stub) -> this.<CleanBucketCacheRequest, CleanBucketCacheResponse,
4546+
Map<String, Integer>> adminCall(controller, stub, request.build(),
4547+
(s, c, req, done) -> s.cleanBucketCache(c, req, done),
4548+
resp -> resp.getUncachedFilesMap()))
4549+
.serverName(serverName).call();
4550+
}
45354551
}

hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@
151151

152152
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
153153
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
154+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheRequest;
155+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheResponse;
154156
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearSlowLogResponses;
155157
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;
156158
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
@@ -1797,6 +1799,21 @@ public static List<String> getCachedFilesList(final RpcController controller,
17971799
return new ArrayList<>(response.getCachedFilesList());
17981800
}
17991801

1802+
/**
1803+
* Get the list of cached files
1804+
*/
1805+
public static Map<String, Integer> cleanBucketCache(final RpcController controller,
1806+
final AdminService.BlockingInterface admin) throws IOException {
1807+
CleanBucketCacheRequest request = CleanBucketCacheRequest.newBuilder().build();
1808+
CleanBucketCacheResponse response = null;
1809+
try {
1810+
response = admin.cleanBucketCache(controller, request);
1811+
} catch (ServiceException se) {
1812+
throw getRemoteException(se);
1813+
}
1814+
return response.getUncachedFilesMap();
1815+
}
1816+
18001817
/**
18011818
* Get the list of region info from a GetOnlineRegionResponse
18021819
* @param proto the GetOnlineRegionResponse

hbase-protocol-shaded/src/main/protobuf/server/region/Admin.proto

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,14 @@ message ClearSlowLogResponses {
336336
required bool is_cleaned = 1;
337337
}
338338

339+
message CleanBucketCacheRequest {
340+
}
341+
342+
message CleanBucketCacheResponse {
343+
map<string, int32> uncached_files = 1;
344+
}
345+
346+
339347
service AdminService {
340348
rpc GetRegionInfo(GetRegionInfoRequest)
341349
returns(GetRegionInfoResponse);
@@ -415,4 +423,7 @@ service AdminService {
415423
rpc GetCachedFilesList(GetCachedFilesListRequest)
416424
returns(GetCachedFilesListResponse);
417425

426+
rpc CleanBucketCache(CleanBucketCacheRequest)
427+
returns(CleanBucketCacheResponse);
428+
418429
}

hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/BlockCache.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
package org.apache.hadoop.hbase.io.hfile;
1919

2020
import java.util.Iterator;
21+
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Optional;
24+
import org.apache.hadoop.hbase.regionserver.HStoreFile;
2325
import org.apache.yetus.audience.InterfaceAudience;
2426

2527
/**
@@ -170,4 +172,18 @@ default boolean isMetaBlock(BlockType blockType) {
170172
default Optional<Map<String, Boolean>> getFullyCachedFiles() {
171173
return Optional.empty();
172174
}
175+
176+
/**
177+
* Returns the list of files with stale blocks in cache.
178+
*/
179+
default List<HStoreFile> getFilesWithStaleBlocks() {
180+
return null;
181+
}
182+
183+
/**
184+
* Clean cache by evicting files with stale blocks in cache.
185+
*/
186+
default Map<String, Integer> cleanCacheByRemovingStaleBlocks(){
187+
return null;
188+
}
173189
}

hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
package org.apache.hadoop.hbase.io.hfile;
1919

2020
import java.util.Iterator;
21+
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Optional;
2324
import org.apache.hadoop.hbase.io.HeapSize;
2425
import org.apache.hadoop.hbase.io.hfile.bucket.BucketCache;
26+
import org.apache.hadoop.hbase.regionserver.HStoreFile;
2527
import org.apache.yetus.audience.InterfaceAudience;
2628

2729
/**
@@ -392,6 +394,16 @@ public Optional<Map<String, Boolean>> getFullyCachedFiles() {
392394
return this.l2Cache.getFullyCachedFiles();
393395
}
394396

397+
@Override
398+
public List<HStoreFile> getFilesWithStaleBlocks() {
399+
return l2Cache.getFilesWithStaleBlocks();
400+
}
401+
402+
@Override
403+
public Map<String, Integer> cleanCacheByRemovingStaleBlocks() {
404+
return l2Cache.cleanCacheByRemovingStaleBlocks();
405+
}
406+
395407
@Override
396408
public void setMaxSize(long size) {
397409
this.l1Cache.setMaxSize(size);

hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.nio.ByteBuffer;
2727
import java.util.ArrayList;
2828
import java.util.Comparator;
29+
import java.util.HashMap;
2930
import java.util.HashSet;
3031
import java.util.Iterator;
3132
import java.util.List;
@@ -73,6 +74,9 @@
7374
import org.apache.hadoop.hbase.nio.ByteBuff;
7475
import org.apache.hadoop.hbase.nio.RefCnt;
7576
import org.apache.hadoop.hbase.protobuf.ProtobufMagic;
77+
import org.apache.hadoop.hbase.regionserver.HRegion;
78+
import org.apache.hadoop.hbase.regionserver.HStore;
79+
import org.apache.hadoop.hbase.regionserver.HStoreFile;
7680
import org.apache.hadoop.hbase.util.Bytes;
7781
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
7882
import org.apache.hadoop.hbase.util.IdReadWriteLock;
@@ -156,6 +160,8 @@ public class BucketCache implements BlockCache, HeapSize {
156160

157161
private BucketCachePersister cachePersister;
158162

163+
private static List<HStoreFile> filesWithStaleBlocks = new ArrayList<>();
164+
159165
/**
160166
* Flag if the cache is enabled or not... We shut it off if there are IO errors for some time, so
161167
* that Bucket IO exceptions/errors don't bring down the HBase server.
@@ -1985,4 +1991,28 @@ public static Optional<BucketCache> getBucketCacheFromCacheConfig(CacheConfig ca
19851991
return Optional.empty();
19861992
}
19871993

1994+
@Override
1995+
public List<HStoreFile> getFilesWithStaleBlocks() {
1996+
return filesWithStaleBlocks;
1997+
}
1998+
1999+
public static void clearFilesWithStaleBlocks() {
2000+
filesWithStaleBlocks.clear();
2001+
}
2002+
2003+
public void setFilesWithStaleBlocks(HRegion hRegion) {
2004+
for (HStore hs : hRegion.getStores()) {
2005+
filesWithStaleBlocks.addAll(hs.getStorefiles());
2006+
}
2007+
}
2008+
2009+
@Override
2010+
public Map<String, Integer> cleanCacheByRemovingStaleBlocks() {
2011+
Map<String, Integer> evictedFilesWithStaleBlocks = new HashMap<>();
2012+
for (HStoreFile hsf : filesWithStaleBlocks) {
2013+
evictedFilesWithStaleBlocks.put(hsf.getPath().getName(), evictBlocksByHfileName(hsf.getPath().getName()));
2014+
}
2015+
return evictedFilesWithStaleBlocks;
2016+
}
2017+
19882018
}

0 commit comments

Comments
 (0)