From b8e461f696f8c49654359d6f52a0c4fc1d5aca02 Mon Sep 17 00:00:00 2001 From: xingrufei Date: Thu, 5 Aug 2021 15:35:45 +0800 Subject: [PATCH 1/2] HBASE-26171 fix MetricsRegionServer may throws NullPointerException When optional.get() is called --- .../apache/hadoop/hbase/regionserver/MetricsRegionServer.java | 4 +++- .../hadoop/hbase/regionserver/RegionServerTableMetrics.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java index 07a90f6db950..7985a90b47aa 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java @@ -26,6 +26,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; +import java.util.NoSuchElementException; /** * Maintains regionserver statistics and publishes them through the metrics interfaces. @@ -73,7 +74,8 @@ public MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper, Confi // Create hbase-metrics module based metrics. The registry should already be registered by the // MetricsRegionServerSource - metricRegistry = MetricRegistries.global().get(serverSource.getMetricRegistryInfo()).get(); + metricRegistry = MetricRegistries.global().get(serverSource.getMetricRegistryInfo()).orElseThrow( + NoSuchElementException::new); // create and use metrics from the new hbase-metrics based registry. bulkLoadTimer = metricRegistry.timer("Bulkload"); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java index a9a7d75bfeaa..6b561d659890 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java @@ -20,6 +20,7 @@ import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.metrics.MetricRegistries; import org.apache.yetus.audience.InterfaceAudience; +import java.util.NoSuchElementException; /** * Captures operation metrics by table. Separates metrics collection for table metrics away from @@ -35,7 +36,8 @@ public RegionServerTableMetrics(boolean enableTableQueryMeter) { latencies = CompatibilitySingletonFactory.getInstance(MetricsTableLatencies.class); if (enableTableQueryMeter) { queryMeter = new MetricsTableQueryMeterImpl(MetricRegistries.global(). - get(((MetricsTableLatenciesImpl) latencies).getMetricRegistryInfo()).get()); + get(((MetricsTableLatenciesImpl) latencies).getMetricRegistryInfo()).orElseThrow( + NoSuchElementException::new)); } } From fb992f27eac9acba59c059abbd6797797b0a1ce0 Mon Sep 17 00:00:00 2001 From: xingrufei Date: Thu, 5 Aug 2021 22:36:53 +0800 Subject: [PATCH 2/2] Add explicit exception information --- .../apache/hadoop/hbase/regionserver/MetricsRegionServer.java | 3 +-- .../hadoop/hbase/regionserver/RegionServerTableMetrics.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java index 7985a90b47aa..4266c0a75c7d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java @@ -26,7 +26,6 @@ import org.apache.hadoop.conf.Configuration; import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceStability; -import java.util.NoSuchElementException; /** * Maintains regionserver statistics and publishes them through the metrics interfaces. @@ -75,7 +74,7 @@ public MetricsRegionServer(MetricsRegionServerWrapper regionServerWrapper, Confi // Create hbase-metrics module based metrics. The registry should already be registered by the // MetricsRegionServerSource metricRegistry = MetricRegistries.global().get(serverSource.getMetricRegistryInfo()).orElseThrow( - NoSuchElementException::new); + ()->new IllegalStateException("metricRegistry is null")); // create and use metrics from the new hbase-metrics based registry. bulkLoadTimer = metricRegistry.timer("Bulkload"); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java index 6b561d659890..c80fd2f8573d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerTableMetrics.java @@ -20,7 +20,6 @@ import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.metrics.MetricRegistries; import org.apache.yetus.audience.InterfaceAudience; -import java.util.NoSuchElementException; /** * Captures operation metrics by table. Separates metrics collection for table metrics away from @@ -37,7 +36,7 @@ public RegionServerTableMetrics(boolean enableTableQueryMeter) { if (enableTableQueryMeter) { queryMeter = new MetricsTableQueryMeterImpl(MetricRegistries.global(). get(((MetricsTableLatenciesImpl) latencies).getMetricRegistryInfo()).orElseThrow( - NoSuchElementException::new)); + ()-> new IllegalStateException("metricRegistry is null"))); } }