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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new 736e19902 [#4427]able to disable both consumer and provider zone-aware 
(#4429)
736e19902 is described below

commit 736e199027f8446f7cab9a931e7b821b42db66c3
Author: liubao68 <[email protected]>
AuthorDate: Sat Jul 27 10:45:59 2024 +0800

    [#4427]able to disable both consumer and provider zone-aware (#4429)
---
 .../filter/ZoneAwareDiscoveryFilter.java           | 17 +++--
 .../loadbalance/TestLoadBalanceFilter2.java        |  2 +
 .../filter/TestZoneAwareDiscoveryFilter.java       | 73 ++++++++++++++++++++++
 3 files changed, 88 insertions(+), 4 deletions(-)

diff --git 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
index b1e76dc6b..a669cd15e 100644
--- 
a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
+++ 
b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/ZoneAwareDiscoveryFilter.java
@@ -38,6 +38,8 @@ public class ZoneAwareDiscoveryFilter extends 
AbstractGroupDiscoveryFilter {
 
   public static final String CONFIG_RATIO = 
"servicecomb.loadbalance.filter.zoneaware.ratio";
 
+  public static final String CONFIG_RATIO_CEILING = 
"servicecomb.loadbalance.filter.zoneaware.ratioCeiling";
+
   private DataCenterProperties dataCenterProperties;
 
   @Autowired
@@ -62,6 +64,11 @@ public class ZoneAwareDiscoveryFilter extends 
AbstractGroupDiscoveryFilter {
         int.class, 30);
   }
 
+  private int getRatioCeiling() {
+    return environment.getProperty(CONFIG_RATIO_CEILING,
+        int.class, 70);
+  }
+
   @Override
   protected String contextParameter() {
     return PARAMETER;
@@ -97,8 +104,9 @@ public class ZoneAwareDiscoveryFilter extends 
AbstractGroupDiscoveryFilter {
     }
 
     int ratio = getRatio();
+    int ratioCeiling = getRatioCeiling();
 
-    if (hasEnoughMembers(instances.size(), instancesRegionAndAZMatch.size(), 
ratio)) {
+    if (hasEnoughMembers(instances.size(), instancesRegionAndAZMatch.size(), 
ratio, ratioCeiling)) {
       parent.child(GROUP_PREFIX + groups, new DiscoveryTreeNode()
           .subName(parent, GROUP_PREFIX + 
groups).data(instancesRegionAndAZMatch));
       groups++;
@@ -106,7 +114,7 @@ public class ZoneAwareDiscoveryFilter extends 
AbstractGroupDiscoveryFilter {
       instancesAZMatch.addAll(instancesRegionAndAZMatch);
     }
 
-    if (hasEnoughMembers(instances.size(), instancesAZMatch.size(), ratio)) {
+    if (hasEnoughMembers(instances.size(), instancesAZMatch.size(), ratio, 
ratioCeiling)) {
       parent.child(GROUP_PREFIX + groups, new DiscoveryTreeNode()
           .subName(parent, GROUP_PREFIX + groups).data(instancesAZMatch));
       groups++;
@@ -120,11 +128,12 @@ public class ZoneAwareDiscoveryFilter extends 
AbstractGroupDiscoveryFilter {
     parent.attribute(GROUP_SIZE, groups);
   }
 
-  private boolean hasEnoughMembers(int totalSize, int groupSize, int ratio) {
+  private boolean hasEnoughMembers(int totalSize, int groupSize, int ratio, 
int ratioCeiling) {
     if (totalSize == 0 || groupSize == 0) {
       return false;
     }
-    return Math.floorDiv(groupSize * 100, totalSize) >= ratio;
+    int actual = Math.floorDiv(groupSize * 100, totalSize);
+    return actual >= ratio && actual <= ratioCeiling;
   }
 
   private boolean regionAndAZMatch(StatefulDiscoveryInstance target) {
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceFilter2.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceFilter2.java
index ef6ef509a..4eef1d8d6 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceFilter2.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceFilter2.java
@@ -64,6 +64,8 @@ public class TestLoadBalanceFilter2 {
         Boolean.class, true)).thenReturn(true);
     
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratio",
         int.class, 30)).thenReturn(0);
+    
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratioCeiling",
+        int.class, 70)).thenReturn(100);
   }
 
   @Test
diff --git 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestZoneAwareDiscoveryFilter.java
 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestZoneAwareDiscoveryFilter.java
index cd32f3ae3..ebb96ba73 100644
--- 
a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestZoneAwareDiscoveryFilter.java
+++ 
b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/filter/TestZoneAwareDiscoveryFilter.java
@@ -45,6 +45,8 @@ public class TestZoneAwareDiscoveryFilter {
   public void test_not_enough_instance() {
     
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratio",
         int.class, 30)).thenReturn(50);
+    
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratioCeiling",
+        int.class, 70)).thenReturn(70);
 
     ZoneAwareDiscoveryFilter filter = new ZoneAwareDiscoveryFilter();
     filter.setEnvironment(environment);
@@ -108,4 +110,75 @@ public class TestZoneAwareDiscoveryFilter {
     Assertions.assertEquals("regionMatchInstance", 
resultData.get(0).getInstanceId());
     Assertions.assertEquals("allmatchInstance", 
resultData.get(1).getInstanceId());
   }
+
+  @Test
+  public void test_not_enough_instance_both_ceiling_floor() {
+    
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratio",
+        int.class, 30)).thenReturn(40);
+    
Mockito.when(environment.getProperty("servicecomb.loadbalance.filter.zoneaware.ratioCeiling",
+        int.class, 70)).thenReturn(60);
+
+    ZoneAwareDiscoveryFilter filter = new ZoneAwareDiscoveryFilter();
+    filter.setEnvironment(environment);
+
+    // set up data
+    DataCenterProperties myself = new DataCenterProperties();
+    myself.setName("test");
+    myself.setRegion("test-Region");
+    myself.setAvailableZone("test-zone");
+    filter.setDataCenterProperties(myself);
+
+    DiscoveryInstance discoveryInstance = 
Mockito.mock(DiscoveryInstance.class);
+    StatefulDiscoveryInstance allmatchInstance = new 
StatefulDiscoveryInstance(discoveryInstance);
+    DataCenterInfo info = new DataCenterInfo();
+    info.setName("test");
+    info.setRegion("test-Region");
+    info.setAvailableZone("test-zone");
+    List<String> allMatchEndpoint = new ArrayList<>();
+    allMatchEndpoint.add("rest://localhost:9090");
+    
Mockito.when(discoveryInstance.getEndpoints()).thenReturn(allMatchEndpoint);
+    Mockito.when(discoveryInstance.getDataCenterInfo()).thenReturn(info);
+    
Mockito.when(discoveryInstance.getInstanceId()).thenReturn("allmatchInstance");
+
+    DiscoveryInstance regionMatchDiscoveryInstance = 
Mockito.mock(DiscoveryInstance.class);
+    StatefulDiscoveryInstance regionMatchInstance = new 
StatefulDiscoveryInstance(regionMatchDiscoveryInstance);
+    DataCenterInfo regionMatchInfo = new DataCenterInfo();
+    regionMatchInfo.setName("test");
+    regionMatchInfo.setRegion("test-Region");
+    regionMatchInfo.setAvailableZone("test-zone2");
+    List<String> regionMatchEndpoint = new ArrayList<>();
+    regionMatchEndpoint.add("rest://localhost:9091");
+    
Mockito.when(regionMatchDiscoveryInstance.getEndpoints()).thenReturn(regionMatchEndpoint);
+    
Mockito.when(regionMatchDiscoveryInstance.getDataCenterInfo()).thenReturn(regionMatchInfo);
+    
Mockito.when(regionMatchDiscoveryInstance.getInstanceId()).thenReturn("regionMatchInstance");
+
+    DiscoveryInstance noneMatchDiscoveryInstance = 
Mockito.mock(DiscoveryInstance.class);
+    StatefulDiscoveryInstance noneMatchInstance = new 
StatefulDiscoveryInstance(noneMatchDiscoveryInstance);
+    DataCenterInfo noneMatchInfo = new DataCenterInfo();
+    noneMatchInfo.setName("test");
+    noneMatchInfo.setRegion("test-Region2");
+    noneMatchInfo.setAvailableZone("test-zone2");
+    List<String> noMatchEndpoint = new ArrayList<>();
+    noMatchEndpoint.add("rest://localhost:9092");
+    
Mockito.when(noneMatchDiscoveryInstance.getEndpoints()).thenReturn(noMatchEndpoint);
+    
Mockito.when(noneMatchDiscoveryInstance.getDataCenterInfo()).thenReturn(noneMatchInfo);
+    
Mockito.when(noneMatchDiscoveryInstance.getInstanceId()).thenReturn("noneMatchInstance");
+
+    // run test
+    List<StatefulDiscoveryInstance> data = Arrays.asList(allmatchInstance, 
regionMatchInstance, noneMatchInstance);
+    DiscoveryTreeNode parent = new 
DiscoveryTreeNode().name("parent").data(data);
+    DiscoveryContext context = new DiscoveryContext();
+    DiscoveryTreeNode result = filter.discovery(context, parent);
+
+    // check result
+    Integer level = context.getContextParameter(filter.contextParameter());
+    Integer groups = parent.attribute(filter.groupsSizeParameter());
+    List<StatefulDiscoveryInstance> resultData = result.data();
+    Assertions.assertEquals(null, level);
+    Assertions.assertEquals(1, groups);
+    Assertions.assertEquals(3, resultData.size());
+    Assertions.assertEquals("noneMatchInstance", 
resultData.get(0).getInstanceId());
+    Assertions.assertEquals("regionMatchInstance", 
resultData.get(1).getInstanceId());
+    Assertions.assertEquals("allmatchInstance", 
resultData.get(2).getInstanceId());
+  }
 }

Reply via email to