This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 05f84a63139 HBASE-29014 The RegionServer metrics of WALs is incorrect
(#6510)
05f84a63139 is described below
commit 05f84a63139598d826edc59fbeeaab000e4041d4
Author: Peng Lu <[email protected]>
AuthorDate: Mon Dec 16 22:10:50 2024 +0800
HBASE-29014 The RegionServer metrics of WALs is incorrect (#6510)
Signed-off-by: Duo Zhang <[email protected]>
---
.../MetricsRegionServerWrapperImpl.java | 8 +++--
.../TestMetricsRegionServerAggregate.java | 38 ++++++++++++++++++++++
2 files changed, 44 insertions(+), 2 deletions(-)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java
index ef0ee71f7fd..5d1e51c11ec 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java
@@ -1005,10 +1005,14 @@ class MetricsRegionServerWrapperImpl implements
MetricsRegionServerWrapper {
aggregate = newVal;
List<WALProvider> providers =
regionServer.getWalFactory().getAllWALProviders();
+ long numWALFilesTmp = 0;
+ long walFileSizeTmp = 0;
for (WALProvider provider : providers) {
- numWALFiles += provider.getNumLogFiles();
- walFileSize += provider.getLogFileSize();
+ numWALFilesTmp += provider.getNumLogFiles();
+ walFileSizeTmp += provider.getLogFileSize();
}
+ numWALFiles = numWALFilesTmp;
+ walFileSize = walFileSizeTmp;
mobFileCacheAccessCount = mobFileCache != null ?
mobFileCache.getAccessCount() : 0L;
mobFileCacheMissCount = mobFileCache != null ?
mobFileCache.getMissCount() : 0L;
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServerAggregate.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServerAggregate.java
index 42841683387..3b63541758b 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServerAggregate.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServerAggregate.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;
import java.util.OptionalLong;
@@ -38,6 +39,7 @@ import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;
import org.apache.hadoop.hbase.wal.WALFactory;
+import org.apache.hadoop.hbase.wal.WALProvider;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
@@ -191,6 +193,42 @@ public class TestMetricsRegionServerAggregate {
}
}
+ @Test
+ public void testWalMetricsForRegionServer() throws InterruptedException {
+ long numLogFiles = 10;
+ long logFileSize = 10240;
+ String hostname = "foo";
+ Configuration conf = HBaseConfiguration.create();
+ conf.setLong(HConstants.REGIONSERVER_METRICS_PERIOD, 1000);
+
+ HRegionServer regionServer = mock(HRegionServer.class);
+ when(regionServer.getConfiguration()).thenReturn(conf);
+ RpcServerInterface rpcServer = mock(RpcServerInterface.class);
+ when(regionServer.getRpcServer()).thenReturn(rpcServer);
+ WALFactory walFactory = mock(WALFactory.class);
+ WALProvider walProvider = mock(WALProvider.class);
+ when(walProvider.getNumLogFiles()).thenReturn(numLogFiles);
+ when(walProvider.getLogFileSize()).thenReturn(logFileSize);
+ List<WALProvider> providers = new ArrayList<>();
+ providers.add(walProvider);
+ when(walFactory.getAllWALProviders()).thenReturn(providers);
+ when(regionServer.getWalFactory()).thenReturn(walFactory);
+ ServerName serverName = mock(ServerName.class);
+ when(serverName.getHostname()).thenReturn(hostname);
+ when(regionServer.getServerName()).thenReturn(serverName);
+
+ MetricsRegionServerWrapperImpl wrapper = new
MetricsRegionServerWrapperImpl(regionServer);
+ MetricsRegionServerWrapperImpl.RegionServerMetricsWrapperRunnable runnable
=
+ wrapper.new RegionServerMetricsWrapperRunnable();
+ runnable.run();
+ assertEquals(numLogFiles, wrapper.getNumWALFiles());
+ assertEquals(logFileSize, wrapper.getWALFileSize());
+
+ runnable.run();
+ assertEquals(numLogFiles, wrapper.getNumWALFiles());
+ assertEquals(logFileSize, wrapper.getWALFileSize());
+ }
+
private HRegion getMockedRegion(Answer defaultAnswer, String name, String
localOnHost,
boolean isPrimary, AtomicInteger storeFileCount) {
RegionInfo regionInfo = mock(RegionInfo.class);