You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ja...@apache.org on 2023/12/20 00:32:48 UTC
(pinot) branch master updated: Fix rebalancer converge check to ensure EV is converged before reporting success (#12182)
This is an automated email from the ASF dual-hosted git repository.
jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new fade75bf4e Fix rebalancer converge check to ensure EV is converged before reporting success (#12182)
fade75bf4e is described below
commit fade75bf4e114a824ed6c1559ee103e51e1de9f7
Author: Xiaotian (Jackie) Jiang <17...@users.noreply.github.com>
AuthorDate: Tue Dec 19 16:32:42 2023 -0800
Fix rebalancer converge check to ensure EV is converged before reporting success (#12182)
---
.../core/assignment/segment/SegmentAssignmentUtils.java | 8 ++++----
.../controller/helix/core/rebalance/TableRebalancer.java | 12 ++++++++----
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/assignment/segment/SegmentAssignmentUtils.java b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/assignment/segment/SegmentAssignmentUtils.java
index 228a4fb264..52f736a555 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/assignment/segment/SegmentAssignmentUtils.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/assignment/segment/SegmentAssignmentUtils.java
@@ -292,16 +292,16 @@ public class SegmentAssignmentUtils {
return numSegmentsToBeMovedPerInstance;
}
- public static Set<String> getSegmentsToMove(Map<String, Map<String, String>> oldAssignment,
+ public static List<String> getSegmentsToMove(Map<String, Map<String, String>> oldAssignment,
Map<String, Map<String, String>> newAssignment) {
- Set<String> result = new HashSet<>();
+ List<String> segmentsToMove = new ArrayList<>();
for (Map.Entry<String, Map<String, String>> entry : newAssignment.entrySet()) {
String segmentName = entry.getKey();
if (!entry.getValue().equals(oldAssignment.get(segmentName))) {
- result.add(segmentName);
+ segmentsToMove.add(segmentName);
}
}
- return result;
+ return segmentsToMove;
}
/**
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
index 318d251bfc..5c3514fa7e 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/rebalance/TableRebalancer.java
@@ -23,6 +23,7 @@ import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -336,7 +337,7 @@ public class TableRebalancer {
// current instances as this is the best we can do, and can help the table get out of this state.
// 2. Only check the segments to be moved because we don't need to maintain available replicas for segments not
// being moved, including segments with all replicas OFFLINE (error segments during consumption).
- Set<String> segmentsToMove = SegmentAssignmentUtils.getSegmentsToMove(currentAssignment, targetAssignment);
+ List<String> segmentsToMove = SegmentAssignmentUtils.getSegmentsToMove(currentAssignment, targetAssignment);
int numReplicas = Integer.MAX_VALUE;
for (String segment : segmentsToMove) {
@@ -379,12 +380,15 @@ public class TableRebalancer {
// 5. Update the IdealState to the next assignment. If the IdealState changes before the update, go back to step 1.
while (true) {
// Wait for ExternalView to converge before updating the next IdealState
+ // NOTE: Monitor the segments to be moved from both the previous round and this round to ensure the moved segments
+ // in the previous round are also converged.
+ Set<String> segmentsToMonitor = new HashSet<>(segmentsToMove);
segmentsToMove = SegmentAssignmentUtils.getSegmentsToMove(currentAssignment, targetAssignment);
+ segmentsToMonitor.addAll(segmentsToMove);
IdealState idealState;
try {
- idealState =
- waitForExternalViewToConverge(tableNameWithType, bestEfforts, segmentsToMove, externalViewCheckIntervalInMs,
- externalViewStabilizationTimeoutInMs);
+ idealState = waitForExternalViewToConverge(tableNameWithType, bestEfforts, segmentsToMonitor,
+ externalViewCheckIntervalInMs, externalViewStabilizationTimeoutInMs);
} catch (Exception e) {
String errorMsg = String.format(
"For rebalanceId: %s, caught exception while waiting for ExternalView to converge for table: %s, "
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org