This is an automated email from the ASF dual-hosted git repository.

junegunn 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 c4020c94f4d HBASE-28985 Fix memStoreSize metric for a table and add 
heap and off-heap size metrics (#6486)
c4020c94f4d is described below

commit c4020c94f4d8a68ea7a8f06c47c6388bb726259a
Author: Junegunn Choi <[email protected]>
AuthorDate: Tue Feb 24 01:51:33 2026 +0900

    HBASE-28985 Fix memStoreSize metric for a table and add heap and off-heap 
size metrics (#6486)
    
    Signed-off-by: Duo Zhang <[email protected]>
---
 .../regionserver/MetricsRegionSourceImpl.java      |  8 +++++++
 .../hbase/regionserver/MetricsRegionWrapper.java   | 10 ++++++++
 .../hbase/regionserver/MetricsTableSourceImpl.java |  8 +++++++
 .../regionserver/MetricsTableWrapperAggregate.java | 10 ++++++++
 .../regionserver/MetricsTableWrapperStub.java      | 10 ++++++++
 .../regionserver/TestMetricsRegionSourceImpl.java  | 10 ++++++++
 .../regionserver/MetricsRegionWrapperImpl.java     | 21 +++++++++++++++-
 .../MetricsTableWrapperAggregateImpl.java          | 28 ++++++++++++++++++++--
 .../regionserver/MetricsRegionWrapperStub.java     | 10 ++++++++
 .../hbase/regionserver/TestMetricsRegion.java      |  6 +++++
 .../regionserver/TestMetricsTableAggregate.java    |  2 ++
 11 files changed, 120 insertions(+), 3 deletions(-)

diff --git 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
index 391849cae66..f9cafa12494 100644
--- 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
+++ 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
@@ -215,6 +215,14 @@ public class MetricsRegionSourceImpl implements 
MetricsRegionSource {
         this.regionWrapper.getMaxCompactedStoreFileRefCount());
       mrb.addGauge(Interns.info(regionNamePrefix + 
MetricsRegionServerSource.MEMSTORE_SIZE,
         MetricsRegionServerSource.MEMSTORE_SIZE_DESC), 
this.regionWrapper.getMemStoreSize());
+      mrb.addGauge(
+        Interns.info(regionNamePrefix + 
MetricsRegionServerSource.MEMSTORE_HEAP_SIZE,
+          MetricsRegionServerSource.MEMSTORE_HEAP_SIZE_DESC),
+        this.regionWrapper.getMemStoreHeapSize());
+      mrb.addGauge(
+        Interns.info(regionNamePrefix + 
MetricsRegionServerSource.MEMSTORE_OFFHEAP_SIZE,
+          MetricsRegionServerSource.MEMSTORE_OFFHEAP_SIZE_DESC),
+        this.regionWrapper.getMemStoreOffHeapSize());
       mrb.addGauge(
         Interns.info(regionNamePrefix + 
MetricsRegionServerSource.MAX_STORE_FILE_AGE,
           MetricsRegionServerSource.MAX_STORE_FILE_AGE_DESC),
diff --git 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java
 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java
index 8908d73d729..66cbd47a66a 100644
--- 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java
+++ 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapper.java
@@ -60,6 +60,16 @@ public interface MetricsRegionWrapper {
    */
   long getMemStoreSize();
 
+  /**
+   * Get the size of the on heap memstore of this region
+   */
+  long getMemStoreHeapSize();
+
+  /**
+   * Get the size of the off heap memstore of this region
+   */
+  long getMemStoreOffHeapSize();
+
   /**
    * Get the total size of the store files this region server is serving from.
    */
diff --git 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
index b5f8db3738b..1565c8d639d 100644
--- 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
+++ 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
@@ -298,6 +298,14 @@ public class MetricsTableSourceImpl implements 
MetricsTableSource {
           Interns.info(tableNamePrefix + 
MetricsRegionServerSource.MEMSTORE_SIZE,
             MetricsRegionServerSource.MEMSTORE_SIZE_DESC),
           tableWrapperAgg.getMemStoreSize(tableName.getNameAsString()));
+        mrb.addGauge(
+          Interns.info(tableNamePrefix + 
MetricsRegionServerSource.MEMSTORE_HEAP_SIZE,
+            MetricsRegionServerSource.MEMSTORE_HEAP_SIZE_DESC),
+          tableWrapperAgg.getMemStoreHeapSize(tableName.getNameAsString()));
+        mrb.addGauge(
+          Interns.info(tableNamePrefix + 
MetricsRegionServerSource.MEMSTORE_OFFHEAP_SIZE,
+            MetricsRegionServerSource.MEMSTORE_OFFHEAP_SIZE_DESC),
+          tableWrapperAgg.getMemStoreOffHeapSize(tableName.getNameAsString()));
         mrb.addGauge(
           Interns.info(tableNamePrefix + 
MetricsRegionServerSource.STOREFILE_COUNT,
             MetricsRegionServerSource.STOREFILE_COUNT_DESC),
diff --git 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java
 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java
index 558049868ce..86d6e9454d0 100644
--- 
a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java
+++ 
b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java
@@ -58,6 +58,16 @@ public interface MetricsTableWrapperAggregate {
    */
   long getMemStoreSize(String table);
 
+  /**
+   * Get the size of the on heap memstore of this table
+   */
+  long getMemStoreHeapSize(String table);
+
+  /**
+   * Get the size of the off heap memstore of this table
+   */
+  long getMemStoreOffHeapSize(String table);
+
   /**
    * Get the store file size against this table
    */
diff --git 
a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java
 
b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java
index 702096f852b..97ca56f6176 100644
--- 
a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java
+++ 
b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java
@@ -53,6 +53,16 @@ public class MetricsTableWrapperStub implements 
MetricsTableWrapperAggregate {
     return 1000;
   }
 
+  @Override
+  public long getMemStoreHeapSize(String table) {
+    return 1001;
+  }
+
+  @Override
+  public long getMemStoreOffHeapSize(String table) {
+    return 1002;
+  }
+
   @Override
   public long getStoreFileSize(String table) {
     return 2000;
diff --git 
a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java
 
b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java
index 38725c09c58..d586434888d 100644
--- 
a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java
+++ 
b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java
@@ -111,6 +111,16 @@ public class TestMetricsRegionSourceImpl {
       return 0;
     }
 
+    @Override
+    public long getMemStoreHeapSize() {
+      return 0;
+    }
+
+    @Override
+    public long getMemStoreOffHeapSize() {
+      return 0;
+    }
+
     @Override
     public long getStoreFileSize() {
       return 0;
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java
index c635f2950bc..81ed1849fca 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.java
@@ -51,6 +51,8 @@ public class MetricsRegionWrapperImpl implements 
MetricsRegionWrapper, Closeable
   private long storeRefCount;
   private long maxCompactedStoreFileRefCount;
   private long memstoreSize;
+  private long memstoreHeapSize;
+  private long memstoreOffHeapSize;
   private long storeFileSize;
   private long maxStoreFileAge;
   private long minStoreFileAge;
@@ -121,6 +123,16 @@ public class MetricsRegionWrapperImpl implements 
MetricsRegionWrapper, Closeable
     return memstoreSize;
   }
 
+  @Override
+  public long getMemStoreHeapSize() {
+    return memstoreHeapSize;
+  }
+
+  @Override
+  public long getMemStoreOffHeapSize() {
+    return memstoreOffHeapSize;
+  }
+
   @Override
   public long getStoreFileSize() {
     return storeFileSize;
@@ -260,6 +272,8 @@ public class MetricsRegionWrapperImpl implements 
MetricsRegionWrapper, Closeable
       int tempStoreRefCount = 0;
       int tempMaxCompactedStoreFileRefCount = 0;
       long tempMemstoreSize = 0;
+      long tempMemstoreHeapSize = 0;
+      long tempMemstoreOffHeapSize = 0;
       long tempStoreFileSize = 0;
       long tempMaxStoreFileAge = 0;
       long tempMinStoreFileAge = Long.MAX_VALUE;
@@ -276,7 +290,10 @@ public class MetricsRegionWrapperImpl implements 
MetricsRegionWrapper, Closeable
           int currentMaxCompactedStoreFileRefCount = 
store.getMaxCompactedStoreFileRefCount();
           tempMaxCompactedStoreFileRefCount =
             Math.max(tempMaxCompactedStoreFileRefCount, 
currentMaxCompactedStoreFileRefCount);
-          tempMemstoreSize += store.getMemStoreSize().getDataSize();
+          final MemStoreSize memStore = store.getMemStoreSize();
+          tempMemstoreSize += memStore.getDataSize();
+          tempMemstoreHeapSize += memStore.getHeapSize();
+          tempMemstoreOffHeapSize += memStore.getOffHeapSize();
           tempStoreFileSize += store.getStorefilesSize();
           OptionalLong storeMaxStoreFileAge = store.getMaxStoreFileAge();
           if (
@@ -337,6 +354,8 @@ public class MetricsRegionWrapperImpl implements 
MetricsRegionWrapper, Closeable
       storeRefCount = tempStoreRefCount;
       maxCompactedStoreFileRefCount = tempMaxCompactedStoreFileRefCount;
       memstoreSize = tempMemstoreSize;
+      memstoreHeapSize = tempMemstoreHeapSize;
+      memstoreOffHeapSize = tempMemstoreOffHeapSize;
       storeFileSize = tempStoreFileSize;
       maxStoreFileAge = tempMaxStoreFileAge;
       if (tempMinStoreFileAge != Long.MAX_VALUE) {
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java
index fe085cbcbe5..e726437efaa 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java
@@ -76,8 +76,10 @@ public class MetricsTableWrapperAggregateImpl implements 
MetricsTableWrapperAggr
 
             mt.storeFileCount += store.getStorefilesCount();
             mt.maxStoreFileCount = Math.max(mt.maxStoreFileCount, 
store.getStorefilesCount());
-            mt.memstoreSize += (store.getMemStoreSize().getDataSize()
-              + store.getMemStoreSize().getHeapSize() + 
store.getMemStoreSize().getOffHeapSize());
+            final MemStoreSize memstoreSize = store.getMemStoreSize();
+            mt.memstoreSize += memstoreSize.getDataSize();
+            mt.memstoreHeapSize += memstoreSize.getHeapSize();
+            mt.memstoreOffHeapSize += memstoreSize.getOffHeapSize();
             mt.storeFileSize += store.getStorefilesSize();
             mt.referenceFileCount += store.getNumReferenceFiles();
             if (store.getMaxStoreFileAge().isPresent()) {
@@ -226,6 +228,26 @@ public class MetricsTableWrapperAggregateImpl implements 
MetricsTableWrapperAggr
     }
   }
 
+  @Override
+  public long getMemStoreHeapSize(String table) {
+    MetricsTableValues metricsTable = 
metricsTableMap.get(TableName.valueOf(table));
+    if (metricsTable == null) {
+      return 0;
+    } else {
+      return metricsTable.memstoreHeapSize;
+    }
+  }
+
+  @Override
+  public long getMemStoreOffHeapSize(String table) {
+    MetricsTableValues metricsTable = 
metricsTableMap.get(TableName.valueOf(table));
+    if (metricsTable == null) {
+      return 0;
+    } else {
+      return metricsTable.memstoreOffHeapSize;
+    }
+  }
+
   @Override
   public long getStoreFileSize(String table) {
     MetricsTableValues metricsTable = 
metricsTableMap.get(TableName.valueOf(table));
@@ -399,6 +421,8 @@ public class MetricsTableWrapperAggregateImpl implements 
MetricsTableWrapperAggr
     long filteredReadRequestCount;
     long writeRequestCount;
     long memstoreSize;
+    long memstoreHeapSize;
+    long memstoreOffHeapSize;
     long regionCount;
     long storeCount;
     long storeFileCount;
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java
index 9db7777f981..9c9a5e9dc9c 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperStub.java
@@ -77,6 +77,16 @@ public class MetricsRegionWrapperStub implements 
MetricsRegionWrapper {
     return 103;
   }
 
+  @Override
+  public long getMemStoreHeapSize() {
+    return 104;
+  }
+
+  @Override
+  public long getMemStoreOffHeapSize() {
+    return 105;
+  }
+
   @Override
   public long getStoreFileSize() {
     return 104;
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java
index d6be20bd38c..382aed2ea94 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java
@@ -62,6 +62,12 @@ public class TestMetricsRegion {
     HELPER.assertGauge(
       
"namespace_TestNS_table_MetricsRegionWrapperStub_region_DEADBEEF001_metric_memstoreSize",
 103,
       agg);
+    HELPER.assertGauge(
+      
"namespace_TestNS_table_MetricsRegionWrapperStub_region_DEADBEEF001_metric_memstoreHeapSize",
+      104, agg);
+    HELPER.assertGauge(
+      
"namespace_TestNS_table_MetricsRegionWrapperStub_region_DEADBEEF001_metric_memstoreOffHeapSize",
+      105, agg);
     HELPER.assertCounter(
       
"namespace_TestNS_table_MetricsRegionWrapperStub_region_DEADBEEF001_metric_cpRequestCount",
       108, agg);
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java
index 4fc4e76d860..bd01808e6bb 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java
@@ -85,6 +85,8 @@ public class TestMetricsTableAggregate {
   @Test
   public void testRegionAndStoreMetrics() throws IOException {
     HELPER.assertGauge(pre + "memstoreSize", 1000, agg);
+    HELPER.assertGauge(pre + "memstoreHeapSize", 1001, agg);
+    HELPER.assertGauge(pre + "memstoreOffHeapSize", 1002, agg);
     HELPER.assertGauge(pre + "storeFileSize", 2000, agg);
     HELPER.assertGauge(pre + "tableSize", 3000, agg);
 

Reply via email to