Skip to content

Commit f14c60c

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

File tree

17 files changed

+335
-0
lines changed

17 files changed

+335
-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 that are no longer served by
2657+
* the RegionServer.
2658+
*/
2659+
Map<String, Integer> uncacheStaleBlocks(ServerName serverName) throws IOException;
26542660
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,4 +1136,13 @@ 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 Cache by evicting the blocks of files belonging to regions that are no longer served by
1142+
* the RegionServer.
1143+
*/
1144+
@Override
1145+
public Map<String, Integer> uncacheStaleBlocks(ServerName serverName) throws IOException {
1146+
return get(admin.uncacheStaleBlocks(serverName));
1147+
}
11391148
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,4 +1861,10 @@ 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 Cache by evicting the blocks of files belonging to regions that are no longer served by
1867+
* the RegionServer.
1868+
*/
1869+
CompletableFuture<Map<String, Integer>> uncacheStaleBlocks(ServerName serverName);
18641870
}

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>> uncacheStaleBlocks(ServerName serverName) {
1011+
return wrap(rawAdmin.uncacheStaleBlocks(serverName));
1012+
}
10081013
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@
144144
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterResponse;
145145
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest;
146146
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerResponse;
147+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksRequest;
148+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksResponse;
147149
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationRequest;
148150
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateConfigurationResponse;
149151
import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
@@ -4537,4 +4539,19 @@ List<String>> adminCall(controller, stub, request.build(),
45374539
resp -> resp.getCachedFilesList()))
45384540
.serverName(serverName).call();
45394541
}
4542+
4543+
/**
4544+
* Clean Cache by evicting the blocks of files belonging to regions that are no longer served by
4545+
* the RegionServer.
4546+
*/
4547+
@Override
4548+
public CompletableFuture<Map<String, Integer>> uncacheStaleBlocks(ServerName serverName) {
4549+
UncacheStaleBlocksRequest.Builder request = UncacheStaleBlocksRequest.newBuilder();
4550+
return this.<Map<String, Integer>> newAdminCaller()
4551+
.action((controller, stub) -> this.<UncacheStaleBlocksRequest, UncacheStaleBlocksResponse,
4552+
Map<String, Integer>> adminCall(controller, stub, request.build(),
4553+
(s, c, req, done) -> s.uncacheStaleBlocks(c, req, done),
4554+
resp -> resp.getUncachedFilesMap()))
4555+
.serverName(serverName).call();
4556+
}
45404557
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@
166166
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetStoreFileResponse;
167167
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest;
168168
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ServerInfo;
169+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksRequest;
170+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksResponse;
169171
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest;
170172
import org.apache.hadoop.hbase.shaded.protobuf.generated.CellProtos;
171173
import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos;
@@ -1835,6 +1837,22 @@ public static List<String> getCachedFilesList(final RpcController controller,
18351837
return new ArrayList<>(response.getCachedFilesList());
18361838
}
18371839

1840+
/**
1841+
* Clean Cache by evicting the blocks of files belonging to regions that are no longer served by
1842+
* the RegionServer.
1843+
*/
1844+
public static Map<String, Integer> uncacheStaleBlocks(final RpcController controller,
1845+
final AdminService.BlockingInterface admin) throws IOException {
1846+
UncacheStaleBlocksRequest request = UncacheStaleBlocksRequest.newBuilder().build();
1847+
UncacheStaleBlocksResponse response = null;
1848+
try {
1849+
response = admin.uncacheStaleBlocks(controller, request);
1850+
} catch (ServiceException se) {
1851+
throw getRemoteException(se);
1852+
}
1853+
return response.getUncachedFilesMap();
1854+
}
1855+
18381856
/**
18391857
* Get the list of region info from a GetOnlineRegionResponse
18401858
* @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 UncacheStaleBlocksRequest {
340+
}
341+
342+
message UncacheStaleBlocksResponse {
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 UncacheStaleBlocks(UncacheStaleBlocksRequest)
427+
returns(UncacheStaleBlocksResponse);
428+
418429
}

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

Lines changed: 17 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,19 @@ 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 the blocks of files belonging to regions that are no longer served by
185+
* the RegionServer. Returns the map of filename and number of blocks evicted.
186+
*/
187+
default Optional<Map<String, Integer>> uncacheStaleBlocks() {
188+
return Optional.empty();
189+
}
173190
}

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>> uncacheStaleBlocks() {
447+
return l2Cache.uncacheStaleBlocks();
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: 31 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,29 @@ 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>> uncacheStaleBlocks() {
2011+
Map<String, Integer> evictedFilesWithStaleBlocks = new HashMap<>();
2012+
for (HStoreFile hsf : filesWithStaleBlocks) {
2013+
evictedFilesWithStaleBlocks.put(hsf.getPath().getName(),
2014+
evictBlocksByHfileName(hsf.getPath().getName()));
2015+
}
2016+
return Optional.of(evictedFilesWithStaleBlocks);
2017+
}
2018+
19882019
}

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
@@ -184,6 +184,8 @@
184184
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterResponse;
185185
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest;
186186
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerResponse;
187+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksRequest;
188+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksResponse;
187189
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest;
188190
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse;
189191
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WarmupRegionRequest;
@@ -3399,6 +3401,12 @@ public HBaseProtos.LogEntry getLogEntries(RpcController controller,
33993401
throw new ServiceException("Invalid request params");
34003402
}
34013403

3404+
@Override
3405+
public UncacheStaleBlocksResponse uncacheStaleBlocks(RpcController controller,
3406+
UncacheStaleBlocksRequest 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;
@@ -192,6 +193,8 @@
192193
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.RollWALWriterResponse;
193194
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerRequest;
194195
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.StopServerResponse;
196+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksRequest;
197+
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UncacheStaleBlocksResponse;
195198
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesRequest;
196199
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.UpdateFavoredNodesResponse;
197200
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WALEntry;
@@ -3946,4 +3949,16 @@ public GetCachedFilesListResponse getCachedFilesList(RpcController controller,
39463949
});
39473950
return responseBuilder.addAllCachedFiles(fullyCachedFiles).build();
39483951
}
3952+
3953+
@Override
3954+
public UncacheStaleBlocksResponse uncacheStaleBlocks(RpcController controller,
3955+
UncacheStaleBlocksRequest request) throws ServiceException {
3956+
UncacheStaleBlocksResponse.Builder responseBuilder = UncacheStaleBlocksResponse.newBuilder();
3957+
Map<String, Integer> evictedFilesWithStaleBlocks = new HashMap<>();
3958+
server.getBlockCache().flatMap(BlockCache::uncacheStaleBlocks)
3959+
.ifPresent(evictedFilesWithStaleBlocks::putAll);
3960+
responseBuilder.putAllUncachedFiles(evictedFilesWithStaleBlocks);
3961+
BucketCache.clearFilesWithStaleBlocks();
3962+
return responseBuilder.build();
3963+
}
39493964
}

0 commit comments

Comments
 (0)