From 89124e9b1586aaa550ab9f578b8f65172cf651b4 Mon Sep 17 00:00:00 2001 From: jcheng422 Date: Thu, 27 Nov 2025 17:29:00 -0500 Subject: [PATCH 1/2] HBASE-29735 Fix miscalculated timeoutInSeconds when using MoveWithAck --- .../apache/hadoop/hbase/util/RegionMover.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java index c1f98edd75ab..b3312d875490 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java @@ -115,6 +115,7 @@ public class RegionMover extends AbstractHBaseTool implements Closeable { private Connection conn; private Admin admin; private RackManager rackManager; + private int maxRetries; private RegionMover(RegionMoverBuilder builder) throws IOException { this.hostname = builder.hostname; @@ -146,6 +147,8 @@ private RegionMover(RegionMoverBuilder builder) throws IOException { // provided as @InterfaceAudience.Private and it is commented that this is just // to be used by unit test. rackManager = builder.rackManager == null ? new RackManager(conf) : builder.rackManager; + this.maxRetries = admin.getConfiguration() + .getInt(RegionMover.MOVE_RETRIES_MAX_KEY, RegionMover.DEFAULT_MOVE_RETRIES_MAX); } private RegionMover() { @@ -396,8 +399,14 @@ private void loadRegions(List regionsToMove) throws Exception { } moveRegionsPool.shutdown(); + // Calculate timeout based on acknowledge mode. In ack mode, account for retry attempts since + // MoveWithAck retries failed moves up to MOVE_RETRIES_MAX_KEY times. In no-ack mode, each + // region move is attempted only once. Timeout = regions * wait_per_region * retries + int retries = (ack) ? maxRetries : 1; long timeoutInSeconds = regionsToMove.size() - * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX); + * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) + * retries; + waitMoveTasksToFinish(moveRegionsPool, taskList, timeoutInSeconds); } @@ -682,8 +691,14 @@ private void submitRegionMovesWhileUnloading(ServerName server, List serverIndex = (serverIndex + 1) % regionServers.size(); } moveRegionsPool.shutdown(); + // Calculate timeout based on acknowledge mode. In ack mode, account for retry attempts since + // MoveWithAck retries failed moves up to MOVE_RETRIES_MAX_KEY times. In no-ack mode, each + // region move is attempted only once. Timeout = regions * wait_per_region * retries + int retries = (ack || forceMoveRegionByAck) ? maxRetries : 1; long timeoutInSeconds = regionsToMove.size() - * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX); + * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) + * retries; + waitMoveTasksToFinish(moveRegionsPool, taskList, timeoutInSeconds); } From ae470c1974d0db30f545dd1b35b75bb2b950fad4 Mon Sep 17 00:00:00 2001 From: jc100102 Date: Fri, 5 Dec 2025 22:19:15 -0500 Subject: [PATCH 2/2] HBASE-29735 Fix formatting of RegionMover.java per Spotless --- .../java/org/apache/hadoop/hbase/util/RegionMover.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java index b3312d875490..2f3bee39eda3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionMover.java @@ -147,8 +147,8 @@ private RegionMover(RegionMoverBuilder builder) throws IOException { // provided as @InterfaceAudience.Private and it is commented that this is just // to be used by unit test. rackManager = builder.rackManager == null ? new RackManager(conf) : builder.rackManager; - this.maxRetries = admin.getConfiguration() - .getInt(RegionMover.MOVE_RETRIES_MAX_KEY, RegionMover.DEFAULT_MOVE_RETRIES_MAX); + this.maxRetries = admin.getConfiguration().getInt(RegionMover.MOVE_RETRIES_MAX_KEY, + RegionMover.DEFAULT_MOVE_RETRIES_MAX); } private RegionMover() { @@ -404,8 +404,7 @@ private void loadRegions(List regionsToMove) throws Exception { // region move is attempted only once. Timeout = regions * wait_per_region * retries int retries = (ack) ? maxRetries : 1; long timeoutInSeconds = regionsToMove.size() - * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) - * retries; + * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) * retries; waitMoveTasksToFinish(moveRegionsPool, taskList, timeoutInSeconds); } @@ -696,8 +695,7 @@ private void submitRegionMovesWhileUnloading(ServerName server, List // region move is attempted only once. Timeout = regions * wait_per_region * retries int retries = (ack || forceMoveRegionByAck) ? maxRetries : 1; long timeoutInSeconds = regionsToMove.size() - * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) - * retries; + * admin.getConfiguration().getLong(MOVE_WAIT_MAX_KEY, DEFAULT_MOVE_WAIT_MAX) * retries; waitMoveTasksToFinish(moveRegionsPool, taskList, timeoutInSeconds); }