From e8d6c6ec1d575f4eefddd387b0487c10973733ac Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Mon, 22 Jun 2026 00:38:35 +0530 Subject: [PATCH 1/2] HBASE-30242 Add Region server level HFile Compression Metrics Co-authored-by: Opus 4.6 --- .../regionserver/MetricsRegionServerSource.java | 6 ++++++ .../MetricsRegionServerSourceImpl.java | 4 ++++ .../regionserver/MetricsRegionServerWrapper.java | 11 +++++++++++ .../MetricsRegionServerWrapperImpl.java | 16 ++++++++++++++++ .../MetricsRegionServerWrapperStub.java | 10 ++++++++++ .../regionserver/TestMetricsRegionServer.java | 2 ++ 6 files changed, 49 insertions(+) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index 1087ca3c60a0..b2934855a1bd 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -233,6 +233,8 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo String MEMSTORE_OFFHEAP_SIZE_DESC = "Off-heap Size of the memstore"; String STOREFILE_SIZE = "storeFileSize"; String STOREFILE_SIZE_GROWTH_RATE = "storeFileSizeGrowthRate"; + String STOREFILE_UNCOMPRESSED_SIZE = "storeFileUncompressedSize"; + String STOREFILE_COMPRESSION_RATIO = "storeFileCompressionRatio"; String MAX_STORE_FILE_AGE = "maxStoreFileAge"; String MIN_STORE_FILE_AGE = "minStoreFileAge"; String AVG_STORE_FILE_AGE = "avgStoreFileAge"; @@ -244,6 +246,10 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo String STOREFILE_SIZE_DESC = "Size of storefiles being served."; String STOREFILE_SIZE_GROWTH_RATE_DESC = "Bytes per second by which the size of storefiles being served grows."; + String STOREFILE_UNCOMPRESSED_SIZE_DESC = "Total uncompressed size of storefiles being served."; + String STOREFILE_COMPRESSION_RATIO_DESC = + "Compression ratio of storefiles (compressed/uncompressed). Lower values indicate better" + + " compression. Returns 1.0 when there is no data."; String TOTAL_REQUEST_COUNT = "totalRequestCount"; String TOTAL_REQUEST_COUNT_DESC = "Total number of requests this RegionServer has answered; increments the count once for " diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java index 07fd6f8b1ed3..ff4313a3df24 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java @@ -519,6 +519,10 @@ private MetricsRecordBuilder addGaugesToMetricsRecordBuilder(MetricsRecordBuilde .addGauge(Interns.info(MEMSTORE_OFFHEAP_SIZE, MEMSTORE_OFFHEAP_SIZE_DESC), rsWrap.getOffHeapMemStoreSize()) .addGauge(Interns.info(STOREFILE_SIZE, STOREFILE_SIZE_DESC), rsWrap.getStoreFileSize()) + .addGauge(Interns.info(STOREFILE_UNCOMPRESSED_SIZE, STOREFILE_UNCOMPRESSED_SIZE_DESC), + rsWrap.getStoreFileUncompressedSize()) + .addGauge(Interns.info(STOREFILE_COMPRESSION_RATIO, STOREFILE_COMPRESSION_RATIO_DESC), + rsWrap.getStoreFileCompressionRatio()) .addGauge(Interns.info(STOREFILE_SIZE_GROWTH_RATE, STOREFILE_SIZE_GROWTH_RATE_DESC), rsWrap.getStoreFileSizeGrowthRate()) .addGauge(Interns.info(MAX_STORE_FILE_AGE, MAX_STORE_FILE_AGE_DESC), diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java index 240c084b6837..854524e91635 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java @@ -116,6 +116,17 @@ public interface MetricsRegionServerWrapper { */ long getStoreFileSize(); + /** + * Get the total uncompressed size of the store files this region server is serving from. + */ + long getStoreFileUncompressedSize(); + + /** + * Get the compression ratio of store files on this region server. This is the ratio of compressed + * on-disk size to uncompressed data size. Returns 1.0 when there is no data. + */ + double getStoreFileCompressionRatio(); + /** * Get the growth rate of the store files this region server is serving from. */ 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 40a6bdf3dadb..c643eedaaf16 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 @@ -533,6 +533,20 @@ public long getStoreFileSize() { return aggregate.storeFileSize; } + @Override + public long getStoreFileUncompressedSize() { + return aggregate.storeFileUncompressedSize; + } + + @Override + public double getStoreFileCompressionRatio() { + long uncompressed = aggregate.storeFileUncompressedSize; + if (uncompressed == 0) { + return 1.0; + } + return (double) aggregate.storeFileSize / uncompressed; + } + @Override public double getStoreFileSizeGrowthRate() { return aggregate.storeFileSizeGrowthRate; @@ -783,6 +797,7 @@ private static final class RegionMetricAggregate { private long onHeapMemstoreSize = 0; private long offHeapMemstoreSize = 0; private long storeFileSize = 0; + private long storeFileUncompressedSize = 0; private double storeFileSizeGrowthRate = 0; private long maxStoreFileCount = 0; private long maxStoreFileAge = 0; @@ -979,6 +994,7 @@ private StoreFileStats aggregateStores(List stores) { onHeapMemstoreSize += store.getMemStoreSize().getHeapSize(); offHeapMemstoreSize += store.getMemStoreSize().getOffHeapSize(); storeFileSize += store.getStorefilesSize(); + storeFileUncompressedSize += store.getStoreSizeUncompressed(); maxStoreFileCount = Math.max(maxStoreFileCount, store.getStorefilesCount()); maxStoreFileAge = diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java index 093b0f0a3637..1ca74cb20941 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java @@ -87,6 +87,16 @@ public long getStoreFileSize() { return 1900; } + @Override + public long getStoreFileUncompressedSize() { + return 3800; + } + + @Override + public double getStoreFileCompressionRatio() { + return 0.5; + } + @Override public double getStoreFileSizeGrowthRate() { return 50.0; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java index 11223d6ccbf6..e461f1ad7066 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java @@ -90,6 +90,8 @@ public void testWrapperSource() { HELPER.assertGauge("memstoreHeapSize", 500, serverSource); HELPER.assertGauge("memstoreOffHeapSize", 600, serverSource); HELPER.assertGauge("storeFileSize", 1900, serverSource); + HELPER.assertGauge("storeFileUncompressedSize", 3800, serverSource); + HELPER.assertGauge("storeFileCompressionRatio", 0.5, serverSource); HELPER.assertGauge("storeFileSizeGrowthRate", 50.0, serverSource); HELPER.assertCounter("totalRequestCount", 899, serverSource); HELPER.assertCounter("totalRowActionRequestCount", From c1633d780807f6179dbd4c3f46b2d4ceea1f3f23 Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Wed, 1 Jul 2026 08:59:35 +0530 Subject: [PATCH 2/2] HBASE-30242 reimplement ratio as uncompressed / compressed --- .../hadoop/hbase/regionserver/MetricsRegionServerSource.java | 4 ++-- .../hadoop/hbase/regionserver/MetricsRegionServerWrapper.java | 4 ++-- .../hbase/regionserver/MetricsRegionServerWrapperImpl.java | 4 ++-- .../hbase/regionserver/MetricsRegionServerWrapperStub.java | 2 +- .../hadoop/hbase/regionserver/TestMetricsRegionServer.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java index b2934855a1bd..f7e1dd118e5f 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSource.java @@ -248,8 +248,8 @@ public interface MetricsRegionServerSource extends BaseSource, JvmPauseMonitorSo "Bytes per second by which the size of storefiles being served grows."; String STOREFILE_UNCOMPRESSED_SIZE_DESC = "Total uncompressed size of storefiles being served."; String STOREFILE_COMPRESSION_RATIO_DESC = - "Compression ratio of storefiles (compressed/uncompressed). Lower values indicate better" - + " compression. Returns 1.0 when there is no data."; + "Compression ratio of storefiles (uncompressed/compressed). Higher values indicate better" + + " compression. Returns 0.0 when there is no data."; String TOTAL_REQUEST_COUNT = "totalRequestCount"; String TOTAL_REQUEST_COUNT_DESC = "Total number of requests this RegionServer has answered; increments the count once for " diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java index 854524e91635..a01e046c3ed7 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapper.java @@ -122,8 +122,8 @@ public interface MetricsRegionServerWrapper { long getStoreFileUncompressedSize(); /** - * Get the compression ratio of store files on this region server. This is the ratio of compressed - * on-disk size to uncompressed data size. Returns 1.0 when there is no data. + * Get the compression ratio of store files on this region server. This is the ratio of + * uncompressed data size to compressed on-disk size. Returns 0.0 when there is no data. */ double getStoreFileCompressionRatio(); 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 c643eedaaf16..a52d56541871 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 @@ -542,9 +542,9 @@ public long getStoreFileUncompressedSize() { public double getStoreFileCompressionRatio() { long uncompressed = aggregate.storeFileUncompressedSize; if (uncompressed == 0) { - return 1.0; + return 0.0; } - return (double) aggregate.storeFileSize / uncompressed; + return (double) uncompressed / aggregate.storeFileSize; } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java index 1ca74cb20941..b5c44c5c77a0 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java @@ -94,7 +94,7 @@ public long getStoreFileUncompressedSize() { @Override public double getStoreFileCompressionRatio() { - return 0.5; + return 2; } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java index e461f1ad7066..f93da2a4ee18 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java @@ -91,7 +91,7 @@ public void testWrapperSource() { HELPER.assertGauge("memstoreOffHeapSize", 600, serverSource); HELPER.assertGauge("storeFileSize", 1900, serverSource); HELPER.assertGauge("storeFileUncompressedSize", 3800, serverSource); - HELPER.assertGauge("storeFileCompressionRatio", 0.5, serverSource); + HELPER.assertGauge("storeFileCompressionRatio", 2.0, serverSource); HELPER.assertGauge("storeFileSizeGrowthRate", 50.0, serverSource); HELPER.assertCounter("totalRequestCount", 899, serverSource); HELPER.assertCounter("totalRowActionRequestCount",