From f92680fcf8900ea979cbe1d2b6b483bcbe5989af Mon Sep 17 00:00:00 2001 From: Joseph Hwang Date: Fri, 29 Jul 2016 13:21:50 -0700 Subject: [PATCH] Addendum HBASE-16209 Added in a ExponentialBackOffPolicy so that we spread out the timing of open region retries in AssignmentManager. --- .../hadoop/hbase/master/AssignmentManager.java | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 73b8a5e..5c59591 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -3408,23 +3408,39 @@ public class AssignmentManager extends ZooKeeperListener { return true; } - void invokeAssign(HRegionInfo regionInfo) { - invokeAssign(regionInfo, true); + void invokeAssignNow(HRegionInfo regionInfo, boolean forceNewPlan) { + threadPoolExecutorService.submit(new AssignCallable(this, regionInfo, forceNewPlan)); + } + + void invokeAssignLater(HRegionInfo regionInfo, boolean forceNewPlan, long sleepMillis) { + scheduledThreadPoolExecutor.schedule(new DelayedAssignCallable(new AssignCallable(this, + regionInfo, forceNewPlan)), sleepMillis, TimeUnit.MILLISECONDS); } - public void invokeAssign(HRegionInfo regionInfo, boolean newPlan) { - threadPoolExecutorService.submit(new AssignCallable(this, regionInfo, newPlan)); + public void invokeAssign(HRegionInfo regionInfo) { + invokeAssign(regionInfo, true); } - public void invokeAssignLater(HRegionInfo regionInfo, long sleepMillis) { - scheduledThreadPoolExecutor.schedule(new DelayedAssignCallable( - new AssignCallable(this, regionInfo, true)), sleepMillis, TimeUnit.MILLISECONDS); + public void invokeAssign(HRegionInfo regionInfo, boolean forceNewPlan) { + if (failedOpenTracker.contains(regionInfo.getRegionName())) { + // Sleep before reassigning if this region has failed to open before + long sleepTime = backoffPolicy.getBackoffTime(retryConfig, + getFailedAttempts(regionInfo.getEncodedName())); + invokeAssignLater(regionInfo, forceNewPlan, sleepTime); + } else { + // Immediately reassign if this region has never failed an open before + invokeAssignNow(regionInfo, forceNewPlan); + } } - public void invokeAssignLaterOnFailure(HRegionInfo regionInfo) { - long sleepTime = backoffPolicy.getBackoffTime(retryConfig, - failedOpenTracker.get(regionInfo.getEncodedName()).get()); - invokeAssignLater(regionInfo, sleepTime); + private int getFailedAttempts(String regionName) { + AtomicInteger failedCount = failedOpenTracker.get(regionName); + if (failedCount != null) { + return failedCount.get(); + } else { + // If we do not have a failed open tracker for a region assume it has never failed before + return 0; + } } void invokeUnAssign(HRegionInfo regionInfo) { @@ -3738,10 +3754,7 @@ public class AssignmentManager extends ZooKeeperListener { } catch (HBaseIOException e) { LOG.warn("Failed to get region plan", e); } - // Have the current thread sleep a bit before resubmitting the RPC request - long sleepTime = backoffPolicy.getBackoffTime(retryConfig, - failedOpenTracker.get(encodedName).get()); - invokeAssignLater(hri, sleepTime); + invokeAssign(hri, false); } } } -- 2.8.0-rc2