From a2d00719104e334f8dc897f05add79c4bd63f71e Mon Sep 17 00:00:00 2001 From: haxiaolin Date: Mon, 21 Mar 2022 12:15:02 +0800 Subject: [PATCH 1/2] HBASE-26872 Load rate calculator for cost functions should be more precise --- .../CostFromRegionLoadAsRateFunction.java | 4 +-- .../balancer/TestStochasticLoadBalancer.java | 27 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java index 88af49e1a06b..e6d0cf831749 100644 --- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java +++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java @@ -42,9 +42,9 @@ protected double getRegionLoadCost(Collection regionLoadList double cost = 0; do { double current = getCostFromRl(iter.next()); - cost += current - previous; + cost += current >= previous ? current - previous : current; previous = current; } while (iter.hasNext()); return Math.max(0, cost / (regionLoadList.size() - 1)); } -} \ No newline at end of file +} diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java index 9ad080b1a3d4..3ae2c62ef17f 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java @@ -23,7 +23,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -51,7 +50,6 @@ import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; - import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils; @Category({ MasterTests.class, MediumTests.class }) @@ -519,6 +517,31 @@ public void testRegionLoadCost() { assertEquals(2.5, result, 0.01); } + @Test + public void testRegionLoadCostWhenDecrease() { + List regionLoads = new ArrayList<>(); + for (int i = 1; i < 5; i++) { + int load = i == 3 ? 0 : i; + BalancerRegionLoad regionLoad = mock(BalancerRegionLoad.class); + when(regionLoad.getReadRequestsCount()).thenReturn((long)load); + when(regionLoad.getCpRequestsCount()).thenReturn((long)load); + regionLoads.add(regionLoad); + } + + Configuration conf = HBaseConfiguration.create(); + ReadRequestCostFunction readCostFunction = + new ReadRequestCostFunction(conf); + double rateResult = readCostFunction.getRegionLoadCost(regionLoads); + // read requests are treated as a rate so the average rate here is simply 1 + assertEquals(1.67, rateResult, 0.01); + + CPRequestCostFunction cpCostFunction = + new CPRequestCostFunction(conf); + rateResult = cpCostFunction.getRegionLoadCost(regionLoads); + // coprocessor requests are treated as a rate so the average rate here is simply 1 + assertEquals(1.67, rateResult, 0.01); + } + @Test public void testLosingRs() throws Exception { int numNodes = 3; From b09010303dcbb1faf1feaccbd316e8bed8002e25 Mon Sep 17 00:00:00 2001 From: haxiaolin Date: Fri, 25 Mar 2022 14:40:49 +0800 Subject: [PATCH 2/2] update the testcase --- .../hbase/master/balancer/TestStochasticLoadBalancer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java index 3ae2c62ef17f..2f862cda65f1 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java @@ -520,8 +520,9 @@ public void testRegionLoadCost() { @Test public void testRegionLoadCostWhenDecrease() { List regionLoads = new ArrayList<>(); + // test region loads of [1,2,1,4] for (int i = 1; i < 5; i++) { - int load = i == 3 ? 0 : i; + int load = i == 3 ? 1 : i; BalancerRegionLoad regionLoad = mock(BalancerRegionLoad.class); when(regionLoad.getReadRequestsCount()).thenReturn((long)load); when(regionLoad.getCpRequestsCount()).thenReturn((long)load);