diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index e3c56b4df8f8..053db7115690 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -52,8 +52,8 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -2403,6 +2403,8 @@ public void move(final byte[] encodedRegionName, byte[] destServerName) throws I TransitRegionStateProcedure proc = this.assignmentManager.createMoveRegionProcedure(rp.getRegionInfo(), rp.getDestination()); + CompletableFuture completableFuture = new CompletableFuture<>(); + proc.setCompletableFuture(completableFuture); if (conf.getBoolean(WARMUP_BEFORE_MOVE, DEFAULT_WARMUP_BEFORE_MOVE)) { // Warmup the region on the destination before initiating the move. // A region server could reject the close request because it either does not @@ -2412,11 +2414,10 @@ public void move(final byte[] encodedRegionName, byte[] destServerName) throws I warmUpRegion(rp.getDestination(), hri); } LOG.info(getClientIdAuditPrefix() + " move " + rp + ", running balancer"); - Future future = ProcedureSyncWait.submitProcedure(this.procedureExecutor, proc); + ProcedureSyncWait.submitProcedure(this.procedureExecutor, proc); try { // Is this going to work? Will we throw exception on error? - // TODO: CompletableFuture rather than this stunted Future. - future.get(); + completableFuture.get(); } catch (InterruptedException | ExecutionException e) { throw new HBaseIOException(e); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java index e1952964a2ae..d9f58702cf5f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java @@ -144,6 +144,8 @@ public class TransitRegionStateProcedure private CompletableFuture future; + private CompletableFuture completableFuture; + public TransitRegionStateProcedure() { } @@ -747,4 +749,16 @@ public static TransitRegionStateProcedure move(MasterProcedureEnv env, RegionInf return setOwner(env, new TransitRegionStateProcedure(env, region, targetServer, targetServer == null, TransitionType.MOVE)); } + + @Override + protected void completionCleanup(MasterProcedureEnv env) { + if (null != completableFuture) { + completableFuture.complete("done"); + } + } + + public void setCompletableFuture(CompletableFuture completableFuture) { + this.completableFuture = completableFuture; + } + }