Skip to content

Commit dd72425

Browse files
committed
HBASE-27795: Define RPC API for cache cleaning
1 parent 23c4156 commit dd72425

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2651,4 +2651,10 @@ List<LogEntry> getLogEntries(Set<ServerName> serverNames, String logType, Server
26512651
* Get the list of cached files
26522652
*/
26532653
List<String> getCachedFilesList(ServerName serverName) throws IOException;
2654+
2655+
/**
2656+
* Clean Cache by evicting the blocks of files belonging to regions
2657+
* that are no longer served by the RegionServer.
2658+
*/
2659+
Map<String, Integer> cleanBucketCache(ServerName serverName) throws IOException;
26542660
}

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
@@ -1136,4 +1136,12 @@ public void flushMasterStore() throws IOException {
11361136
public List<String> getCachedFilesList(ServerName serverName) throws IOException {
11371137
return get(admin.getCachedFilesList(serverName));
11381138
}
1139+
1140+
/**
1141+
* Clean BucketCache
1142+
*/
1143+
@Override
1144+
public Map<String,Integer> cleanBucketCache(ServerName serverName) throws IOException {
1145+
return get(admin.cleanBucketCache(serverName));
1146+
}
11391147
}

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
@@ -1861,4 +1861,9 @@ CompletableFuture<List<LogEntry>> getLogEntries(Set<ServerName> serverNames, Str
18611861
* Get the list of cached files
18621862
*/
18631863
CompletableFuture<List<String>> getCachedFilesList(ServerName serverName);
1864+
1865+
/**
1866+
* Clean BucketCache
1867+
*/
1868+
CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName);
18641869
}

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
@@ -1005,4 +1005,9 @@ public CompletableFuture<Void> flushMasterStore() {
10051005
public CompletableFuture<List<String>> getCachedFilesList(ServerName serverName) {
10061006
return wrap(rawAdmin.getCachedFilesList(serverName));
10071007
}
1008+
1009+
@Override
1010+
public CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName) {
1011+
return wrap(rawAdmin.cleanBucketCache(serverName));
1012+
}
10081013
}

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;
@@ -4537,4 +4539,18 @@ List<String>> adminCall(controller, stub, request.build(),
45374539
resp -> resp.getCachedFilesList()))
45384540
.serverName(serverName).call();
45394541
}
4542+
4543+
/**
4544+
* Clean BucketCache
4545+
*/
4546+
@Override
4547+
public CompletableFuture<Map<String, Integer>> cleanBucketCache(ServerName serverName) {
4548+
CleanBucketCacheRequest.Builder request = CleanBucketCacheRequest.newBuilder();
4549+
return this.<Map<String, Integer>> newAdminCaller()
4550+
.action((controller, stub) -> this.<CleanBucketCacheRequest, CleanBucketCacheResponse,
4551+
Map<String, Integer>> adminCall(controller, stub, request.build(),
4552+
(s, c, req, done) -> s.cleanBucketCache(c, req, done),
4553+
resp -> resp.getUncachedFilesMap()))
4554+
.serverName(serverName).call();
4555+
}
45404556
}

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
@@ -152,6 +152,8 @@
152152

153153
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
154154
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
155+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheRequest;
156+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheResponse;
155157
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearSlowLogResponses;
156158
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest;
157159
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetCachedFilesListRequest;
@@ -1835,6 +1837,21 @@ public static List<String> getCachedFilesList(final RpcController controller,
18351837
return new ArrayList<>(response.getCachedFilesList());
18361838
}
18371839

1840+
/**
1841+
* Get the list of cached files
1842+
*/
1843+
public static Map<String, Integer> cleanBucketCache(final RpcController controller,
1844+
final AdminService.BlockingInterface admin) throws IOException {
1845+
CleanBucketCacheRequest request = CleanBucketCacheRequest.newBuilder().build();
1846+
CleanBucketCacheResponse response = null;
1847+
try {
1848+
response = admin.cleanBucketCache(controller, request);
1849+
} catch (ServiceException se) {
1850+
throw getRemoteException(se);
1851+
}
1852+
return response.getUncachedFilesMap();
1853+
}
1854+
18381855
/**
18391856
* Get the list of region info from a GetOnlineRegionResponse
18401857
* @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 Optional<List<HStoreFile>> getFilesWithStaleBlocks() {
180+
return Optional.empty();
181+
}
182+
183+
/**
184+
* Clean cache by evicting files with stale blocks in cache.
185+
*/
186+
default Optional<Map<String, Integer>> cleanCacheByRemovingStaleBlocks(){
187+
return Optional.empty();
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
import org.slf4j.Logger;
2729
import org.slf4j.LoggerFactory;
@@ -435,6 +437,16 @@ public Optional<Map<String, Boolean>> getFullyCachedFiles() {
435437
return this.l2Cache.getFullyCachedFiles();
436438
}
437439

440+
@Override
441+
public Optional<List<HStoreFile>> getFilesWithStaleBlocks() {
442+
return l2Cache.getFilesWithStaleBlocks();
443+
}
444+
445+
@Override
446+
public Optional<Map<String, Integer>> cleanCacheByRemovingStaleBlocks() {
447+
return l2Cache.cleanCacheByRemovingStaleBlocks();
448+
}
449+
438450
@Override
439451
public void setMaxSize(long size) {
440452
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 Optional<List<HStoreFile>> getFilesWithStaleBlocks() {
1996+
return Optional.of(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 Optional<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 Optional.of(evictedFilesWithStaleBlocks);
2016+
}
2017+
19882018
}

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeRequest;
151151
import org.apache.hadoop.hbase.shaded.protobuf.generated.AccessControlProtos.RevokeResponse;
152152
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
153+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheRequest;
154+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheResponse;
153155
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest;
154156
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;
155157
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest;
@@ -3399,6 +3401,12 @@ public HBaseProtos.LogEntry getLogEntries(RpcController controller,
33993401
throw new ServiceException("Invalid request params");
34003402
}
34013403

3404+
@Override
3405+
public CleanBucketCacheResponse cleanBucketCache(RpcController controller,
3406+
CleanBucketCacheRequest request) throws ServiceException {
3407+
throw new ServiceException(new DoNotRetryIOException("Unsupported method on master"));
3408+
}
3409+
34023410
private MasterProtos.BalancerDecisionsResponse
34033411
getBalancerDecisions(MasterProtos.BalancerDecisionsRequest request) {
34043412
final NamedQueueRecorder namedQueueRecorder = this.server.getNamedQueueRecorder();

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,6 +1652,7 @@ public Map<byte[], List<HStoreFile>> close(boolean abort, boolean ignoreStatus,
16521652
+ "so setting evict on close to false. ",
16531653
this.getRegionInfo().getRegionNameAsString());
16541654
this.getStores().forEach(s -> s.getCacheConfig().setEvictOnClose(false));
1655+
((BucketCache) l2).setFilesWithStaleBlocks(this);
16551656
}
16561657
}
16571658
}

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.apache.hadoop.hbase.exceptions.UnknownProtocolException;
8888
import org.apache.hadoop.hbase.io.ByteBuffAllocator;
8989
import org.apache.hadoop.hbase.io.hfile.BlockCache;
90+
import org.apache.hadoop.hbase.io.hfile.bucket.BucketCache;
9091
import org.apache.hadoop.hbase.ipc.HBaseRpcController;
9192
import org.apache.hadoop.hbase.ipc.PriorityFunction;
9293
import org.apache.hadoop.hbase.ipc.QosPriority;
@@ -155,6 +156,8 @@
155156
import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;
156157
import org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter;
157158
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.AdminService;
159+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheRequest;
160+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CleanBucketCacheResponse;
158161
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesRequest;
159162
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearCompactionQueuesResponse;
160163
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ClearRegionBlockCacheRequest;
@@ -3946,4 +3949,16 @@ public GetCachedFilesListResponse getCachedFilesList(RpcController controller,
39463949
});
39473950
return responseBuilder.addAllCachedFiles(fullyCachedFiles).build();
39483951
}
3952+
3953+
@Override
3954+
public CleanBucketCacheResponse cleanBucketCache(RpcController controller,
3955+
CleanBucketCacheRequest request) throws ServiceException {
3956+
CleanBucketCacheResponse.Builder responseBuilder = CleanBucketCacheResponse.newBuilder();
3957+
Map<String, Integer> evictedFilesWithStaleBlocks = new HashMap<>();
3958+
server.getBlockCache().flatMap(BlockCache::cleanCacheByRemovingStaleBlocks)
3959+
.ifPresent(evictedFilesWithStaleBlocks::putAll);
3960+
responseBuilder.putAllUncachedFiles(evictedFilesWithStaleBlocks);
3961+
BucketCache.clearFilesWithStaleBlocks();
3962+
return responseBuilder.build();
3963+
}
39493964
}

0 commit comments

Comments
 (0)