You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by ji...@apache.org on 2019/10/28 22:33:05 UTC

[helix] 27/50: Improve ResourceTopStateAntiAffinityConstraint (#475)

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

jiajunwang pushed a commit to branch wagedRebalancer
in repository https://gitbox.apache.org/repos/asf/helix.git

commit b6322a544ea050eae2d14edbf9edcb4d0232fab3
Author: Yi Wang <i3...@gmail.com>
AuthorDate: Tue Sep 17 10:09:49 2019 -0700

    Improve ResourceTopStateAntiAffinityConstraint (#475)
    
    - fix the min max range to be [0,1]
    - add unit test for normalized score
---
 .../ResourceTopStateAntiAffinityConstraint.java    | 11 ++++++++--
 ...TestResourceTopStateAntiAffinityConstraint.java | 25 ++++++++++++++++++----
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ResourceTopStateAntiAffinityConstraint.java b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ResourceTopStateAntiAffinityConstraint.java
index b1e64b9..8681dc5 100644
--- a/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ResourceTopStateAntiAffinityConstraint.java
+++ b/helix-core/src/main/java/org/apache/helix/controller/rebalancer/waged/constraints/ResourceTopStateAntiAffinityConstraint.java
@@ -28,12 +28,19 @@ import org.apache.helix.controller.rebalancer.waged.model.ClusterContext;
  * The higher number the number of top state partitions assigned to the instance, the lower the
  * score, vice versa.
  */
-public class ResourceTopStateAntiAffinityConstraint extends SoftConstraint {
+class ResourceTopStateAntiAffinityConstraint extends SoftConstraint {
+  private static final float MAX_SCORE = 1f;
+  private static final float MIN_SCORE = 0f;
+
+  ResourceTopStateAntiAffinityConstraint() {
+    super(MAX_SCORE, MIN_SCORE);
+  }
+
   @Override
   protected float getAssignmentScore(AssignableNode node, AssignableReplica replica,
       ClusterContext clusterContext) {
     if (!replica.isReplicaTopState()) {
-      return (getMaxScore() + getMinScore()) / 2;
+      return (getMaxScore() + getMinScore()) / 2.0f;
     }
 
     int curTopPartitionCountForResource = node.getAssignedTopStatePartitionsCount();
diff --git a/helix-core/src/test/java/org/apache/helix/controller/rebalancer/waged/constraints/TestResourceTopStateAntiAffinityConstraint.java b/helix-core/src/test/java/org/apache/helix/controller/rebalancer/waged/constraints/TestResourceTopStateAntiAffinityConstraint.java
index 06ef537..c3414d4 100644
--- a/helix-core/src/test/java/org/apache/helix/controller/rebalancer/waged/constraints/TestResourceTopStateAntiAffinityConstraint.java
+++ b/helix-core/src/test/java/org/apache/helix/controller/rebalancer/waged/constraints/TestResourceTopStateAntiAffinityConstraint.java
@@ -27,20 +27,31 @@ import org.apache.helix.controller.rebalancer.waged.model.AssignableReplica;
 import org.apache.helix.controller.rebalancer.waged.model.ClusterContext;
 import org.mockito.Mockito;
 import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 public class TestResourceTopStateAntiAffinityConstraint {
-  private final AssignableReplica _testReplica = Mockito.mock(AssignableReplica.class);
-  private final AssignableNode _testNode = Mockito.mock(AssignableNode.class);
-  private final ClusterContext _clusterContext = Mockito.mock(ClusterContext.class);
+  private AssignableReplica _testReplica;
+  private AssignableNode _testNode;
+  private ClusterContext _clusterContext;
 
   private final SoftConstraint _constraint = new ResourceTopStateAntiAffinityConstraint();
 
+  @BeforeMethod
+  public void init() {
+    _testReplica = Mockito.mock(AssignableReplica.class);
+    _testNode = Mockito.mock(AssignableNode.class);
+    _clusterContext = Mockito.mock(ClusterContext.class);
+  }
+
   @Test
   public void testGetAssignmentScoreWhenReplicaNotTopState() {
     when(_testReplica.isReplicaTopState()).thenReturn(false);
     float score = _constraint.getAssignmentScore(_testNode, _testReplica, _clusterContext);
-    Assert.assertEquals(score, (_constraint.getMaxScore() + _constraint.getMinScore()) / 2);
+    float normalizedScore =
+        _constraint.getAssignmentNormalizedScore(_testNode, _testReplica, _clusterContext);
+    Assert.assertEquals(score, 0.5f);
+    Assert.assertEquals(normalizedScore, 0.5f);
     verifyZeroInteractions(_testNode);
     verifyZeroInteractions(_clusterContext);
   }
@@ -51,7 +62,10 @@ public class TestResourceTopStateAntiAffinityConstraint {
     when(_testNode.getAssignedTopStatePartitionsCount()).thenReturn(20);
     when(_clusterContext.getEstimatedMaxTopStateCount()).thenReturn(20);
     float score = _constraint.getAssignmentScore(_testNode, _testReplica, _clusterContext);
+    float normalizedScore =
+        _constraint.getAssignmentNormalizedScore(_testNode, _testReplica, _clusterContext);
     Assert.assertEquals(score, 0.5f);
+    Assert.assertEquals(normalizedScore, 0.5f);
   }
 
   @Test
@@ -60,6 +74,9 @@ public class TestResourceTopStateAntiAffinityConstraint {
     when(_testNode.getAssignedTopStatePartitionsCount()).thenReturn(0);
     when(_clusterContext.getEstimatedMaxTopStateCount()).thenReturn(20);
     float score = _constraint.getAssignmentScore(_testNode, _testReplica, _clusterContext);
+    float normalizedScore =
+        _constraint.getAssignmentNormalizedScore(_testNode, _testReplica, _clusterContext);
     Assert.assertEquals(score, 1f);
+    Assert.assertEquals(normalizedScore, 1f);
   }
 }