This is an automated email from the ASF dual-hosted git repository.
haxiaolin pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new 7ae6be7 HBASE-26872 Load rate calculator for cost functions should be
more precise (#4253)
7ae6be7 is described below
commit 7ae6be7c250a4cb26eaa5e8523335c7cd53a3052
Author: Xiaolin Ha <[email protected]>
AuthorDate: Sun Mar 27 11:12:00 2022 +0800
HBASE-26872 Load rate calculator for cost functions should be more precise
(#4253)
Signed-off-by: Bryan Beaudreault <[email protected]>
Signed-off-by: Viraj Jasani<[email protected]>
---
.../balancer/CostFromRegionLoadAsRateFunction.java | 4 ++--
.../balancer/TestStochasticLoadBalancer.java | 28 ++++++++++++++++++++--
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java
index 88af49e..e6d0cf8 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFromRegionLoadAsRateFunction.java
@@ -42,9 +42,9 @@ abstract class CostFromRegionLoadAsRateFunction extends
CostFromRegionLoadFuncti
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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
index 9f9ac84..bd80e15 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java
@@ -23,7 +23,6 @@ import static org.junit.Assert.assertNull;
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.List;
@@ -50,7 +49,6 @@ import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
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 })
@@ -450,6 +448,32 @@ public class TestStochasticLoadBalancer extends
BalancerTestBase {
}
@Test
+ public void testRegionLoadCostWhenDecrease() {
+ List<BalancerRegionLoad> regionLoads = new ArrayList<>();
+ // test region loads of [1,2,1,4]
+ for (int i = 1; i < 5; i++) {
+ int load = i == 3 ? 1 : 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;
int numRegions = 20;