You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2024/07/27 02:46:04 UTC
(servicecomb-java-chassis) branch master updated: [#4427]able to disable both consumer and provider zone-aware (#4429)
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 <bi...@qq.com>
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());
+ }
}