This is an automated email from the ASF dual-hosted git repository.
technoboy pushed a commit to branch branch-2.11
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.11 by this push:
new 8c59207c160 [fix][broker]fix arithmetic exception for
LeastResourceUsageWithWeight strategy (#17149)
8c59207c160 is described below
commit 8c59207c160a1c98a17f4a7b9b5c562494859f8a
Author: Qiang Huang <[email protected]>
AuthorDate: Wed Aug 24 11:23:32 2022 +0800
[fix][broker]fix arithmetic exception for LeastResourceUsageWithWeight
strategy (#17149)
---
.../impl/LeastResourceUsageWithWeight.java | 3 +-
.../ModularLoadManagerStrategyTest.java | 42 ++++++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LeastResourceUsageWithWeight.java
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LeastResourceUsageWithWeight.java
index 9493fefbad2..4763eaf23da 100644
---
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LeastResourceUsageWithWeight.java
+++
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/LeastResourceUsageWithWeight.java
@@ -39,6 +39,7 @@ import
org.apache.pulsar.policies.data.loadbalancer.LocalBrokerData;
*/
@Slf4j
public class LeastResourceUsageWithWeight implements
ModularLoadManagerStrategy {
+ private static final double MAX_RESOURCE_USAGE = 1.0d;
// Maintain this list to reduce object creation.
private final ArrayList<String> bestBrokers;
private final Map<String, Double> brokerAvgResourceUsageWithWeight;
@@ -144,7 +145,7 @@ public class LeastResourceUsageWithWeight implements
ModularLoadManagerStrategy
final double diffThreshold =
conf.getLoadBalancerAverageResourceUsageDifferenceThresholdPercentage() / 100.0;
candidates.forEach(broker -> {
- Double avgResUsage =
brokerAvgResourceUsageWithWeight.getOrDefault(broker, Double.MAX_VALUE);
+ Double avgResUsage =
brokerAvgResourceUsageWithWeight.getOrDefault(broker, MAX_RESOURCE_USAGE);
if ((avgResUsage + diffThreshold <= avgUsage)) {
bestBrokers.add(broker);
}
diff --git
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerStrategyTest.java
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerStrategyTest.java
index 7177e5369b6..e9b442698f9 100644
---
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerStrategyTest.java
+++
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/loadbalance/ModularLoadManagerStrategyTest.java
@@ -20,6 +20,8 @@ package org.apache.pulsar.broker.loadbalance;
import static org.testng.Assert.assertEquals;
+import java.lang.reflect.Field;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
@@ -131,6 +133,46 @@ public class ModularLoadManagerStrategyTest {
assertEquals(strategy.selectBroker(candidates, bundleData, loadData,
conf), Optional.of("2"));
}
+ public void testLeastResourceUsageWithWeightWithArithmeticException()
+ throws NoSuchFieldException, IllegalAccessException {
+ BundleData bundleData = new BundleData();
+ BrokerData brokerData1 = initBrokerData(10, 100);
+ BrokerData brokerData2 = initBrokerData(30, 100);
+ BrokerData brokerData3 = initBrokerData(60, 100);
+ BrokerData brokerData4 = initBrokerData(5, 100);
+ LoadData loadData = new LoadData();
+ Map<String, BrokerData> brokerDataMap = loadData.getBrokerData();
+ brokerDataMap.put("1", brokerData1);
+ brokerDataMap.put("2", brokerData2);
+ brokerDataMap.put("3", brokerData3);
+ brokerDataMap.put("4", brokerData4);
+
+ ServiceConfiguration conf = new ServiceConfiguration();
+ conf.setLoadBalancerCPUResourceWeight(1.0);
+ conf.setLoadBalancerMemoryResourceWeight(0.1);
+ conf.setLoadBalancerDirectMemoryResourceWeight(0.1);
+ conf.setLoadBalancerBandwithInResourceWeight(1.0);
+ conf.setLoadBalancerBandwithOutResourceWeight(1.0);
+ conf.setLoadBalancerHistoryResourcePercentage(0.5);
+
conf.setLoadBalancerAverageResourceUsageDifferenceThresholdPercentage(5);
+
+ LeastResourceUsageWithWeight strategy = new
LeastResourceUsageWithWeight();
+
+ // Should choice broker from broker1 2 3.
+ Set<String> candidates = new HashSet<>();
+ candidates.add("1");
+ candidates.add("2");
+ candidates.add("3");
+ Field strategyUpdater =
LeastResourceUsageWithWeight.class.getDeclaredField("brokerAvgResourceUsageWithWeight");
+ strategyUpdater.setAccessible(true);
+ Map<String, Double> brokerAvgResourceUsageWithWeight = new HashMap<>();
+ brokerAvgResourceUsageWithWeight.put("1", 0.1d);
+ brokerAvgResourceUsageWithWeight.put("2", 0.3d);
+ brokerAvgResourceUsageWithWeight.put("4", 0.05d);
+ strategyUpdater.set(strategy, brokerAvgResourceUsageWithWeight);
+ assertEquals(strategy.selectBroker(candidates, bundleData, loadData,
conf), Optional.of("1"));
+ }
+
private BrokerData initBrokerData(double usage, double limit) {
LocalBrokerData localBrokerData = new LocalBrokerData();
localBrokerData.setCpu(new ResourceUsage(usage, limit));