diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java index 2c44fa881c41..4bb4f32d57c8 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/ScmConfigKeys.java @@ -628,6 +628,10 @@ public final class ScmConfigKeys { public static final String OZONE_SCM_HA_RATIS_SERVER_RPC_FIRST_ELECTION_TIMEOUT = "ozone.scm.ha.raft.server.rpc.first-election.timeout"; + public static final String OZONE_SCM_RATIS_EVENTS_MAX_LIMIT = + "ozone.scm.ratis.events.max.limit"; + public static final int OZONE_SCM_RATIS_EVENTS_MAX_LIMIT_DEFAULT = 100; + /** * Never constructed. */ diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml index e159eb6948b8..45207cb96fea 100644 --- a/hadoop-hdds/common/src/main/resources/ozone-default.xml +++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml @@ -5044,4 +5044,16 @@ 5m Interval for cleaning up orphan snapshot local data versions corresponding to snapshots + + ozone.scm.ratis.events.max.limit + 100 + OZONE, RATIS, SCM + The maximum number of events that can be pending in SCM Ratis. + + + ozone.om.ratis.events.max.limit + 100 + OZONE, RATIS, OM + The maximum number of events that can be pending in OM Ratis. + diff --git a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html index 1963a6543835..35a3410ef032 100644 --- a/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html +++ b/hadoop-hdds/framework/src/main/resources/webapps/static/templates/menu.html @@ -34,6 +34,7 @@
  • Configuration
  • +
  • Ratis event timeline
  • Documentation
  • ratisEvents = new LinkedList<>(); + private final int maxRatisEvents; + /** * Container stat metrics, the meaning of following metrics * can be found in {@link ContainerStat}. @@ -59,14 +66,23 @@ public DBCheckpointMetrics getDBCheckpointMetrics() { return dbCheckpointMetrics; } - public SCMMetrics() { + public SCMMetrics(int maxRatisEvents) { dbCheckpointMetrics = DBCheckpointMetrics.create("SCM Metrics"); + this.maxRatisEvents = maxRatisEvents; } public static SCMMetrics create() { + return create(null); + } + + public static SCMMetrics create(ConfigurationSource conf) { MetricsSystem ms = DefaultMetricsSystem.instance(); + int maxRatisEvents = conf == null + ? ScmConfigKeys.OZONE_SCM_RATIS_EVENTS_MAX_LIMIT_DEFAULT + : conf.getInt(ScmConfigKeys.OZONE_SCM_RATIS_EVENTS_MAX_LIMIT, + ScmConfigKeys.OZONE_SCM_RATIS_EVENTS_MAX_LIMIT_DEFAULT); return ms.register(SOURCE_NAME, "Storage Container Manager Metrics", - new SCMMetrics()); + new SCMMetrics(maxRatisEvents)); } public void setLastContainerReportSize(long size) { @@ -155,6 +171,22 @@ public void decrContainerStat(ContainerStat deltaStat) { this.containerReportWriteCount.incr(-1 * deltaStat.getWriteCount().get()); } + public void addRatisEvent(String event) { + synchronized (ratisEvents) { + if (ratisEvents.size() >= maxRatisEvents) { + ratisEvents.removeFirst(); + } + ratisEvents.add(Time.formatTime(Time.now()) + "|" + event); + } + } + + @Metric("Ratis state machine events") + public String getRatisEvents() { + synchronized (ratisEvents) { + return String.join("\n", ratisEvents); + } + } + public void unRegister() { MetricsSystem ms = DefaultMetricsSystem.instance(); ms.unregisterSource(SOURCE_NAME); diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java index 9d49ca36b6f2..59b56b6dba4a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMStateMachine.java @@ -39,6 +39,7 @@ import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.block.DeletedBlockLog; import org.apache.hadoop.hdds.scm.block.DeletedBlockLogImpl; +import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMMetrics; import org.apache.hadoop.hdds.scm.exceptions.SCMException; import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; @@ -78,6 +79,7 @@ public class SCMStateMachine extends BaseStateMachine { private StorageContainerManager scm; private Map handlers; private SCMHADBTransactionBuffer transactionBuffer; + private final SCMMetrics metrics; private final SimpleStateMachineStorage storage = new SimpleStateMachineStorage(); private final boolean isInitialized; @@ -94,6 +96,7 @@ public SCMStateMachine(final StorageContainerManager scm, this.scm = scm; this.handlers = new EnumMap<>(RequestType.class); this.transactionBuffer = buffer; + this.metrics = scm.getMetrics(); TransactionInfo latestTrxInfo = this.transactionBuffer.getLatestTrxInfo(); if (!latestTrxInfo.isDefault()) { updateLastAppliedTermIndex(latestTrxInfo.getTerm(), @@ -111,12 +114,19 @@ public SCMStateMachine(final StorageContainerManager scm, public SCMStateMachine() { isInitialized = false; + this.metrics = null; } public void registerHandler(RequestType type, Object handler) { handlers.put(type, handler); } + private void addRatisEvent(String message) { + if (metrics != null) { + metrics.addRatisEvent(message); + } + } + @Override public SnapshotInfo getLatestSnapshot() { // Transaction buffer will be null during scm initlialization phase @@ -212,7 +222,9 @@ public void notifyNotLeader(Collection pendingEntries) { if (!isInitialized) { return; } - LOG.info("current leader SCM steps down."); + String message = "SCM " + scm.getScmId() + " steps down from being leader."; + LOG.info(message); + addRatisEvent(message); scm.getScmContext().updateLeaderAndTerm(false, 0); scm.getSCMServiceManager().notifyStatusChanged(); @@ -243,6 +255,8 @@ public CompletableFuture notifyInstallSnapshotFromLeader( final String leaderNodeId = leaderDetails.get().getNodeId(); LOG.info("Received install snapshot notification from SCM leader: {} with " + "term index: {}", leaderAddress, firstTermIndexInLog); + addRatisEvent("Installing snapshot from SCM leader " + leaderNodeId + + ", term index: " + firstTermIndexInLog); CompletableFuture future = CompletableFuture.supplyAsync( () -> { @@ -296,11 +310,17 @@ public void notifyLeaderChanged(RaftGroupMemberId groupMemberId, } if (!groupMemberId.getPeerId().equals(newLeaderId)) { - LOG.info("leader changed, yet current SCM is still follower."); + String message = "Leader changed to " + newLeaderId + + ", current SCM " + scm.getScmId() + " is still follower."; + LOG.info(message); + addRatisEvent(message); return; } - LOG.info("current SCM becomes leader of term {}.", currentLeaderTerm); + String message = "current SCM " + scm.getScmId() + + " becomes leader of term " + currentLeaderTerm; + LOG.info(message); + addRatisEvent(message); scm.getScmContext().updateLeaderAndTerm(true, currentLeaderTerm.get()); @@ -394,11 +414,15 @@ public void notifyLeaderReady() { scm.getScmContext().setLeaderReady(); scm.getSCMServiceManager().notifyStatusChanged(); scm.getFinalizationManager().onLeaderReady(); + addRatisEvent("SCM " + scm.getScmId() + + " is ready to serve requests as the leader"); } @Override public void notifyConfigurationChanged(long term, long index, RaftProtos.RaftConfigurationProto newRaftConfiguration) { + addRatisEvent("Configuration changed at term index (" + term + ", " + index + + ") to " + newRaftConfiguration.toString()); } @Override @@ -431,6 +455,7 @@ public void reinitialize() throws IOException { } LOG.info("{}: SCMStateMachine is reinitializing. newTermIndex = {}", getId(), termIndex); + addRatisEvent("reinitialize: " + termIndex); // re-initialize the DBTransactionBuffer and update the lastAppliedIndex. try { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMBlockProtocolServer.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMBlockProtocolServer.java index 1fc7c2d96b24..e563c9f08ffc 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMBlockProtocolServer.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMBlockProtocolServer.java @@ -25,7 +25,6 @@ import static org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes.IO_EXCEPTION; import static org.apache.hadoop.hdds.scm.net.NetConstants.NODE_COST_DEFAULT; import static org.apache.hadoop.hdds.scm.net.NetConstants.ROOT; -import static org.apache.hadoop.hdds.scm.server.StorageContainerManager.getPerfMetrics; import static org.apache.hadoop.hdds.scm.server.StorageContainerManager.startRpcServer; import static org.apache.hadoop.hdds.server.ServerUtils.getRemoteUserName; import static org.apache.hadoop.hdds.server.ServerUtils.updateRPCListenAddress; @@ -108,7 +107,7 @@ public class SCMBlockProtocolServer implements public SCMBlockProtocolServer(OzoneConfiguration conf, StorageContainerManager scm) throws IOException { this.scm = scm; - this.perfMetrics = getPerfMetrics(); + this.perfMetrics = scm.getPerfMetrics(); final int handlerCount = conf.getInt(OZONE_SCM_BLOCK_HANDLER_COUNT_KEY, OZONE_SCM_HANDLER_COUNT_KEY, OZONE_SCM_HANDLER_COUNT_DEFAULT, LOG::info); 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 696816b85a24..69f7973ff1bd 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 @@ -226,8 +226,8 @@ public final class StorageContainerManager extends ServiceRuntimeInfoImpl /** * SCM metrics. */ - private static SCMMetrics metrics; - private static SCMPerformanceMetrics perfMetrics; + private SCMMetrics metrics; + private SCMPerformanceMetrics perfMetrics; private SCMHAMetrics scmHAMetrics; private final NettyMetrics nettyMetrics; @@ -1427,28 +1427,28 @@ private static InetSocketAddress getScmAddress(SCMHANodeDetails haDetails, /** * Initialize SCM metrics. */ - public static void initMetrics() { - metrics = SCMMetrics.create(); + public void initMetrics() { + metrics = SCMMetrics.create(configuration); } /** * Return SCM metrics instance. */ - public static SCMMetrics getMetrics() { - return metrics == null ? SCMMetrics.create() : metrics; + public SCMMetrics getMetrics() { + return metrics; } /** * Initialize SCMPerformance metrics. */ - public static void initPerfMetrics() { + public void initPerfMetrics() { perfMetrics = SCMPerformanceMetrics.create(); } /** * Return SCMPerformance metrics instance. */ - public static SCMPerformanceMetrics getPerfMetrics() { + public SCMPerformanceMetrics getPerfMetrics() { return perfMetrics == null ? SCMPerformanceMetrics.create() : perfMetrics; } diff --git a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/ratis-events.html b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/ratis-events.html new file mode 100644 index 000000000000..9eb6008d00ff --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/ratis-events.html @@ -0,0 +1,32 @@ + +

    Ratis event timeline

    + + + + + + + + + + + + + + +
    TimestampEvent description
    {{event.timestamp}}{{event.description}}
    diff --git a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js index eca79852e43b..1e44826f980e 100644 --- a/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js +++ b/hadoop-hdds/server-scm/src/main/resources/webapps/scm/scm.js @@ -19,6 +19,32 @@ "use strict"; angular.module('scm', ['ozone', 'nvd3']); + angular.module('scm').config(function ($routeProvider) { + $routeProvider + .when("/ratis_events", { + template: "" + }); + }); + + angular.module('scm').component('ratisEvents', { + templateUrl: 'ratis-events.html', + controller: function ($http) { + var ctrl = this; + $http.get("jmx?qry=Hadoop:service=StorageContainerManager,name=SCMMetrics") + .then(function (result) { + var metrics = result.data.beans[0]; + var rawEvents = metrics['tag.RatisEvents'] ? metrics['tag.RatisEvents'].split('\n') : []; + ctrl.events = rawEvents.map(function(e) { + var parts = e.split('|'); + return { + timestamp: parts[0], + description: parts[1] + }; + }); + }); + } + }); + angular.module('scm').component('scmOverview', { templateUrl: 'scm-overview.html', require: { diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMStateMachine.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMStateMachine.java new file mode 100644 index 000000000000..828606f2d424 --- /dev/null +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSCMStateMachine.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.scm.ha; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMMetrics; +import org.apache.hadoop.hdds.scm.server.StorageContainerManager; +import org.apache.hadoop.hdds.utils.TransactionInfo; +import org.apache.ratis.proto.RaftProtos; +import org.apache.ratis.server.protocol.TermIndex; +import org.junit.jupiter.api.Test; + +/** + * Test SCMStateMachine events recording. + */ +public class TestSCMStateMachine { + + @Test + public void testRatisEventsRecording() throws Exception { + StorageContainerManager scm = mock(StorageContainerManager.class); + SCMMetrics metrics = SCMMetrics.create(); + when(scm.getMetrics()).thenReturn(metrics); + + SCMHADBTransactionBuffer buffer = mock(SCMHADBTransactionBuffer.class); + when(buffer.getLatestTrxInfo()).thenReturn(TransactionInfo.valueOf(TermIndex.valueOf(0, 0))); + + SCMStateMachine stateMachine = new SCMStateMachine(scm, buffer); + + stateMachine.notifyConfigurationChanged(1, 1, RaftProtos.RaftConfigurationProto.getDefaultInstance()); + assertTrue(metrics.getRatisEvents().contains("Configuration changed at term index")); + + metrics.unRegister(); + } +} diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java index 05083d506304..6d83209dd0fd 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java @@ -691,6 +691,10 @@ public final class OMConfigKeys { "ozone.om.snapshot.local.data.manager.service.interval"; public static final String OZONE_OM_SNAPSHOT_LOCAL_DATA_MANAGER_SERVICE_INTERVAL_DEFAULT = "5m"; + public static final String OZONE_OM_RATIS_EVENTS_MAX_LIMIT = + "ozone.om.ratis.events.max.limit"; + public static final int OZONE_OM_RATIS_EVENTS_MAX_LIMIT_DEFAULT = 100; + /** * Never constructed. */ diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java index cb8045e0e6e5..7054e350682f 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java @@ -87,7 +87,7 @@ public void init() throws Exception { .build(); cluster.waitForClusterToBeReady(); StorageContainerManager scm = cluster.getStorageContainerManager(); - scmMetrics = StorageContainerManager.getMetrics(); + scmMetrics = scm.getMetrics(); requestMock = mock(HttpServletRequest.class); when(requestMock.getParameter(OZONE_DB_CHECKPOINT_REQUEST_FLUSH)) diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestRangerBGSyncService.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestRangerBGSyncService.java index 9f5690e11e4c..a01bcf370484 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestRangerBGSyncService.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestRangerBGSyncService.java @@ -177,7 +177,7 @@ public void setUp() throws IOException { Path metaDirPath = Paths.get(path, "om-meta"); conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, metaDirPath.toString()); - omMetrics = OMMetrics.create(); + omMetrics = OMMetrics.create(conf); conf.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.resolve("om").toAbsolutePath().toString()); // No need to conf.set(OzoneConfigKeys.OZONE_ADMINISTRATORS, ...) here diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java index 9d2cab2fc507..5a70483b2bc8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMMetrics.java @@ -18,7 +18,9 @@ package org.apache.hadoop.ozone.om; import com.google.common.annotations.VisibleForTesting; +import java.util.LinkedList; import org.apache.hadoop.hdds.annotation.InterfaceAudience; +import org.apache.hadoop.hdds.conf.ConfigurationSource; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.DBCheckpointMetrics; import org.apache.hadoop.metrics2.MetricsSystem; @@ -28,6 +30,7 @@ import org.apache.hadoop.metrics2.lib.MutableCounterLong; import org.apache.hadoop.metrics2.lib.MutableGaugeInt; import org.apache.hadoop.ozone.om.snapshot.OMSnapshotDirectoryMetrics; +import org.apache.hadoop.util.Time; /** * This class is for maintaining Ozone Manager statistics. @@ -38,6 +41,9 @@ public class OMMetrics implements OmMetadataReaderMetrics { private static final String SOURCE_NAME = OMMetrics.class.getSimpleName(); + private final LinkedList ratisEvents = new LinkedList<>(); + private final int maxRatisEvents; + // OM request type op metrics private @Metric MutableCounterLong numVolumeOps; private @Metric MutableCounterLong numBucketOps; @@ -256,15 +262,20 @@ public class OMMetrics implements OmMetadataReaderMetrics { private final DBCheckpointMetrics dbCheckpointMetrics; private OMSnapshotDirectoryMetrics snapshotDirectoryMetrics; - public OMMetrics() { + public OMMetrics(int maxRatisEvents) { dbCheckpointMetrics = DBCheckpointMetrics.create("OM Metrics"); + this.maxRatisEvents = maxRatisEvents; } - public static OMMetrics create() { + public static OMMetrics create(ConfigurationSource conf) { MetricsSystem ms = DefaultMetricsSystem.instance(); + int maxRatisEvents = conf == null + ? OMConfigKeys.OZONE_OM_RATIS_EVENTS_MAX_LIMIT_DEFAULT + : conf.getInt(OMConfigKeys.OZONE_OM_RATIS_EVENTS_MAX_LIMIT, + OMConfigKeys.OZONE_OM_RATIS_EVENTS_MAX_LIMIT_DEFAULT); return ms.register(SOURCE_NAME, "Ozone Manager Metrics", - new OMMetrics()); + new OMMetrics(maxRatisEvents)); } public DBCheckpointMetrics getDBCheckpointMetrics() { @@ -1570,6 +1581,22 @@ public void incNumRecoverLeaseFails() { numRecoverLeaseFails.incr(); } + public void addRatisEvent(String event) { + synchronized (ratisEvents) { + if (ratisEvents.size() >= maxRatisEvents) { + ratisEvents.removeFirst(); + } + ratisEvents.add(Time.formatTime(Time.now()) + "|" + event); + } + } + + @Metric("Ratis state machine events") + public String getRatisEvents() { + synchronized (ratisEvents) { + return String.join("\n", ratisEvents); + } + } + public void unRegister() { if (dbCheckpointMetrics != null) { dbCheckpointMetrics.unRegister(); 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 e3ec61c5b469..0bd52f68d875 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 @@ -693,7 +693,7 @@ private OzoneManager(OzoneConfiguration conf, StartupOption startupOption) this.isS3MultiTenancyEnabled = OMMultiTenantManager.checkAndEnableMultiTenancy(this, conf); - metrics = OMMetrics.create(); + metrics = OMMetrics.create(conf); omSnapshotIntMetrics = OmSnapshotInternalMetrics.create(); perfMetrics = OMPerformanceMetrics.register(); omDeletionMetrics = DeletingServiceMetrics.create(); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java index 09a530ab6cc7..2abaf9ae5719 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerStateMachine.java @@ -26,6 +26,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -41,6 +42,7 @@ import org.apache.hadoop.ozone.audit.AuditLoggerType; import org.apache.hadoop.ozone.audit.OMSystemAction; import org.apache.hadoop.ozone.om.OMConfigKeys; +import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OzoneManager; import org.apache.hadoop.ozone.om.OzoneManagerPrepareState; import org.apache.hadoop.ozone.om.exceptions.OMException; @@ -170,6 +172,10 @@ public synchronized void reinitialize() throws IOException { final TermIndex lastApplied = getLastAppliedTermIndex(); unpause(lastApplied.getIndex(), lastApplied.getTerm()); LOG.info("{}: reinitialize {} with {}", getId(), getGroupId(), lastApplied); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("reinitialize: " + lastApplied); + } } } @@ -183,6 +189,19 @@ public SnapshotInfo getLatestSnapshot() { @Override public void notifyLeaderReady() { ozoneManager.getOmSnapshotManager().resetInFlightSnapshotCount(); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("Ready to serve requests as the leader"); + } + } + + @Override + public void notifyNotLeader(Collection pendingEntries) { + LOG.info("current leader OM steps down."); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("current leader OM steps down."); + } } @Override @@ -208,6 +227,10 @@ public void notifyLeaderChanged(RaftGroupMemberId groupMemberId, AUDIT.logWriteSuccess(ozoneManager.buildAuditMessageForSuccess(OMSystemAction.LEADER_CHANGE, auditParams)); LOG.info("{}: leader changed to {}", groupMemberId, newLeaderId); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("Leader changed to " + newLeaderId); + } } /** Notified by Ratis for non-StateMachine term-index update. */ @@ -282,10 +305,22 @@ public void notifyConfigurationChanged(long term, long index, for (RaftProtos.RaftPeerProto raftPeerProto : newPeers) { newPeerIds.add(RaftPeerId.valueOf(raftPeerProto.getId()).toString()); } - for (RaftProtos.RaftPeerProto raftPeerProto : newListeners) { - newPeerIds.add(RaftPeerId.valueOf(raftPeerProto.getId()).toString()); + List newListenersIds = new ArrayList<>(); + for (RaftProtos.RaftPeerProto raftListenerProto : newListeners) { + newListenersIds.add(RaftPeerId.valueOf(raftListenerProto.getId()).toString()); + } + + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent( + "New peers " + newPeerIds + + (newListenersIds.isEmpty() ? "" : ", new listeners " + newListenersIds) + + " added at term index (" + + term + ", " + index + ")"); } + // Check and update the peer list in OzoneManager + newPeerIds.addAll(newListenersIds); ozoneManager.updatePeerList(newPeerIds); } @@ -301,6 +336,11 @@ public void notifySnapshotInstalled(RaftProtos.InstallSnapshotResult result, long snapshotIndex, RaftPeer peer) { LOG.info("Receive notifySnapshotInstalled event {} for the peer: {}" + " snapshotIndex: {}.", result, peer.getId(), snapshotIndex); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("Install snapshot " + + result + ", snapshotIndex=" + snapshotIndex + ", peer=" + peer.getId()); + } switch (result) { case SUCCESS: case SNAPSHOT_UNAVAILABLE: @@ -581,6 +621,11 @@ public CompletableFuture notifyInstallSnapshotFromLeader( .getLeaderInfo().getId().getId()).toString(); LOG.info("Received install snapshot notification from OM leader: {} with " + "term index: {}", leaderNodeId, firstTermIndexInLog); + OMMetrics metrics = ozoneManager.getMetrics(); + if (metrics != null) { + metrics.addRatisEvent("Installing snapshot from " + + "OM leader " + leaderNodeId + ", term index: " + firstTermIndexInLog); + } return CompletableFuture.supplyAsync( () -> { diff --git a/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ozoneManager.js b/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ozoneManager.js index e98d3f7ba3a7..8b64a082362f 100644 --- a/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ozoneManager.js +++ b/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ozoneManager.js @@ -30,6 +30,9 @@ }) .when("/snapshots", { template: "" + }) + .when("/ratis_events", { + template: "" }); }); angular.module('ozoneManager').component('omSnapshots', { @@ -131,6 +134,24 @@ } } }); + angular.module('ozoneManager').component('ratisEvents', { + templateUrl: 'ratis-events.html', + controller: function ($http) { + var ctrl = this; + $http.get("jmx?qry=Hadoop:service=OzoneManager,name=OMMetrics") + .then(function (result) { + var metrics = result.data.beans[0]; + var rawEvents = metrics['tag.RatisEvents'] ? metrics['tag.RatisEvents'].split('\n') : []; + ctrl.events = rawEvents.map(function(e) { + var parts = e.split('|'); + return { + timestamp: parts[0], + description: parts[1] + }; + }); + }); + } + }); angular.module('ozoneManager').component('omMetrics', { templateUrl: 'om-metrics.html', controller: function ($http) { diff --git a/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ratis-events.html b/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ratis-events.html new file mode 100644 index 000000000000..9eb6008d00ff --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/resources/webapps/ozoneManager/ratis-events.html @@ -0,0 +1,32 @@ + +

    Ratis event timeline

    + + + + + + + + + + + + + + +
    TimestampEvent description
    {{event.timestamp}}{{event.description}}
    diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBuffer.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBuffer.java index 81a0691a749a..c0ad927bc059 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBuffer.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBuffer.java @@ -106,8 +106,8 @@ class TestOzoneManagerDoubleBuffer { @BeforeEach public void setup() throws IOException { - OMMetrics omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + OMMetrics omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, tempDir.getAbsolutePath()); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBufferWithOMResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBufferWithOMResponse.java index 4ba3c6b5d1b7..8b3027d12cd1 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBufferWithOMResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerDoubleBufferWithOMResponse.java @@ -91,8 +91,8 @@ public class TestOzoneManagerDoubleBufferWithOMResponse { @BeforeEach public void setup() throws IOException { ozoneManager = mock(OzoneManager.class, withSettings().stubOnly()); - OMMetrics omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + OMMetrics omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java index 36d7a80aeea9..111779b95734 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/ratis/TestOzoneManagerStateMachine.java @@ -54,6 +54,7 @@ import org.apache.hadoop.ozone.audit.OMSystemAction; import org.apache.hadoop.ozone.om.OMConfigKeys; import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.OmConfig; import org.apache.hadoop.ozone.om.OmMetadataManagerImpl; import org.apache.hadoop.ozone.om.OmSnapshotManager; @@ -1037,4 +1038,28 @@ private RaftClientRequest buildClientRequest( .setType(RaftClientRequest.writeRequestType()) .build(); } + + @Test + public void testRatisEventsRecording() { + OzoneConfiguration conf = new OzoneConfiguration(); + OMMetrics metrics = OMMetrics.create(conf); + when(om.getMetrics()).thenReturn(metrics); + when(om.getOmSnapshotManager()).thenReturn(mock(OmSnapshotManager.class)); + when(om.getConfiguration()).thenReturn(conf); + AuditMessage auditMessage = mock(AuditMessage.class); + when(auditMessage.getOp()).thenReturn("LEADER_CHANGE"); + when(om.buildAuditMessageForSuccess(any(), any())).thenReturn(auditMessage); + sm.notifyLeaderReady(); + assertTrue(metrics.getRatisEvents().contains("Ready to serve requests as the leader")); + + RaftGroupMemberId groupMemberId = mock(RaftGroupMemberId.class); + when(groupMemberId.getPeerId()).thenReturn(RaftPeerId.valueOf("peer1")); + sm.notifyLeaderChanged(groupMemberId, RaftPeerId.valueOf("peer1")); + assertTrue(metrics.getRatisEvents().contains("Leader changed to peer1")); + + sm.notifyConfigurationChanged(1, 1, RaftProtos.RaftConfigurationProto.getDefaultInstance()); + assertTrue(metrics.getRatisEvents().contains("New peers [] added at term index ")); + + metrics.unRegister(); + } } diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java index 145ffe9854fe..38036912b96b 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java @@ -70,8 +70,8 @@ public class TestOMClientRequestWithUserInfo { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - OMMetrics omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + OMMetrics omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); OMMetadataManager omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java index 018e60633a50..40f54be4cc03 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/bucket/TestBucketRequest.java @@ -59,8 +59,8 @@ public class TestBucketRequest { public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); when(ozoneManager.getConfiguration()).thenReturn(ozoneConfiguration); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java index 1b096070ea3f..7adf92518d18 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequest.java @@ -92,8 +92,8 @@ public class TestOMDirectoryCreateRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequestWithFSO.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequestWithFSO.java index 164ccf661cce..8f5b6c807caa 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequestWithFSO.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMDirectoryCreateRequestWithFSO.java @@ -92,8 +92,8 @@ public class TestOMDirectoryCreateRequestWithFSO { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); OMRequestTestUtils.configureFSOptimizedPaths(ozoneConfiguration, true); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java index b84294370c58..405cc706ef90 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java @@ -136,10 +136,10 @@ public class TestOMKeyRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); + OzoneConfiguration ozoneConfiguration = getOzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); perfMetrics = OMPerformanceMetrics.register(); delMetrics = DeletingServiceMetrics.create(); - OzoneConfiguration ozoneConfiguration = getOzoneConfiguration(); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); ozoneConfiguration.set(OzoneConfigKeys.OZONE_METADATA_DIRS, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java index 38749f6812a6..15ed924cc408 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartRequest.java @@ -77,8 +77,8 @@ public class TestS3MultipartRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java index 78ccef961f38..0067b2b38047 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/security/TestS3GetSecretRequest.java @@ -133,8 +133,8 @@ public void setUp() throws Exception { when(call.getRemoteUser()).thenReturn(ugiAlice); Server.getCurCall().set(call); - omMetrics = OMMetrics.create(); OzoneConfiguration conf = new OzoneConfiguration(); + omMetrics = OMMetrics.create(conf); conf.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); // No need to conf.set(OzoneConfigKeys.OZONE_ADMINISTRATORS, ...) here diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantCreateRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantCreateRequest.java index 36529d01064c..4f1ff1659c15 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantCreateRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantCreateRequest.java @@ -72,8 +72,8 @@ public class TestOMTenantCreateRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantDeleteRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantDeleteRequest.java index 6de4f1d8446d..8accc44fd9d6 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantDeleteRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/tenant/TestOMTenantDeleteRequest.java @@ -69,8 +69,8 @@ public class TestOMTenantDeleteRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java index 36c6034207c0..71cb1b166277 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/volume/TestOMVolumeRequest.java @@ -61,8 +61,8 @@ public class TestOMVolumeRequest { @BeforeEach public void setup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, folder.toAbsolutePath().toString()); omMetadataManager = new OmMetadataManagerImpl(ozoneConfiguration, diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java index ebc78b26c1e8..96fdb35d4679 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotCache.java @@ -82,6 +82,7 @@ class TestSnapshotCache { private static IOzoneManagerLock lock; private SnapshotCache snapshotCache; + private OzoneConfiguration conf; private OMMetrics omMetrics; @BeforeAll @@ -94,8 +95,9 @@ static void beforeAll() throws Exception { @BeforeEach void setUp() throws Exception { + conf = new OzoneConfiguration(); // Reset cache for each test case - omMetrics = OMMetrics.create(); + omMetrics = OMMetrics.create(conf); // Create a difference mock OmSnapshot instance each time load() is called doAnswer((Answer) invocation -> { final OmSnapshot omSnapshot = mock(OmSnapshot.class); @@ -197,7 +199,7 @@ public void testLockHoldsWriteLock(int numberOfLocks) { @Test public void testLockSupplierReturnsLockWithAnotherLockReleased() { - IOzoneManagerLock ozoneManagerLock = new OzoneManagerLock(new OzoneConfiguration()); + IOzoneManagerLock ozoneManagerLock = new OzoneManagerLock(conf); snapshotCache = new SnapshotCache(cacheLoader, CACHE_SIZE_LIMIT, omMetrics, 50, true, ozoneManagerLock); try (UncheckedAutoCloseableSupplier lockDetails = snapshotCache.lock()) { ozoneManagerLock.acquireWriteLock(VOLUME_LOCK, "vol1"); @@ -460,7 +462,7 @@ void testEviction3WithClose() throws IOException, InterruptedException, TimeoutE @Test @DisplayName("Snapshot operations not blocked during compaction") void testSnapshotOperationsNotBlockedDuringCompaction() throws IOException, InterruptedException, TimeoutException { - omMetrics = OMMetrics.create(); + omMetrics = OMMetrics.create(conf); snapshotCache = new SnapshotCache(cacheLoader, 1, omMetrics, 50, true, lock); final UUID dbKey1 = UUID.randomUUID(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java index 4da22a90ed85..9b573a574229 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDiffManager.java @@ -188,7 +188,6 @@ public class TestSnapshotDiffManager { private final List snapshotNames = new ArrayList<>(); private final List snapshotInfoList = new ArrayList<>(); private final List snapDiffJobs = new ArrayList<>(); - private final OMMetrics omMetrics = OMMetrics.create(); @TempDir private File dbDir; @Mock @@ -229,6 +228,9 @@ public void init() throws RocksDBException, IOException, ExecutionException { ExitUtils.disableSystemExit(); ExitUtil.disableSystemExit(); + OzoneConfiguration conf = new OzoneConfiguration(); + OMMetrics omMetrics = OMMetrics.create(conf); + dbOptions = new ManagedDBOptions(); dbOptions.setCreateIfMissing(true); columnFamilyOptions = new ManagedColumnFamilyOptions(); diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotRequestAndResponse.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotRequestAndResponse.java index 9c6f033b907b..e3776a5b8372 100644 --- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotRequestAndResponse.java +++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotRequestAndResponse.java @@ -142,9 +142,9 @@ protected TestSnapshotRequestAndResponse(boolean isAdmin) { @BeforeEach public void baseSetup() throws Exception { ozoneManager = mock(OzoneManager.class); - omMetrics = OMMetrics.create(); - omSnapshotIntMetrics = OmSnapshotInternalMetrics.create(); OzoneConfiguration ozoneConfiguration = new OzoneConfiguration(); + omMetrics = OMMetrics.create(ozoneConfiguration); + omSnapshotIntMetrics = OmSnapshotInternalMetrics.create(); ozoneConfiguration.set(OMConfigKeys.OZONE_OM_DB_DIRS, testDir.getAbsolutePath()); ozoneConfiguration.set(OzoneConfigKeys.OZONE_METADATA_DIRS,