From 5286893ceda6c1f7b61c9fd22843a01a7c474f1f Mon Sep 17 00:00:00 2001 From: Mike Drob Date: Thu, 6 Sep 2018 16:16:45 -0500 Subject: [PATCH] HBASE-20786 Move initial locality computation to new thread --- .../hbase/master/balancer/BaseLoadBalancer.java | 6 +++--- .../master/balancer/RegionLocationFinder.java | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index 0f6e3489de..0995c48aca 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -1157,9 +1157,9 @@ public abstract class BaseLoadBalancer implements LoadBalancer { try { Set regions = services.getAssignmentManager().getRegionStates().getRegionAssignments().keySet(); - regionFinder.refreshAndWait(regions); - } catch (Exception e) { - LOG.warn("Refreshing region HDFS Block dist failed with exception, ignoring", e); + regionFinder.refresh(regions); + } catch (RuntimeException e) { + LOG.info("Refreshing region HDFS Block dist failed with exception, ignoring", e); } } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.java index fb7731fa75..6b2b76b9b6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.java @@ -25,7 +25,9 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.ClusterMetrics; @@ -69,22 +71,19 @@ class RegionLocationFinder { // Do not scheduleFullRefresh at master startup private long lastFullRefresh = EnvironmentEdgeManager.currentTime(); + private final ExecutorService refreshExecutor; + private CacheLoader loader = new CacheLoader() { @Override public ListenableFuture reload(final RegionInfo hri, - HDFSBlocksDistribution oldValue) throws Exception { - return executor.submit(new Callable() { - @Override - public HDFSBlocksDistribution call() throws Exception { - return internalGetTopBlockLocation(hri); - } - }); + HDFSBlocksDistribution oldValue) { + return executor.submit(() -> internalGetTopBlockLocation(hri)); } @Override - public HDFSBlocksDistribution load(RegionInfo key) throws Exception { + public HDFSBlocksDistribution load(RegionInfo key) { return internalGetTopBlockLocation(key); } }; @@ -101,6 +100,9 @@ class RegionLocationFinder { setDaemon(true) .setNameFormat("region-location-%d") .build())); + // Separate executor so that the refresh requests themselves don't starve + refreshExecutor = Executors.newSingleThreadExecutor( + new ThreadFactoryBuilder().setDaemon(true).setNameFormat("region-locator-refresh").build()); } /** @@ -320,6 +322,10 @@ class RegionLocationFinder { } } + public Future refresh(Collection hris) { + return refreshExecutor.submit(() -> refreshAndWait(hris)); + } + // For test LoadingCache getCache() { return cache; -- 2.16.1