This is an automated email from the ASF dual-hosted git repository.

capistrant pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 43383c7  refactor BalanceSegments#balanceServers to exit early if 
there is no work to be done  (#11768)
43383c7 is described below

commit 43383c73a84006d54022629475053b122994d4f0
Author: Lucas Capistrant <[email protected]>
AuthorDate: Mon Oct 25 10:06:35 2021 -0500

    refactor BalanceSegments#balanceServers to exit early if there is no work 
to be done  (#11768)
    
    * remove useless call to balanceServers for move from decom servers when 
there are no decom servers
    
    * refactor approach to this PR but accomplish the same thing
---
 .../server/coordinator/duty/BalanceSegments.java   | 10 ++++++++
 .../server/coordinator/BalanceSegmentsTest.java    | 27 ++++++++--------------
 2 files changed, 20 insertions(+), 17 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/duty/BalanceSegments.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/duty/BalanceSegments.java
index 218cf69..12de017 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/duty/BalanceSegments.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/duty/BalanceSegments.java
@@ -144,6 +144,8 @@ public class BalanceSegments implements CoordinatorDuty
     }
 
     final int maxSegmentsToMove = 
Math.min(params.getCoordinatorDynamicConfig().getMaxSegmentsToMove(), 
numSegments);
+
+    // Prioritize moving segments from decomissioning servers.
     int decommissioningMaxPercentOfMaxSegmentsToMove =
         
params.getCoordinatorDynamicConfig().getDecommissioningMaxPercentOfMaxSegmentsToMove();
     int maxSegmentsToMoveFromDecommissioningNodes =
@@ -155,6 +157,7 @@ public class BalanceSegments implements CoordinatorDuty
     Pair<Integer, Integer> decommissioningResult =
         balanceServers(params, decommissioningServers, activeServers, 
maxSegmentsToMoveFromDecommissioningNodes);
 
+    // After moving segments from decomissioning servers, move the remaining 
segments from the rest of the servers.
     int maxGeneralSegmentsToMove = maxSegmentsToMove - 
decommissioningResult.lhs;
     log.info("Processing %d segments for balancing between active servers", 
maxGeneralSegmentsToMove);
     Pair<Integer, Integer> generalResult =
@@ -184,6 +187,13 @@ public class BalanceSegments implements CoordinatorDuty
   )
   {
     if (maxSegmentsToMove <= 0) {
+      log.debug("maxSegmentsToMove is 0; no balancing work can be performed.");
+      return new Pair<>(0, 0);
+    } else if (toMoveFrom.isEmpty()) {
+      log.debug("toMoveFrom is empty; no balancing work can be performed.");
+      return new Pair<>(0, 0);
+    } else if (toMoveTo.isEmpty()) {
+      log.debug("toMoveTo is empty; no balancing work can be peformed.");
       return new Pair<>(0, 0);
     }
 
diff --git 
a/server/src/test/java/org/apache/druid/server/coordinator/BalanceSegmentsTest.java
 
b/server/src/test/java/org/apache/druid/server/coordinator/BalanceSegmentsTest.java
index 76b1104..0221a37 100644
--- 
a/server/src/test/java/org/apache/druid/server/coordinator/BalanceSegmentsTest.java
+++ 
b/server/src/test/java/org/apache/druid/server/coordinator/BalanceSegmentsTest.java
@@ -236,7 +236,7 @@ public class BalanceSegmentsTest
     EasyMock.expect(
         strategy.pickSegmentsToMove(
             ImmutableList.of(
-                new ServerHolder(druidServer2, peon2, false)
+                new ServerHolder(druidServer2, peon2, true)
             ),
             broadcastDatasources,
             1,
@@ -276,6 +276,7 @@ public class BalanceSegmentsTest
         .build();
 
     params = new BalanceSegmentsTester(coordinator).run(params);
+    EasyMock.verify(strategy);
     Assert.assertEquals(3L, 
params.getCoordinatorStats().getTieredStat("movedCount", "normal"));
     Assert.assertThat(
         peon3.getSegmentsToLoad(),
@@ -316,9 +317,8 @@ public class BalanceSegmentsTest
     mockCoordinator(coordinator);
 
     BalancerStrategy strategy = EasyMock.createMock(BalancerStrategy.class);
-    EasyMock.expect(strategy.pickSegmentsToMove(EasyMock.anyObject(), 
EasyMock.anyObject(), EasyMock.anyInt(), EasyMock.anyInt()))
-            .andReturn(ImmutableList.of(new 
BalancerSegmentHolder(druidServer1, segment1)).iterator());
-    EasyMock.expect(strategy.pickSegmentsToMove(EasyMock.anyObject(), 
EasyMock.anyObject(), EasyMock.anyInt(), EasyMock.anyInt()))
+    EasyMock.expect(
+        strategy.pickSegmentsToMove(EasyMock.anyObject(), 
EasyMock.anyObject(), EasyMock.anyInt(), EasyMock.anyInt()))
             .andReturn(
                 ImmutableList.of(
                     new BalancerSegmentHolder(druidServer1, segment2),
@@ -346,10 +346,11 @@ public class BalanceSegmentsTest
         .build();
 
     params = new BalanceSegmentsTester(coordinator).run(params);
+    EasyMock.verify(strategy);
     Assert.assertEquals(3L, 
params.getCoordinatorStats().getTieredStat("movedCount", "normal"));
     Assert.assertThat(
         peon3.getSegmentsToLoad(),
-        Matchers.is(Matchers.equalTo(ImmutableSet.of(segment1, segment2, 
segment3)))
+        Matchers.is(Matchers.equalTo(ImmutableSet.of(segment2, segment3, 
segment4)))
     );
   }
 
@@ -387,6 +388,7 @@ public class BalanceSegmentsTest
         .build();
 
     params = new BalanceSegmentsTester(coordinator).run(params);
+    EasyMock.verify(strategy);
     Assert.assertEquals(0, 
params.getCoordinatorStats().getTieredStat("movedCount", "normal"));
   }
 
@@ -422,6 +424,7 @@ public class BalanceSegmentsTest
         .build();
 
     params = new BalanceSegmentsTester(coordinator).run(params);
+    EasyMock.verify(strategy);
     Assert.assertEquals(1, 
params.getCoordinatorStats().getTieredStat("movedCount", "normal"));
     Assert.assertEquals(0, peon1.getNumberOfSegmentsInQueue());
     Assert.assertEquals(1, peon2.getNumberOfSegmentsInQueue());
@@ -564,18 +567,7 @@ public class BalanceSegmentsTest
 
     BalancerStrategy strategy = EasyMock.createMock(BalancerStrategy.class);
 
-    // The first call for decommissioning servers
-    EasyMock.expect(
-        strategy.pickSegmentsToMove(
-            ImmutableList.of(),
-            broadcastDatasources,
-            1,
-            40
-        )
-    )
-            .andReturn(Collections.emptyIterator());
-
-    // The second call for the single non decommissioning server move
+    // Move from non-decomissioning servers
     EasyMock.expect(
         strategy.pickSegmentsToMove(
             ImmutableList.of(
@@ -611,6 +603,7 @@ public class BalanceSegmentsTest
         .build();
 
     params = new BalanceSegmentsTester(coordinator).run(params);
+    EasyMock.verify(strategy);
     Assert.assertEquals(1L, 
params.getCoordinatorStats().getTieredStat("movedCount", "normal"));
     Assert.assertThat(
         peon3.getSegmentsToLoad(),

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to