From 2c43398d49480d747fb98535d359bac20e458915 Mon Sep 17 00:00:00 2001 From: Guangxu Cheng Date: Thu, 30 Nov 2017 00:32:25 +0800 Subject: [PATCH] HBASE-19000 Group multiple block cache clear requests per server --- .../org/apache/hadoop/hbase/client/HBaseAdmin.java | 23 +++++++++++++--------- .../hbase/shaded/protobuf/RequestConverter.java | 12 +++++++---- .../hadoop/hbase/regionserver/RSRpcServices.java | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) 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 1a00efe134..faacb30616 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 @@ -1460,29 +1460,34 @@ public class HBaseAdmin implements Admin { CacheEvictionStatsBuilder cacheEvictionStats = CacheEvictionStats.builder(); List> pairs = MetaTableAccessor.getTableRegionsAndLocations(connection, tableName); - for (Pair pair: pairs) { - if (pair.getFirst().isOffline() || pair.getSecond() == null) { - continue; - } + + Map> regionInfoByServerName = + pairs.stream() + .filter(pair -> !(pair.getFirst().isOffline())) + .filter(pair -> pair.getSecond() != null) + .collect(Collectors.groupingBy(pair -> pair.getSecond(), + Collectors.mapping(pair -> pair.getFirst(), Collectors.toList()))); + + for (Map.Entry> entry : regionInfoByServerName.entrySet()) { try { cacheEvictionStats = cacheEvictionStats.append( - clearBlockCache(pair.getSecond(), pair.getFirst())); + clearBlockCache(entry.getKey(), entry.getValue())); } catch (NotServingRegionException e) { if (LOG.isDebugEnabled()) { - LOG.debug("Failed to clear block cache for " + pair.getFirst() + " on " + - pair.getSecond() + ": " + StringUtils.stringifyException(e)); + LOG.debug("Failed to clear block cache for " + entry.getKey() + " on " + + entry.getValue() + ": " + StringUtils.stringifyException(e)); } } } return cacheEvictionStats.build(); } - private CacheEvictionStats clearBlockCache(final ServerName sn, final RegionInfo hri) + private CacheEvictionStats clearBlockCache(final ServerName sn, final List hris) throws IOException { HBaseRpcController controller = rpcControllerFactory.newController(); AdminService.BlockingInterface admin = this.connection.getAdmin(sn); ClearRegionBlockCacheRequest request = - RequestConverter.buildClearRegionBlockCacheRequest(hri.getRegionName()); + RequestConverter.buildClearRegionBlockCacheRequest(hris); try { return ProtobufUtil.toCacheEvictionStats( admin.clearRegionBlockCache(controller, request).getStats()); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java index 039a5b2fc7..913f1109ac 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java @@ -1507,10 +1507,14 @@ public final class RequestConverter { * * @return a ClearRegionBlockCacheRequest */ - public static ClearRegionBlockCacheRequest buildClearRegionBlockCacheRequest(final byte[] - regionName) { - RegionSpecifier region = buildRegionSpecifier(RegionSpecifierType.REGION_NAME, regionName); - return ClearRegionBlockCacheRequest.newBuilder().addAllRegion(Lists.newArrayList(region)).build(); + public static ClearRegionBlockCacheRequest + buildClearRegionBlockCacheRequest(List hris) { + ClearRegionBlockCacheRequest.Builder builder = ClearRegionBlockCacheRequest.newBuilder(); + hris.forEach( + hri -> builder.addRegion( + buildRegionSpecifier(RegionSpecifierType.REGION_NAME, hri.getRegionName()) + )); + return builder.build(); } /** 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 3f2dd271ad..bd276b671d 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 @@ -3430,7 +3430,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, @Override public ClearRegionBlockCacheResponse clearRegionBlockCache(RpcController controller, - ClearRegionBlockCacheRequest request) + ClearRegionBlockCacheRequest request) throws ServiceException { CacheEvictionStatsBuilder stats = CacheEvictionStats.builder(); try { -- 2.13.0