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());
+ }
}