diff --git a/server/src/main/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculator.java b/server/src/main/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculator.java index d8846740a738..01c7da44c116 100644 --- a/server/src/main/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculator.java +++ b/server/src/main/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculator.java @@ -42,7 +42,7 @@ public class SegmentToMoveCalculator { /** * At least this number of segments must be picked for moving in every cycle - * to keep the cluster well balanced. + * to keep the cluster well-balanced. */ private static final int MIN_SEGMENTS_TO_MOVE = 100; @@ -150,7 +150,7 @@ public static int computeMaxSegmentsToMovePerTier( int maxComputationsInThousands = (numBalancerThreads * num30sPeriods) << 20; int maxSegmentsToMove = (maxComputationsInThousands / totalSegments) * 1000; - if (upperBound < lowerBound) { + if (upperBound < lowerBound || maxSegmentsToMove < lowerBound) { return Math.min(lowerBound, totalSegments); } else { return Math.min(maxSegmentsToMove, upperBound); diff --git a/server/src/test/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculatorTest.java b/server/src/test/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculatorTest.java index b5b06afa709f..249e9638d89e 100644 --- a/server/src/test/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculatorTest.java +++ b/server/src/test/java/org/apache/druid/server/coordinator/balancer/SegmentToMoveCalculatorTest.java @@ -83,6 +83,10 @@ public void testMaxSegmentsToMove1Thread() @Test public void testMaxSegmentsToMoveIncreasesWithCoordinatorPeriod() { + Assert.assertEquals(100, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(0))); + Assert.assertEquals(100, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(10_000))); + Assert.assertEquals(100, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(20_000))); + Assert.assertEquals(5_000, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(30_000))); Assert.assertEquals(10_000, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(60_000))); Assert.assertEquals(15_000, computeMaxSegmentsToMoveInPeriod(200_000, Duration.millis(90_000)));