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

kturner pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/main by this push:
     new a9e5ab7fb8 fixes chaotic balancer IT (#5596)
a9e5ab7fb8 is described below

commit a9e5ab7fb8b7efa0e40e120928af57539bd5f0b2
Author: Keith Turner <ktur...@apache.org>
AuthorDate: Fri May 30 17:08:10 2025 -0400

    fixes chaotic balancer IT (#5596)
    
    When assigning the root tablet after other tablets were assigned, the
    getAssignment function in ChaoticLoadBalancer would never return an
    assignment. This would cause the test to hang until it timed out.  Not
    sure what the intention of the code was, but made it do something
    different that would always eventually yield an assignment.
---
 .../apache/accumulo/test/ChaoticLoadBalancer.java  | 35 +++++++---------------
 .../accumulo/test/ChaoticLoadBalancerTest.java     | 20 +++++++++----
 2 files changed, 25 insertions(+), 30 deletions(-)

diff --git 
a/test/src/main/java/org/apache/accumulo/test/ChaoticLoadBalancer.java 
b/test/src/main/java/org/apache/accumulo/test/ChaoticLoadBalancer.java
index 6a921791f4..fc149e6860 100644
--- a/test/src/main/java/org/apache/accumulo/test/ChaoticLoadBalancer.java
+++ b/test/src/main/java/org/apache/accumulo/test/ChaoticLoadBalancer.java
@@ -21,6 +21,7 @@ package org.apache.accumulo.test;
 import static org.apache.accumulo.core.util.LazySingletons.RANDOM;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -66,37 +67,23 @@ public class ChaoticLoadBalancer implements TabletBalancer {
 
   @Override
   public void getAssignments(AssignmentParameters params) {
-    long total = params.unassignedTablets().size();
-    long avg = (long) Math.ceil(((double) total) / 
params.currentStatus().size());
-    Map<TabletServerId,Long> toAssign = new HashMap<>();
-    List<TabletServerId> tServerArray = new ArrayList<>();
-    for (Entry<TabletServerId,TServerStatus> e : 
params.currentStatus().entrySet()) {
-      long numTablets = 0;
-      for (TableStatistics ti : e.getValue().getTableMap().values()) {
-        numTablets += ti.getTabletCount();
-      }
-      if (numTablets <= avg) {
-        tServerArray.add(e.getKey());
-        toAssign.put(e.getKey(), avg - numTablets);
-      }
+
+    List<TabletId> tabletsToAssign = new 
ArrayList<>(params.unassignedTablets().keySet());
+    if (tabletsToAssign.size() > 1) {
+      Collections.shuffle(tabletsToAssign);
+      int index = RANDOM.get().nextInt(tabletsToAssign.size()) + 1;
+      tabletsToAssign = tabletsToAssign.subList(0, index);
     }
 
+    List<TabletServerId> tServerArray = new 
ArrayList<>(params.currentStatus().keySet());
+
     if (tServerArray.isEmpty()) {
-      // No tservers to assign to
       return;
     }
 
-    for (TabletId tabletId : params.unassignedTablets().keySet()) {
+    for (TabletId tabletId : tabletsToAssign) {
       int index = RANDOM.get().nextInt(tServerArray.size());
-      TabletServerId dest = tServerArray.get(index);
-      params.addAssignment(tabletId, dest);
-      long remaining = toAssign.get(dest) - 1;
-      if (remaining == 0) {
-        tServerArray.remove(index);
-        toAssign.remove(dest);
-      } else {
-        toAssign.put(dest, remaining);
-      }
+      params.addAssignment(tabletId, tServerArray.get(index));
     }
   }
 
diff --git 
a/test/src/test/java/org/apache/accumulo/test/ChaoticLoadBalancerTest.java 
b/test/src/test/java/org/apache/accumulo/test/ChaoticLoadBalancerTest.java
index ace5c02eda..f39c38fbb8 100644
--- a/test/src/test/java/org/apache/accumulo/test/ChaoticLoadBalancerTest.java
+++ b/test/src/test/java/org/apache/accumulo/test/ChaoticLoadBalancerTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.accumulo.test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -117,11 +117,19 @@ public class ChaoticLoadBalancerTest {
     TestChaoticLoadBalancer balancer = new TestChaoticLoadBalancer();
 
     Map<TabletId,TabletServerId> assignments = new HashMap<>();
-    balancer.getAssignments(new AssignmentParamsImpl(getAssignments(servers),
-        Map.of(Constants.DEFAULT_RESOURCE_GROUP_NAME, servers.keySet()), 
metadataTable,
-        assignments));
-
-    assertEquals(assignments.size(), metadataTable.size());
+    Map<TabletId,TabletServerId> unassigned = new HashMap<>(metadataTable);
+
+    while (!unassigned.isEmpty()) {
+      balancer.getAssignments(new AssignmentParamsImpl(getAssignments(servers),
+          Map.of(Constants.DEFAULT_RESOURCE_GROUP_NAME, servers.keySet()), 
unassigned,
+          assignments));
+      assignments.forEach((tablet, tserver) -> {
+        servers.get(tserver).tablets.add(tablet);
+        assertTrue(unassigned.containsKey(tablet));
+        unassigned.remove(tablet);
+      });
+      assignments.clear();
+    }
   }
 
   SortedMap<TabletServerId,TServerStatus> 
getAssignments(Map<TabletServerId,FakeTServer> servers) {

Reply via email to