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);

Reply via email to