diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java index d36a17855031..92dfbf237a76 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeService.java @@ -213,7 +213,7 @@ public void start() { serviceRuntimeInfo.setStartTime(); RatisDropwizardExports. - registerRatisMetricReporters(ratisMetricsMap); + registerRatisMetricReporters(ratisMetricsMap, () -> isStopped.get()); OzoneConfiguration.activate(); HddsServerUtil.initializeMetrics(conf, "HddsDatanode"); diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/RatisDropwizardExports.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/RatisDropwizardExports.java index 76e65a1d726c..50d840a7ad9a 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/RatisDropwizardExports.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/RatisDropwizardExports.java @@ -22,6 +22,7 @@ import io.prometheus.client.CollectorRegistry; import io.prometheus.client.dropwizard.DropwizardExports; import io.prometheus.client.dropwizard.samplebuilder.DefaultSampleBuilder; +import java.util.function.BooleanSupplier; import org.apache.ratis.metrics.MetricRegistries; import org.apache.ratis.metrics.MetricsReporting; import org.apache.ratis.metrics.RatisMetricRegistry; @@ -43,14 +44,15 @@ public RatisDropwizardExports(MetricRegistry registry) { } public static void registerRatisMetricReporters( - Map ratisMetricsMap) { + Map ratisMetricsMap, + BooleanSupplier checkStopped) { //All the Ratis metrics (registered from now) will be published via JMX and //via the prometheus exporter (used by the /prom servlet MetricRegistries.global() .addReporterRegistration(MetricsReporting.jmxReporter(), MetricsReporting.stopJmxReporter()); MetricRegistries.global().addReporterRegistration( - r1 -> registerDropwizard(r1, ratisMetricsMap), + r1 -> registerDropwizard(r1, ratisMetricsMap, checkStopped), r2 -> deregisterDropwizard(r2, ratisMetricsMap)); } @@ -69,12 +71,19 @@ public static void clear(Map } private static void registerDropwizard(RatisMetricRegistry registry, - Map ratisMetricsMap) { + Map ratisMetricsMap, + BooleanSupplier checkStopped) { + if (checkStopped.getAsBoolean()) { + return; + } + RatisDropwizardExports rde = new RatisDropwizardExports( registry.getDropWizardMetricRegistry()); - CollectorRegistry.defaultRegistry.register(rde); String name = registry.getMetricRegistryInfo().getName(); - ratisMetricsMap.putIfAbsent(name, rde); + if (null == ratisMetricsMap.putIfAbsent(name, rde)) { + // new rde is added for the name, so need register + CollectorRegistry.defaultRegistry.register(rde); + } } private static void deregisterDropwizard(RatisMetricRegistry registry, diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java index 73a5468c397b..47b8931264ec 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java @@ -28,6 +28,7 @@ import com.google.common.cache.RemovalListener; import com.google.protobuf.BlockingService; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.lang3.tuple.Pair; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hdds.HddsConfigKeys; @@ -290,7 +291,8 @@ public final class StorageContainerManager extends ServiceRuntimeInfoImpl // Used to keep track of pending replication and pending deletes for // container replicas. private ContainerReplicaPendingOps containerReplicaPendingOps; - + private final AtomicBoolean isStopped = new AtomicBoolean(false); + /** * Creates a new StorageContainerManager. Configuration will be * updated with information on the actual listening addresses used @@ -584,7 +586,8 @@ private void initializeSystemManagers(OzoneConfiguration conf, clusterMap = new NetworkTopologyImpl(conf); } // This needs to be done before initializing Ratis. - RatisDropwizardExports.registerRatisMetricReporters(ratisMetricsMap); + RatisDropwizardExports.registerRatisMetricReporters(ratisMetricsMap, + () -> isStopped.get()); if (configurator.getSCMHAManager() != null) { scmHAManager = configurator.getSCMHAManager(); } else { @@ -1519,6 +1522,10 @@ private void persistSCMCertificates() throws IOException { */ @Override public void stop() { + if (isStopped.getAndSet(true)) { + LOG.info("Storage Container Manager is not running."); + return; + } try { if (containerBalancer.isBalancerRunning()) { LOG.info("Stopping Container Balancer service."); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index 70f8359fe832..273eeca50399 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -1967,7 +1967,7 @@ private void initializeRatisServer(boolean shouldBootstrap) if (omRatisServer == null) { // This needs to be done before initializing Ratis. RatisDropwizardExports. - registerRatisMetricReporters(ratisMetricsMap); + registerRatisMetricReporters(ratisMetricsMap, () -> isStopped()); omRatisServer = OzoneManagerRatisServer.newOMRatisServer( configuration, this, omNodeDetails, peerNodesMap, secConfig, certClient, shouldBootstrap);