This is an automated email from the ASF dual-hosted git repository.
errose28 pushed a commit to branch HDDS-14496-zdu
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/HDDS-14496-zdu by this push:
new a66822e64fc HDDS-15377. Switch SCM to use new ScmVersionManager
(#10368)
a66822e64fc is described below
commit a66822e64fc347a1a16f3bcc62f01ef8f3a2a1de
Author: Ethan Rose <[email protected]>
AuthorDate: Tue Jun 9 12:06:37 2026 -0400
HDDS-15377. Switch SCM to use new ScmVersionManager (#10368)
Co-authored-by: Cursor <[email protected]>
---
.../ozone/container/upgrade/UpgradeUtils.java | 7 --
.../docs/content/design/upgrade-dev-primer.md | 4 +-
.../apache/hadoop/hdds/scm/node/DatanodeInfo.java | 40 +++---
.../apache/hadoop/hdds/scm/node/NodeManager.java | 20 ++-
.../hadoop/hdds/scm/node/SCMNodeManager.java | 134 ++++++++++++---------
...lockLocationProtocolServerSideTranslatorPB.java | 4 +-
...inerLocationProtocolServerSideTranslatorPB.java | 3 +-
.../hdds/scm/server/SCMClientProtocolServer.java | 17 +--
.../hadoop/hdds/scm/server/SCMConfigurator.java | 22 ----
.../hadoop/hdds/scm/server/SCMStorageConfig.java | 7 +-
.../hdds/scm/server/StorageContainerManager.java | 46 +++----
.../scm/server/upgrade/FinalizationManager.java | 21 ----
.../server/upgrade/FinalizationManagerImpl.java | 95 ++-------------
.../server/upgrade/FinalizationStateManager.java | 13 +-
.../upgrade/FinalizationStateManagerImpl.java | 119 ++++--------------
.../TestIncrementalContainerReportHandler.java | 8 +-
.../hdds/scm/node/TestContainerPlacement.java | 11 +-
.../hdds/scm/node/TestNodeReportHandler.java | 8 +-
.../hdds/scm/node/TestPendingContainerTracker.java | 13 +-
.../hadoop/hdds/scm/node/TestSCMNodeManager.java | 116 ++++++++----------
.../hadoop/hdds/scm/node/TestSCMNodeMetrics.java | 10 +-
.../hdds/scm/upgrade/ScmUpgradeTestUtils.java | 56 +++++++++
.../TestScmStartupInvalidApparentVersion.java | 17 ++-
.../TestDNDataDistributionFinalization.java | 22 ++--
.../hadoop/hdds/upgrade/TestHddsUpgradeUtils.java | 63 +++++++---
.../TestScmDataDistributionFinalization.java | 41 +------
.../hadoop/hdds/upgrade/TestScmHAFinalization.java | 46 +++----
.../om/TestOmStartupInvalidApparentVersion.java | 2 +-
.../ozone/om/service/TestBlockDeletionService.java | 6 +-
hadoop-ozone/recon/pom.xml | 6 +
.../ozone/recon/api/types/DatanodeMetadata.java | 14 +--
.../hadoop/ozone/recon/scm/ReconNodeManager.java | 53 ++------
.../scm/ReconStorageContainerManagerFacade.java | 8 +-
.../hadoop/ozone/recon/api/TestEndpoints.java | 2 +-
.../scm/AbstractReconContainerManagerTest.java | 12 +-
...TestReconIncrementalContainerReportHandler.java | 10 +-
.../ozone/recon/scm/TestReconNodeManager.java | 10 +-
.../ozone/recon/scm/TestReconPipelineManager.java | 20 +--
38 files changed, 444 insertions(+), 662 deletions(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/UpgradeUtils.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/UpgradeUtils.java
index 4b2cb3f8c9c..29024891ee4 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/UpgradeUtils.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/UpgradeUtils.java
@@ -42,11 +42,4 @@ public static LayoutVersionProto
toVersionProto(ComponentVersion apparentVersion
.setSoftwareLayoutVersion(softwareVersion.serialize())
.build();
}
-
- public static LayoutVersionProto toVersionProto(int metadataLayoutVersion,
int softwareLayoutVersion) {
- return LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(metadataLayoutVersion)
- .setSoftwareLayoutVersion(softwareLayoutVersion)
- .build();
- }
}
diff --git a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
index f693c8484c8..4daf13a097f 100644
--- a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
+++ b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
@@ -40,7 +40,9 @@ Class to add a new layout feature being brought in. Layout
version is typically
**Ozone Manager** uses
[`org.apache.hadoop.ozone.om.upgrade.OMVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMVersionManager.java)
([`org.apache.hadoop.ozone.upgrade.ComponentVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java)),
with upgrade actions discovered via [`org.apache.hadoop.ozone.om. [...]
-**SCM / DataNode** continue to use
[`org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutVersionManager.java)
([`org.apache.hadoop.ozone.upgrade.AbstractLayoutVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractLayoutVersionManager.java)),
which provides metadata/software layout [...]
+**SCM** uses
[`org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmVersionManager.java)
([`org.apache.hadoop.ozone.upgrade.ComponentVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java)),
with upgrade actions via [`org.apache.hadoop.hdds.upgrade.ScmUp [...]
+
+**DataNode** uses
[`org.apache.hadoop.ozone.container.upgrade.DatanodeVersionManager`](https://github.com/apache/ozone/blob/master/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeVersionManager.java)
with upgrade actions via
[`org.apache.hadoop.ozone.container.upgrade.DatanodeUpgradeActionProvider`](https://github.com/apache/ozone/blob/master/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeUpgrade
[...]
## @DisallowedUntilLayoutVersion Annotation
Method level annotation used to "disallow" an API if current layout version
does not include the associated layout feature. Currently it is added only to
the OM module, but can easily be moved down to a common module based on need on
the HDDS layer.
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeInfo.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeInfo.java
index 59f0ec22e52..c2410fc6848 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeInfo.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeInfo.java
@@ -17,8 +17,6 @@
package org.apache.hadoop.hdds.scm.node;
-import static
org.apache.hadoop.ozone.container.upgrade.UpgradeUtils.toVersionProto;
-
import com.google.common.annotations.VisibleForTesting;
import java.util.Collections;
import java.util.HashMap;
@@ -26,6 +24,7 @@
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.apache.hadoop.hdds.ComponentVersion;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.CommandQueueReportProto;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.LayoutVersionProto;
@@ -33,6 +32,7 @@
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.SCMCommandProto;
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.StorageReportProto;
import org.apache.hadoop.hdds.scm.node.PendingContainerTracker.TwoWindowBucket;
+import org.apache.hadoop.hdds.upgrade.HDDSVersionUtils;
import org.apache.hadoop.util.Time;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -58,7 +58,8 @@ public class DatanodeInfo extends DatanodeDetails {
private List<StorageReportProto> storageReports;
private List<MetadataStorageReportProto> metadataStorageReports;
- private LayoutVersionProto lastKnownLayoutVersion;
+ private ComponentVersion lastKnownSoftwareVersion;
+ private ComponentVersion lastKnownApparentVersion;
private final Map<SCMCommandProto.Type, Integer> commandCounts;
private NodeStatus nodeStatus;
@@ -74,9 +75,10 @@ public DatanodeInfo(DatanodeDetails datanodeDetails,
NodeStatus nodeStatus,
super(datanodeDetails);
this.lock = new ReentrantReadWriteLock();
this.lastHeartbeatTime = Time.monotonicNow();
- lastKnownLayoutVersion = toVersionProto(
- versionInfo != null ? versionInfo.getMetadataLayoutVersion() : 0,
- versionInfo != null ? versionInfo.getSoftwareLayoutVersion() : 0);
+ this.lastKnownSoftwareVersion =
+
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(versionInfo.getSoftwareLayoutVersion());
+ this.lastKnownApparentVersion =
+
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(versionInfo.getMetadataLayoutVersion());
this.storageReports = Collections.emptyList();
this.nodeStatus = nodeStatus;
this.metadataStorageReports = Collections.emptyList();
@@ -108,6 +110,7 @@ public void updateLastHeartbeatTime(long
milliSecondsSinceEpoch) {
}
/**
+ * Updates the last known apparent and software versions for this datanode.
* Updates the last known version reported by this datanode.
*/
public void updateLastKnownVersions(LayoutVersionProto version) {
@@ -116,9 +119,10 @@ public void updateLastKnownVersions(LayoutVersionProto
version) {
}
try {
lock.writeLock().lock();
- lastKnownLayoutVersion = toVersionProto(
- version.getMetadataLayoutVersion(),
- version.getSoftwareLayoutVersion());
+ lastKnownSoftwareVersion =
+
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(version.getSoftwareLayoutVersion());
+ lastKnownApparentVersion =
+
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(version.getMetadataLayoutVersion());
} finally {
lock.writeLock().unlock();
}
@@ -138,15 +142,19 @@ public long getLastHeartbeatTime() {
}
}
- /**
- * Returns the last known Layout Version .
- *
- * @return last Layout Version.
- */
- public LayoutVersionProto getLastKnownLayoutVersion() {
+ public ComponentVersion getLastKnownSoftwareVersion() {
+ try {
+ lock.readLock().lock();
+ return lastKnownSoftwareVersion;
+ } finally {
+ lock.readLock().unlock();
+ }
+ }
+
+ public ComponentVersion getLastKnownApparentVersion() {
try {
lock.readLock().lock();
- return lastKnownLayoutVersion;
+ return lastKnownApparentVersion;
} finally {
lock.readLock().unlock();
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManager.java
index b4e52a586ae..cd31eba5c4f 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/NodeManager.java
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
+import org.apache.hadoop.hdds.ComponentVersion;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.DatanodeID;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState;
@@ -43,7 +44,6 @@
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
import org.apache.hadoop.hdds.server.events.EventHandler;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.ozone.protocol.StorageContainerNodeProtocol;
import org.apache.hadoop.ozone.protocol.commands.CommandForDatanode;
import org.apache.hadoop.ozone.protocol.commands.RegisteredCommand;
@@ -173,19 +173,17 @@ default DatanodeFinalizationCounts
getDatanodeFinalizationCounts() {
totalHealthyNodes++;
DatanodeInfo datanodeInfo = getDatanodeInfo(dn);
if (datanodeInfo == null) {
- LOG.warn("Could not get DatanodeInfo for {}, skipping in " +
- "finalization wait.", dn.getHostName());
+ LOG.warn("Could not get DatanodeInfo for {}, skip counting for
finalization.", dn.getHostName());
continue;
}
- LayoutVersionProto dnLayout = datanodeInfo.getLastKnownLayoutVersion();
- int dnMlv = dnLayout.getMetadataLayoutVersion();
- int dnSlv = dnLayout.getSoftwareLayoutVersion();
+ ComponentVersion dnApparentVersion =
datanodeInfo.getLastKnownApparentVersion();
+ ComponentVersion dnSoftwareVersion =
datanodeInfo.getLastKnownSoftwareVersion();
- if (dnMlv < dnSlv) {
+ if (!dnApparentVersion.equals(dnSoftwareVersion)) {
// Datanode has not yet finalized
- LOG.debug("Datanode {} has not yet finalized: MLV={}, SLV={}",
- dn.getHostName(), dnMlv, dnSlv);
+ LOG.debug("Datanode {} has not yet finalized: apparent version={},
software version={}",
+ dn.getHostName(), dnApparentVersion, dnSoftwareVersion);
} else {
finalizedNodes++;
}
@@ -473,10 +471,6 @@ default Collection<DatanodeDetails>
getPeerList(DatanodeDetails dn) {
return null;
}
- default HDDSLayoutVersionManager getLayoutVersionManager() {
- return null;
- }
-
/**
* This API allows removal of only DECOMMISSIONED, IN_MAINTENANCE and DEAD
nodes
* from NodeManager data structures and cleanup memory.
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
index 44bdf7a1638..c9309c6a995 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/SCMNodeManager.java
@@ -50,7 +50,7 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
import javax.management.ObjectName;
-import org.apache.hadoop.hdds.HDDSVersion;
+import org.apache.hadoop.hdds.ComponentVersion;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.ConfigurationSource;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -84,8 +84,9 @@
import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
import org.apache.hadoop.hdds.scm.pipeline.PipelineNotFoundException;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
+import org.apache.hadoop.hdds.upgrade.HDDSVersionUtils;
import org.apache.hadoop.ipc_.Server;
import org.apache.hadoop.metrics2.util.MBeans;
import org.apache.hadoop.ozone.OzoneConfigKeys;
@@ -135,7 +136,7 @@ public class SCMNodeManager implements NodeManager {
private final Map<String, Set<DatanodeID>> dnsToDnIdMap = new
ConcurrentHashMap<>();
private final int numPipelinesPerMetadataVolume;
private final int datanodePipelineLimit;
- private final HDDSLayoutVersionManager scmLayoutVersionManager;
+ private final ScmVersionManager versionManager;
private final EventPublisher scmNodeEventPublisher;
private final SCMContext scmContext;
private final Map<SCMCommandProto.Type,
@@ -157,28 +158,18 @@ public class SCMNodeManager implements NodeManager {
private static final String VERSION = "VERSION";
/**
- * TODO HDDS-15129 Remove when SCM uses the new versioning framework
- * Datanodes on {@link HDDSVersion} report {@link HDDSVersion#ZDU} as
software version ({@code 100}), while
- * SCM still on {@link org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature}
reports the legacy maximum ({@code 10}
- * today).
- * Without this bridge, registration fails and heartbeats log {@code dnSlv >
scmSlv} as an invalid node.
- */
- private static boolean shouldFenceDatanode(int dnSoftwareVersion, int
scmSoftwareVersion) {
- return dnSoftwareVersion > scmSoftwareVersion && dnSoftwareVersion !=
HDDSVersion.ZDU.serialize();
- }
-
- /**
- * Constructs SCM machine Manager.
+ * Constructs SCM machine Manager using {@link ScmVersionManager}
(production SCM).
*/
+ @VisibleForTesting
public SCMNodeManager(
OzoneConfiguration conf,
SCMStorageConfig scmStorageConfig,
EventPublisher eventPublisher,
NetworkTopology networkTopology,
SCMContext scmContext,
- HDDSLayoutVersionManager layoutVersionManager) {
+ ScmVersionManager versionManager) {
this(conf, scmStorageConfig, eventPublisher, networkTopology, scmContext,
- layoutVersionManager, hostname -> null);
+ versionManager, hostname -> null);
}
public SCMNodeManager(
@@ -187,14 +178,14 @@ public SCMNodeManager(
EventPublisher eventPublisher,
NetworkTopology networkTopology,
SCMContext scmContext,
- HDDSLayoutVersionManager layoutVersionManager,
+ ScmVersionManager versionManager,
Function<String, String> nodeResolver) {
this.scmNodeEventPublisher = eventPublisher;
this.nodeStateManager = new NodeStateManager(conf, eventPublisher,
scmContext);
this.version = VersionInfo.getLatestVersion();
this.commandQueue = new CommandQueue();
this.scmStorageConfig = scmStorageConfig;
- this.scmLayoutVersionManager = layoutVersionManager;
+ this.versionManager = versionManager;
LOG.info("Entering startup safe mode.");
registerMXBean();
this.metrics = SCMNodeMetrics.create(this);
@@ -384,10 +375,8 @@ public RegisteredCommand register(
PipelineReportsProto pipelineReportsProto) {
return register(datanodeDetails, nodeReport, pipelineReportsProto,
LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(
- scmLayoutVersionManager.getMetadataLayoutVersion())
- .setSoftwareLayoutVersion(
- scmLayoutVersionManager.getSoftwareLayoutVersion())
+
.setMetadataLayoutVersion(versionManager.getApparentVersion().serialize())
+
.setSoftwareLayoutVersion(versionManager.getSoftwareVersion().serialize())
.build());
}
@@ -408,9 +397,7 @@ public RegisteredCommand register(
DatanodeDetails datanodeDetails, NodeReportProto nodeReport,
PipelineReportsProto pipelineReportsProto,
LayoutVersionProto dnVersionInfo) {
- int dnSlvRegister = dnVersionInfo.getSoftwareLayoutVersion();
- int scmSlvRegister = scmLayoutVersionManager.getSoftwareLayoutVersion();
- if (shouldFenceDatanode(dnSlvRegister, scmSlvRegister)) {
+ if (shouldFenceDatanode(datanodeDetails, dnVersionInfo)) {
return RegisteredCommand.newBuilder()
.setErrorCode(ErrorCode.errorNodeNotPermitted)
.setDatanode(datanodeDetails)
@@ -764,46 +751,48 @@ public void processVersionReport(DatanodeDetails
datanodeDetails,
protected void sendFinalizeToDatanodeIfNeeded(DatanodeDetails
datanodeDetails,
LayoutVersionProto versionReport) {
- // Software layout version is hardcoded to the SCM.
- int scmSlv = scmLayoutVersionManager.getSoftwareLayoutVersion();
- int dnSlv = versionReport.getSoftwareLayoutVersion();
- int dnMlv = versionReport.getMetadataLayoutVersion();
-
- // A datanode with a larger software layout version is from a future
- // version of ozone. It should not have been added to the cluster.
- // TODO HDDS-15129 REMOVE WHEN SCM USES new versioning framework.
- // For now, do not treat datanodes with ZDU future software version as
invalid.
- if (shouldFenceDatanode(dnSlv, scmSlv)) {
- LOG.error("Invalid data node in the cluster : {}. " +
- "DataNode SoftwareLayoutVersion = {}, SCM " +
- "SoftwareLayoutVersion = {}",
- datanodeDetails.getHostName(), dnSlv, scmSlv);
+ ComponentVersion dnSoftwareVersion =
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(
+ versionReport.getSoftwareLayoutVersion());
+ ComponentVersion dnApparentVersion =
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(
+ versionReport.getMetadataLayoutVersion());
+ ComponentVersion scmSoftwareVersion = versionManager.getSoftwareVersion();
+ ComponentVersion scmApparentVersion = versionManager.getApparentVersion();
+
+ if (shouldFenceDatanode(datanodeDetails, dnSoftwareVersion,
dnApparentVersion)) {
+ LOG.error("Invalid datanode in the cluster : {}. " +
+ "Datanode software version = {}, " +
+ "Datanode apparent version = {}, " +
+ "SCM software version = {} " +
+ "SCM apparent version = {}",
+ datanodeDetails.getHostName(), dnSoftwareVersion, dnApparentVersion,
+ scmSoftwareVersion, scmApparentVersion);
return;
}
- if (!scmContext.isLeader() || scmLayoutVersionManager.needsFinalization())
{
+ if (!scmContext.isLeader() || versionManager.needsFinalization()) {
return;
}
- int scmMlv = scmLayoutVersionManager.getMetadataLayoutVersion();
- if (dnMlv == scmMlv) {
- // datanode is already finalized, so there is nothing to do
+ if (versionManager.getApparentVersion().equals(dnApparentVersion)) {
+ // If SCM and DN apparent version match, then the datanode is already
finalized.
+ LOG.debug("Skip sending finalize command to datanode {} because its
apparent version matches SCM's apparent " +
+ "version {}", datanodeDetails, versionManager.getApparentVersion());
return;
}
// Because the finalizationManager / versionManager says finalization is
not needed it means any DN reporting a
// metadata layout version less than the SCM's metadata layout version can
be finalized.
- LOG.warn("Data node {} has a MetadataLayoutVersion = {}, SCM
MetadataLayoutVersion = {}. Sending finalize",
- datanodeDetails.getHostName(), dnMlv, scmMlv);
+ LOG.info("Sending finalize command to datanode {} with apparent version {}
which is less than SCM's finalized " +
+ "apparent version {}", datanodeDetails, dnApparentVersion,
scmApparentVersion);
FinalizeVersionCommand finalizeCmd =
new FinalizeVersionCommand(true,
LayoutVersionProto.newBuilder()
- .setSoftwareLayoutVersion(dnSlv)
- .setMetadataLayoutVersion(dnSlv).build());
+ .setSoftwareLayoutVersion(dnSoftwareVersion.serialize())
+
.setMetadataLayoutVersion(dnSoftwareVersion.serialize()).build());
try {
finalizeCmd.setTerm(scmContext.getTermOfLeader());
- // Send Finalize command to the data node. Its OK to send Finalize
command multiple times.
+ // Send Finalize command to the data node. It's OK to send Finalize
command multiple times.
scmNodeEventPublisher.fireEvent(SCMEvents.DATANODE_COMMAND,
new CommandForDatanode<>(datanodeDetails,
finalizeCmd));
@@ -1987,15 +1976,6 @@ long getSkippedHealthChecks() {
return nodeStateManager.getSkippedHealthChecks();
}
- /**
- * @return HDDSLayoutVersionManager
- */
- @VisibleForTesting
- @Override
- public HDDSLayoutVersionManager getLayoutVersionManager() {
- return scmLayoutVersionManager;
- }
-
private ReentrantReadWriteLock.WriteLock writeLock() {
return lock.writeLock();
}
@@ -2035,4 +2015,42 @@ public void removeNode(DatanodeDetails datanodeDetails)
throws NodeNotFoundExcep
writeLock().unlock();
}
}
+
+ protected boolean shouldFenceDatanode(DatanodeDetails dnDetails,
LayoutVersionProto versionReport) {
+ ComponentVersion dnSoftwareVersion =
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(
+ versionReport.getSoftwareLayoutVersion());
+ ComponentVersion dnApparentVersion =
HDDSVersionUtils.deserializeHDDSVersionOrLayoutVersion(
+ versionReport.getMetadataLayoutVersion());
+ return shouldFenceDatanode(dnDetails, dnSoftwareVersion,
dnApparentVersion);
+ }
+
+ /**
+ * TODO Update this method to fence datanodes based on their software and
apparent version and log the results.
+ * For now, maintain the non-rolling upgrade requirement that DN and SCM
must have the same software version.
+ * Datanodes still cannot have a higher apparent version than SCM.
+ */
+ private boolean shouldFenceDatanode(DatanodeDetails dnDetails,
ComponentVersion softwareVersion,
+ ComponentVersion apparentVersion) {
+ // Check datanode software version against SCM.
+ if (!versionManager.getSoftwareVersion().equals(softwareVersion)) {
+ // TODO Once SCM implementation for ZDU is complete, Datanodes with
lower software versions will be allowed as
+ // long as SCM is pre-finalized.
+ LOG.error("Datanode {} with software version {} which does not match SCM
software version {} will not be " +
+ "allowed to join the cluster. This requirement will be lifted
when ZDU is complete.",
+ dnDetails, softwareVersion, versionManager.getSoftwareVersion());
+ return true;
+ }
+
+ // Check datanode apparent version against SCM.
+ if (!versionManager.isAllowed(apparentVersion)) {
+ // Datanodes can never have a higher apparent version than SCM.
+ LOG.error("Datanode {} with apparent version {} which is larger than
SCM's apparent version {} will not be " +
+ "allowed to join the cluster.", dnDetails, apparentVersion,
versionManager.getApparentVersion());
+ return true;
+ }
+
+ // Datanodes with lower apparent version than SCM are allowed in the
cluster but will be instructed to finalize
+ // if SCM has finalized.
+ return false;
+ }
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
index f9fa80bf42d..007376670ba 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
@@ -129,9 +129,7 @@ private SCMBlockLocationResponse processMessage(
try {
switch (request.getCmdType()) {
case AllocateScmBlock:
- if (scm.getLayoutVersionManager().needsFinalization() &&
- !scm.getLayoutVersionManager()
- .isAllowed(HDDSLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT)
+ if
(!scm.getVersionManager().isAllowed(HDDSLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT)
) {
if (request.getAllocateScmBlockRequest().hasEcReplicationConfig()) {
throw new SCMException("Cluster is not finalized yet, it is"
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
index 2a160b07e40..49507152dd5 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
@@ -497,8 +497,7 @@ public ScmContainerLocationResponse processRequest(
request.getScmCloseContainerRequest()))
.build();
case AllocatePipeline:
- if (scm.getLayoutVersionManager().needsFinalization() &&
- !scm.getLayoutVersionManager().isAllowed(
+ if (!scm.getVersionManager().isAllowed(
HDDSLayoutFeature.ERASURE_CODED_STORAGE_SUPPORT)
) {
if (request.getPipelineRequest().getReplicationType() ==
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index 806e0fed9a1..2d4c52b630f 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -29,6 +29,8 @@
import static org.apache.hadoop.hdds.server.ServerUtils.getRemoteUserName;
import static org.apache.hadoop.hdds.server.ServerUtils.updateRPCListenAddress;
import static org.apache.hadoop.hdds.utils.HddsServerUtil.getRemoteUser;
+import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_DONE_MSG;
+import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_REQUIRED_MSG;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.ALREADY_FINALIZED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.STARTING_FINALIZATION;
@@ -1152,7 +1154,7 @@ public ReplicationManagerReport
getReplicationManagerReport() {
@Deprecated
public StatusAndMessages finalizeScmUpgrade(String upgradeClientID) throws
IOException {
- if (scm.getLayoutVersionManager().getUpgradeState() == ALREADY_FINALIZED) {
+ if (!scm.getVersionManager().needsFinalization()) {
return new StatusAndMessages(ALREADY_FINALIZED, Collections.emptyList());
}
finalizeUpgrade();
@@ -1187,12 +1189,13 @@ public StatusAndMessages
queryUpgradeFinalizationProgress(
auditMap.put("readonly", String.valueOf(readonly));
try {
- // check admin authorization
- if (!readonly) {
- getScm().checkAdminAccess(getRemoteUser(), true);
+ getScm().checkAdminAccess(getRemoteUser(), true);
+ StatusAndMessages result;
+ if (scm.getVersionManager().needsFinalization()) {
+ result = FINALIZATION_REQUIRED_MSG;
+ } else {
+ result = FINALIZATION_DONE_MSG;
}
- StatusAndMessages result = scm.getFinalizationManager()
- .queryUpgradeFinalizationProgress(upgradeClientID, force, readonly);
AUDIT.logReadSuccess(buildAuditMessageForSuccess(
SCMAction.QUERY_UPGRADE_FINALIZATION_PROGRESS, auditMap));
return result;
@@ -1208,7 +1211,7 @@ public HddsProtos.UpgradeStatus queryUpgradeStatus()
throws IOException {
try {
getScm().checkAdminAccess(getRemoteUser(), true);
- boolean scmFinalized =
!scm.getLayoutVersionManager().needsFinalization();
+ boolean scmFinalized = !scm.getVersionManager().needsFinalization();
NodeManager.DatanodeFinalizationCounts datanodeFinalizationCounts =
scm.getScmNodeManager().getDatanodeFinalizationCounts();
int finalizedDatanodes =
datanodeFinalizationCounts.getNumFinalizedDatanodes();
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMConfigurator.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMConfigurator.java
index bc542c6722c..a823c41f11f 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMConfigurator.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMConfigurator.java
@@ -28,10 +28,8 @@
import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
import org.apache.hadoop.hdds.scm.pipeline.WritableContainerFactory;
import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
-import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext;
import
org.apache.hadoop.hdds.security.x509.certificate.authority.CertificateServer;
import org.apache.hadoop.ozone.lease.LeaseManager;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalizationExecutor;
/**
* This class acts as an SCM builder Class. This class is important for us
@@ -74,8 +72,6 @@ public final class SCMConfigurator {
private SCMHAManager scmHAManager;
private SCMContext scmContext;
private WritableContainerFactory writableContainerFactory;
- private UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext>
- finalizationExecutor;
private LeaseManager<Object> leaseManager;
/**
@@ -185,15 +181,6 @@ public void setWritableContainerFactory(
this.writableContainerFactory = writableContainerFactory;
}
- /**
- * Allows user to set the executor for upgrade finalization.
- * @param executor - Finalization executor to use.
- */
- public void setUpgradeFinalizationExecutor(
- UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext> executor) {
- this.finalizationExecutor = executor;
- }
-
/**
* Allows user to specify a custom version lease manager.
* @param leaseManager - lease Manager.
@@ -298,15 +285,6 @@ public WritableContainerFactory
getWritableContainerFactory() {
return writableContainerFactory;
}
- /**
- * Get the upgrade finalization executor.
- * @return UpgradeFinalizationExecutor.
- */
- public UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext>
- getUpgradeFinalizationExecutor() {
- return finalizationExecutor;
- }
-
/**
* Get the lease manager.
* @return LeaseManager
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMStorageConfig.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMStorageConfig.java
index d41537fed0f..75d2c557b64 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMStorageConfig.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMStorageConfig.java
@@ -17,7 +17,6 @@
package org.apache.hadoop.hdds.scm.server;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
import static org.apache.hadoop.ozone.OzoneConsts.PRIMARY_SCM_NODE_ID;
import static org.apache.hadoop.ozone.OzoneConsts.SCM_CERT_SERIAL_ID;
import static org.apache.hadoop.ozone.OzoneConsts.SCM_HA;
@@ -28,10 +27,10 @@
import java.io.IOException;
import java.util.Properties;
import java.util.UUID;
+import org.apache.hadoop.hdds.HDDSVersion;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType;
import org.apache.hadoop.hdds.server.ServerUtils;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.ozone.common.Storage;
/**
@@ -49,12 +48,12 @@ public class SCMStorageConfig extends Storage {
public SCMStorageConfig(OzoneConfiguration conf) throws IOException {
super(NodeType.SCM, ServerUtils.getScmDbDir(conf), STORAGE_DIR,
getInitApparentVersion(conf, TESTING_INIT_LAYOUT_VERSION_KEY,
- HDDSLayoutVersionManager::maxLayoutVersion));
+ HDDSVersion.SOFTWARE_VERSION::serialize));
}
public SCMStorageConfig(NodeType type, File root, String sdName)
throws IOException {
- super(type, root, sdName, maxLayoutVersion());
+ super(type, root, sdName, HDDSVersion.SOFTWARE_VERSION.serialize());
}
public void setScmId(String scmId) throws IOException {
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 45faab72f01..393bed6b5be 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
@@ -147,7 +147,7 @@
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.IncrementalContainerReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.upgrade.FinalizationManager;
import org.apache.hadoop.hdds.scm.server.upgrade.FinalizationManagerImpl;
-import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.security.SecurityConfig;
import org.apache.hadoop.hdds.security.symmetric.SecretKeyManager;
import org.apache.hadoop.hdds.security.token.ContainerTokenGenerator;
@@ -169,8 +169,6 @@
import
org.apache.hadoop.hdds.server.events.FixedThreadPoolWithAffinityExecutor;
import org.apache.hadoop.hdds.server.http.RatisDropwizardExports;
import org.apache.hadoop.hdds.tracing.TracingConfig;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
-import org.apache.hadoop.hdds.upgrade.ScmUpgradeActionProvider;
import org.apache.hadoop.hdds.utils.HAUtils;
import org.apache.hadoop.hdds.utils.HddsServerUtil;
import org.apache.hadoop.hdds.utils.HddsVersionInfo;
@@ -189,8 +187,6 @@
import org.apache.hadoop.ozone.common.Storage.StorageState;
import org.apache.hadoop.ozone.lease.LeaseManager;
import org.apache.hadoop.ozone.lease.LeaseManagerNotRunningException;
-import org.apache.hadoop.ozone.upgrade.DefaultUpgradeFinalizationExecutor;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalizationExecutor;
import org.apache.hadoop.security.AccessControlException;
import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.security.UserGroupInformation;
@@ -249,7 +245,7 @@ public final class StorageContainerManager extends
ServiceRuntimeInfoImpl
private NodeDecommissionManager scmDecommissionManager;
private WritableContainerFactory writableContainerFactory;
private FinalizationManager finalizationManager;
- private HDDSLayoutVersionManager scmLayoutVersionManager;
+ private ScmVersionManager versionManager;
private LeaseManager<Object> leaseManager;
private SCMMetadataStore scmMetadataStore;
@@ -702,22 +698,11 @@ private void initializeSystemManagers(OzoneConfiguration
conf,
leaseManager = new LeaseManager<>(threadNamePrefix, timeDuration);
}
- scmLayoutVersionManager = new HDDSLayoutVersionManager(
- scmStorageConfig.getApparentVersion(), new ScmUpgradeActionProvider(),
null);
-
- UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext>
- finalizationExecutor;
- if (configurator.getUpgradeFinalizationExecutor() != null) {
- finalizationExecutor = configurator.getUpgradeFinalizationExecutor();
- } else {
- finalizationExecutor = new DefaultUpgradeFinalizationExecutor<>();
- }
+ versionManager = new ScmVersionManager(scmStorageConfig, this);
finalizationManager = new FinalizationManagerImpl.Builder()
- .setLayoutVersionManager(scmLayoutVersionManager)
- .setStorage(scmStorageConfig)
.setHAManager(scmHAManager)
.setFinalizationStore(scmMetadataStore.getMetaTable())
- .setFinalizationExecutor(finalizationExecutor)
+ .setVersionManager(versionManager)
.build();
// inline upgrade for SequenceIdGenerator
@@ -753,7 +738,7 @@ private void initializeSystemManagers(OzoneConfiguration
conf,
scmNodeManager = configurator.getScmNodeManager();
} else {
scmNodeManager = new SCMNodeManager(conf, scmStorageConfig, eventQueue,
- clusterMap, scmContext, scmLayoutVersionManager,
+ clusterMap, scmContext, versionManager,
this::resolveNodeLocation);
}
@@ -784,8 +769,6 @@ private void initializeSystemManagers(OzoneConfiguration
conf,
);
}
- finalizationManager.buildUpgradeContext(scmNodeManager, scmContext);
-
ReplicationManager.ReplicationManagerConfiguration rmConf =
conf.getObject(ReplicationManager.ReplicationManagerConfiguration.class);
containerReplicaPendingOps =
@@ -1695,8 +1678,8 @@ public void stop() {
LOG.error("Storage Container Manager HTTP server stop failed.", ex);
}
- LOG.info("Stopping SCM LayoutVersionManager Service.");
- scmLayoutVersionManager.close();
+ LOG.info("Stopping SCM version manager metrics.");
+ versionManager.close();
if (getSecurityProtocolServer() != null) {
getSecurityProtocolServer().stop();
@@ -2109,14 +2092,21 @@ public String getClusterId() {
return getScmStorageConfig().getClusterID();
}
- public HDDSLayoutVersionManager getLayoutVersionManager() {
- return scmLayoutVersionManager;
- }
-
+ /**
+ * @return The {@link FinalizationManager} which can be used to finalize an
SCM quorum through Ratis.
+ */
public FinalizationManager getFinalizationManager() {
return finalizationManager;
}
+ /**
+ * @return The {@link ScmVersionManager} which can be used to check this
SCM's local apparent and software versions.
+ * To finalize all SCM's via Ratis, use {@link FinalizationManager} instead.
+ */
+ public ScmVersionManager getVersionManager() {
+ return versionManager;
+ }
+
/**
* Return the node Id of this SCM.
* @return node Id.
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
index 3bdfa2dbd3e..f7e61063612 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
@@ -17,36 +17,15 @@
package org.apache.hadoop.hdds.scm.server.upgrade;
-import com.google.common.annotations.VisibleForTesting;
import java.io.IOException;
-import org.apache.hadoop.hdds.scm.ha.SCMContext;
-import org.apache.hadoop.hdds.scm.node.NodeManager;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.Table;
-import org.apache.hadoop.ozone.upgrade.BasicUpgradeFinalizer;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalization;
/**
* Class to initiate SCM finalization and query its progress.
*/
public interface FinalizationManager {
- UpgradeFinalization.StatusAndMessages finalizeUpgrade(String upgradeClientID)
- throws IOException;
-
void finalizeUpgrade() throws IOException;
- UpgradeFinalization.StatusAndMessages queryUpgradeFinalizationProgress(
- String upgradeClientID, boolean takeover, boolean readonly
- ) throws IOException;
-
- @VisibleForTesting
- BasicUpgradeFinalizer<SCMUpgradeFinalizationContext,
HDDSLayoutVersionManager>
- getUpgradeFinalizer();
-
- void buildUpgradeContext(NodeManager nodeManager,
- SCMContext scmContext);
-
void reinitialize(Table<String, String> finalizationStore) throws
IOException;
-
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
index ccff5101898..f02a8231d54 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
@@ -19,27 +19,14 @@
import com.google.common.annotations.VisibleForTesting;
import java.io.IOException;
-import java.util.Collections;
import java.util.Objects;
-import org.apache.hadoop.hdds.scm.ha.SCMContext;
import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
-import org.apache.hadoop.hdds.scm.node.NodeManager;
-import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.Table;
-import org.apache.hadoop.ozone.upgrade.BasicUpgradeFinalizer;
-import org.apache.hadoop.ozone.upgrade.DefaultUpgradeFinalizationExecutor;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalization;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalizationExecutor;
/**
* Class to initiate SCM finalization and query its progress.
*/
public class FinalizationManagerImpl implements FinalizationManager {
-
- private SCMUpgradeFinalizer upgradeFinalizer;
- private SCMUpgradeFinalizationContext context;
- private SCMStorageConfig storage;
private final FinalizationStateManager finalizationStateManager;
/**
@@ -48,74 +35,25 @@ public class FinalizationManagerImpl implements
FinalizationManager {
@VisibleForTesting
protected FinalizationManagerImpl(Builder builder,
FinalizationStateManager stateManager) throws IOException {
- initCommonFields(builder);
this.finalizationStateManager = stateManager;
-
}
private FinalizationManagerImpl(Builder builder) throws IOException {
- initCommonFields(builder);
this.finalizationStateManager = new FinalizationStateManagerImpl.Builder()
- .setUpgradeFinalizer(this.upgradeFinalizer)
.setFinalizationStore(builder.finalizationStore)
.setTransactionBuffer(builder.scmHAManager.getDBTransactionBuffer())
.setRatisServer(builder.scmHAManager.getRatisServer())
+ .setVersionManager(builder.versionManager)
.build();
}
- private void initCommonFields(Builder builder) {
- this.storage = builder.storage;
- this.upgradeFinalizer = new SCMUpgradeFinalizer(builder.versionManager,
builder.executor);
- }
-
- @Override
- public void buildUpgradeContext(NodeManager nodeManager,
- SCMContext scmContext) {
- this.context = new SCMUpgradeFinalizationContext.Builder()
- .setStorage(this.storage)
- .setFinalizationStateManager(finalizationStateManager)
- .setNodeManager(nodeManager)
- .setSCMContext(scmContext)
- .build();
-
- finalizationStateManager.setUpgradeContext(this.context);
- }
-
- @Override
- public UpgradeFinalization.StatusAndMessages finalizeUpgrade(
- String upgradeClientID)
- throws IOException {
- Objects.requireNonNull(context, "Cannot finalize upgrade without " +
- "first building the upgrade context.");
- return upgradeFinalizer.finalize(upgradeClientID, context);
- }
-
@Override
public void finalizeUpgrade() throws IOException {
- Objects.requireNonNull(context, "Cannot finalize upgrade without first
building the upgrade context.");
- upgradeFinalizer.finalize(context);
- }
-
- @Override
- public UpgradeFinalization.StatusAndMessages
queryUpgradeFinalizationProgress(
- String upgradeClientID, boolean takeover, boolean readonly
- ) throws IOException {
- if (readonly) {
- return new UpgradeFinalization.StatusAndMessages(
- upgradeFinalizer.getStatus(), Collections.emptyList());
- }
- return upgradeFinalizer.reportStatus(upgradeClientID, takeover);
- }
-
- @Override
- public BasicUpgradeFinalizer<SCMUpgradeFinalizationContext,
- HDDSLayoutVersionManager> getUpgradeFinalizer() {
- return upgradeFinalizer;
+ finalizationStateManager.finalizeUpgrade();
}
@Override
- public void reinitialize(Table<String, String> finalizationStore)
- throws IOException {
+ public void reinitialize(Table<String, String> finalizationStore) throws
IOException {
finalizationStateManager.reinitialize(finalizationStore);
}
@@ -123,24 +61,15 @@ public void reinitialize(Table<String, String>
finalizationStore)
* Builds a {@link FinalizationManagerImpl}.
*/
public static class Builder {
- private HDDSLayoutVersionManager versionManager;
- private SCMStorageConfig storage;
- private SCMHAManager scmHAManager;
private Table<String, String> finalizationStore;
- private UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext>
executor;
+ private SCMHAManager scmHAManager;
+ private ScmVersionManager versionManager;
public Builder() {
- executor = new DefaultUpgradeFinalizationExecutor<>();
- }
-
- public Builder setLayoutVersionManager(
- HDDSLayoutVersionManager layoutVersionManager) {
- this.versionManager = layoutVersionManager;
- return this;
}
- public Builder setStorage(SCMStorageConfig storage) {
- this.storage = storage;
+ public Builder setVersionManager(ScmVersionManager versionManager) {
+ this.versionManager = versionManager;
return this;
}
@@ -155,18 +84,10 @@ public Builder setFinalizationStore(
return this;
}
- public Builder setFinalizationExecutor(
- UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext>
finalizationExecutor) {
- this.executor = finalizationExecutor;
- return this;
- }
-
public FinalizationManagerImpl build() throws IOException {
- Objects.requireNonNull(versionManager, "versionManager == null");
- Objects.requireNonNull(storage, "storage == null");
Objects.requireNonNull(scmHAManager, "scmHAManager == null");
Objects.requireNonNull(finalizationStore, "finalizationStore == null");
- Objects.requireNonNull(executor, "executor == null");
+ Objects.requireNonNull(versionManager, "versionManager == null");
return new FinalizationManagerImpl(this);
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java
index ed4a07924c6..0b8d550ab34 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java
@@ -28,10 +28,19 @@
*/
public interface FinalizationStateManager extends SCMHandler {
+ // TODO this will need a parameter for peer version info to validate.
@Replicate
- void finalizeLayoutFeatures(Integer toLayoutVersion)
- throws IOException;
+ void finalizeUpgrade() throws IOException;
+ /**
+ * Legacy layout-feature finalization API. Retained until obsolete finalizer
classes are removed.
+ */
+ @Replicate
+ void finalizeLayoutFeatures(Integer toLayoutVersion) throws IOException;
+
+ /**
+ * Legacy finalization context. Retained until obsolete finalizer classes
are removed.
+ */
void setUpgradeContext(SCMUpgradeFinalizationContext context);
/**
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java
index 16f6cb3b336..491e32c9582 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java
@@ -21,12 +21,8 @@
import java.util.Objects;
import org.apache.hadoop.hdds.scm.ha.SCMRatisServer;
import org.apache.hadoop.hdds.scm.metadata.DBTransactionBuffer;
-import org.apache.hadoop.hdds.scm.metadata.Replicate;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,132 +36,65 @@ public class FinalizationStateManagerImpl implements
FinalizationStateManager {
private Table<String, String> finalizationStore;
private final DBTransactionBuffer transactionBuffer;
- private final HDDSLayoutVersionManager versionManager;
- // Ensures that we are not in the process of updating checkpoint state as
- // we read it to determine the current checkpoint.
- private SCMUpgradeFinalizationContext upgradeContext;
- private final SCMUpgradeFinalizer upgradeFinalizer;
+ private final ScmVersionManager versionManager;
- protected FinalizationStateManagerImpl(Builder builder) throws IOException {
+ protected FinalizationStateManagerImpl(Builder builder) {
this.finalizationStore = builder.finalizationStore;
this.transactionBuffer = builder.transactionBuffer;
- this.upgradeFinalizer = builder.upgradeFinalizer;
- this.versionManager = this.upgradeFinalizer.getVersionManager();
+ this.versionManager = builder.versionManager;
}
@Override
- public void setUpgradeContext(SCMUpgradeFinalizationContext context) {
- this.upgradeContext = context;
+ public void finalizeUpgrade() throws IOException {
+ versionManager.finalizeUpgrade();
+ transactionBuffer.addToBuffer(finalizationStore,
+ OzoneConsts.APPARENT_VERSION_KEY,
String.valueOf(versionManager.getApparentVersion().serialize()));
}
@Override
- public synchronized void finalizeLayoutFeatures(Integer toVersion) throws
IOException {
- for (LayoutFeature feature : versionManager.unfinalizedFeatures()) {
- finalizeLayoutFeatureLocal((HDDSLayoutFeature) feature);
- }
+ public void setUpgradeContext(SCMUpgradeFinalizationContext context) {
+ // Retained for compile compatibility with SCMUpgradeFinalizer until it is
removed in a follow-up PR.
}
- /**
- * A version of finalizeLayoutFeature without the {@link Replicate}
- * annotation that can be called by followers to finalize from a snapshot.
- */
- private void finalizeLayoutFeatureLocal(HDDSLayoutFeature layoutFeature)
- throws IOException {
- // The VERSION file is the source of truth for the current layout
- // version. This is updated in the replicated finalization steps.
- // Layout version will be written to the DB as well so followers can
- // finalize from a snapshot.
- if (versionManager.getMetadataLayoutVersion() >=
layoutFeature.layoutVersion()) {
- LOG.warn("Attempting to finalize layout feature for layout version {},
but " +
- "current metadata layout version is {}. Skipping finalization for
this layout version.",
- layoutFeature.layoutVersion(),
versionManager.getMetadataLayoutVersion());
- } else {
- upgradeFinalizer.replicatedFinalizationSteps(layoutFeature,
upgradeContext);
- }
- transactionBuffer.addToBuffer(finalizationStore,
- OzoneConsts.APPARENT_VERSION_KEY,
String.valueOf(layoutFeature.layoutVersion()));
+ @Override
+ public void finalizeLayoutFeatures(Integer toLayoutVersion) throws
IOException {
+ throw new UnsupportedOperationException(
+ "Layout feature finalization was removed; use finalizeUpgrade()
instead.");
}
/**
- * Called on snapshot installation.
+ * Called on snapshot installation, which is coordinated by Ratis.
*/
@Override
- public synchronized void reinitialize(Table<String, String>
newFinalizationStore)
- throws IOException {
+ public void reinitialize(Table<String, String> newFinalizationStore) throws
IOException {
try {
this.finalizationStore = newFinalizationStore;
-
- int dbLayoutVersion = getDBLayoutVersion();
- int currentLayoutVersion = versionManager.getMetadataLayoutVersion();
- if (currentLayoutVersion < dbLayoutVersion) {
- // Snapshot contained a higher metadata layout version. Finalize this
- // follower SCM as a result.
- LOG.info("New SCM snapshot received with metadata layout version {}, "
+
- "which is higher than this SCM's metadata layout version {}." +
- "Attempting to finalize current SCM to that version.",
- dbLayoutVersion, currentLayoutVersion);
- // Since the SCM is finalizing from a snapshot, it is a follower, and
- // does not need to run the leader only finalization driving actions
- // that the UpgradeFinalizationExecutor contains. Just run the
- // upgrade actions for the layout features, set the finalization
- // checkpoint, and increase the version in the VERSION file.
- finalizeLayoutFeatures(dbLayoutVersion);
- }
+ versionManager.finalizeFromSnapshotIfRequired(finalizationStore);
} catch (Exception ex) {
LOG.error("Failed to reinitialize finalization state", ex);
throw new IOException(ex);
}
}
- /**
- * Gets the metadata layout version from the SCM RocksDB. This is used for
- * Ratis snapshot based finalization in a slow follower. In all other
- * cases, the VERSION file should be the source of truth.
- *
- * MLV was not stored in RocksDB until SCM HA supported snapshot based
- * finalization, which was after a few HDDS layout features
- * were introduced. If the SCM has not finalized since this code
- * was added, the layout version will not be there. Defer to the MLV in the
- * VERSION file in this case, since finalization is not ongoing. The key will
- * be added once finalization is started with this software version.
- */
- private int getDBLayoutVersion() throws IOException {
- String dbLayoutVersion = finalizationStore.get(
- OzoneConsts.APPARENT_VERSION_KEY);
- if (dbLayoutVersion == null) {
- return versionManager.getMetadataLayoutVersion();
- } else {
- try {
- return Integer.parseInt(dbLayoutVersion);
- } catch (NumberFormatException ex) {
- String msg = String.format(
- "Failed to read layout version from SCM DB. Found string %s",
- dbLayoutVersion);
- LOG.error(msg, ex);
- throw new IOException(msg, ex);
- }
- }
- }
-
/**
* Builds a {@link FinalizationManagerImpl}.
*/
public static class Builder {
private Table<String, String> finalizationStore;
private DBTransactionBuffer transactionBuffer;
- private SCMRatisServer scmRatisServer;
- private SCMUpgradeFinalizer upgradeFinalizer;
+ private SCMRatisServer ratisServer;
+ private ScmVersionManager versionManager;
public Builder() {
}
- public Builder setUpgradeFinalizer(final SCMUpgradeFinalizer finalizer) {
- upgradeFinalizer = finalizer;
+ public Builder setRatisServer(SCMRatisServer ratisServer) {
+ this.ratisServer = ratisServer;
return this;
}
- public Builder setRatisServer(final SCMRatisServer ratisServer) {
- scmRatisServer = ratisServer;
+ public Builder setVersionManager(ScmVersionManager versionManager) {
+ this.versionManager = versionManager;
return this;
}
@@ -183,9 +112,9 @@ public Builder setTransactionBuffer(DBTransactionBuffer
transactionBuffer) {
public FinalizationStateManager build() throws IOException {
Objects.requireNonNull(finalizationStore, "finalizationStore == null");
Objects.requireNonNull(transactionBuffer, "transactionBuffer == null");
- Objects.requireNonNull(upgradeFinalizer, "upgradeFinalizer == null");
+ Objects.requireNonNull(versionManager, "versionManager == null");
- return scmRatisServer.getProxyHandler(FinalizationStateManager.class,
new FinalizationStateManagerImpl(this));
+ return ratisServer.getProxyHandler(FinalizationStateManager.class, new
FinalizationStateManagerImpl(this));
}
}
}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
index 8e87cc5d88d..1e2db41971e 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/container/TestIncrementalContainerReportHandler.java
@@ -26,7 +26,7 @@
import static
org.apache.hadoop.hdds.scm.container.TestContainerReportHandler.createMatchingDataChecksumForReplica;
import static
org.apache.hadoop.hdds.scm.container.TestContainerReportHandler.createUniqueDataChecksumForReplica;
import static
org.apache.hadoop.hdds.scm.container.TestContainerReportHandler.getContainerReportsProto;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -81,9 +81,9 @@
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.ContainerReportFromDatanode;
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.IncrementalContainerReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.DBStoreBuilder;
import
org.apache.hadoop.ozone.common.statemachine.InvalidStateTransitionException;
@@ -119,9 +119,7 @@ public void setup() throws IOException,
InvalidStateTransitionException,
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
SCMStorageConfig storageConfig = new SCMStorageConfig(conf);
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
-
when(versionManager.getMetadataLayoutVersion()).thenReturn(maxLayoutVersion());
-
when(versionManager.getSoftwareLayoutVersion()).thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
this.nodeManager =
new SCMNodeManager(conf, storageConfig, eventQueue, clusterMap,
scmContext, versionManager);
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
index 4dbe79fc135..5dacbd30c1a 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestContainerPlacement.java
@@ -22,7 +22,7 @@
import static org.apache.hadoop.hdds.scm.net.NetConstants.LEAF_SCHEMA;
import static org.apache.hadoop.hdds.scm.net.NetConstants.RACK_SCHEMA;
import static org.apache.hadoop.hdds.scm.net.NetConstants.ROOT_SCHEMA;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
@@ -71,8 +71,8 @@
import org.apache.hadoop.hdds.scm.pipeline.MockPipelineManager;
import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.DBStoreBuilder;
import org.apache.hadoop.ozone.OzoneConsts;
@@ -143,17 +143,14 @@ SCMNodeManager createNodeManager(OzoneConfiguration
config) {
SCMStorageConfig storageConfig = mock(SCMStorageConfig.class);
when(storageConfig.getClusterID()).thenReturn("cluster1");
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
-
when(versionManager.getMetadataLayoutVersion()).thenReturn(maxLayoutVersion());
-
when(versionManager.getSoftwareLayoutVersion()).thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeSchema[] schemas = new NodeSchema[]
{ROOT_SCHEMA, RACK_SCHEMA, LEAF_SCHEMA};
NodeSchemaManager.getInstance().init(schemas, true);
NetworkTopology networkTopology =
new NetworkTopologyImpl(NodeSchemaManager.getInstance());
- SCMNodeManager scmNodeManager = new SCMNodeManager(config, storageConfig,
+ return new SCMNodeManager(config, storageConfig,
eventQueue, networkTopology, SCMContext.emptyContext(),
versionManager);
- return scmNodeManager;
}
ContainerManager createContainerManager()
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeReportHandler.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeReportHandler.java
index ffeec5debe4..e99ebdf48f1 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeReportHandler.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestNodeReportHandler.java
@@ -17,7 +17,7 @@
package org.apache.hadoop.hdds.scm.node;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.mockito.Mockito.mock;
@@ -40,10 +40,10 @@
import org.apache.hadoop.hdds.scm.net.NetworkTopologyImpl;
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.NodeReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.Event;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@@ -71,9 +71,7 @@ public void resetEventCollector() throws IOException {
when(storageConfig.getClusterID()).thenReturn("cluster1");
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
-
when(versionManager.getMetadataLayoutVersion()).thenReturn(maxLayoutVersion());
-
when(versionManager.getSoftwareLayoutVersion()).thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
nodeManager =
new SCMNodeManager(conf, storageConfig, new EventQueue(), clusterMap,
SCMContext.emptyContext(), versionManager);
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestPendingContainerTracker.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestPendingContainerTracker.java
index c747dc7d60a..a9df35f8900 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestPendingContainerTracker.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestPendingContainerTracker.java
@@ -28,6 +28,7 @@
import
org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.StorageReportProto;
import org.apache.hadoop.hdds.scm.HddsTestUtils;
import org.apache.hadoop.hdds.scm.container.ContainerID;
+import org.apache.hadoop.ozone.container.upgrade.UpgradeUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
@@ -58,8 +59,8 @@ public void setUp() throws IOException {
datanodes = new ArrayList<>(NUM_DATANODES);
for (int i = 0; i < NUM_DATANODES; i++) {
datanodes.add(new DatanodeInfo(
- MockDatanodeDetails.randomLocalDatanodeDetails(),
NodeStatus.inServiceHealthy(), null,
- HddsTestUtils.ROLL_INTERVAL_MS_DEFAULT));
+ MockDatanodeDetails.randomLocalDatanodeDetails(),
NodeStatus.inServiceHealthy(),
+ UpgradeUtils.defaultVersionProto(),
HddsTestUtils.ROLL_INTERVAL_MS_DEFAULT));
}
containers = new ArrayList<>(NUM_CONTAINERS);
@@ -126,8 +127,8 @@ public void testRemovePendingAllocation() {
public void testTwoWindowRollAgesOutContainerAfterTwoIntervals() throws
InterruptedException {
long rollMs = 200L;
DatanodeInfo shortDn = new DatanodeInfo(
- MockDatanodeDetails.randomLocalDatanodeDetails(),
NodeStatus.inServiceHealthy(), null,
- rollMs);
+ MockDatanodeDetails.randomLocalDatanodeDetails(),
NodeStatus.inServiceHealthy(),
+ UpgradeUtils.defaultVersionProto(), rollMs);
PendingContainerTracker shortRollTracker = new
PendingContainerTracker(MAX_CONTAINER_SIZE, rollMs, null);
@@ -162,8 +163,8 @@ public void testRemoveNonExistentContainer() {
@Test
public void testUnknownDatanodeHasZeroPendingCount() {
DatanodeInfo unknownDN = new DatanodeInfo(
- MockDatanodeDetails.randomDatanodeDetails(),
NodeStatus.inServiceHealthy(), null,
- HddsTestUtils.ROLL_INTERVAL_MS_DEFAULT);
+ MockDatanodeDetails.randomDatanodeDetails(),
NodeStatus.inServiceHealthy(),
+ UpgradeUtils.defaultVersionProto(),
HddsTestUtils.ROLL_INTERVAL_MS_DEFAULT);
assertEquals(0, unknownDN.getPendingContainerAllocations().getCount());
}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
index 7e29939cd1e..eb5ffda37ac 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java
@@ -38,6 +38,8 @@
import static org.apache.hadoop.hdds.scm.events.SCMEvents.DATANODE_COMMAND;
import static
org.apache.hadoop.hdds.scm.events.SCMEvents.DATANODE_COMMAND_COUNT_UPDATED;
import static org.apache.hadoop.hdds.scm.events.SCMEvents.NEW_NODE;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
+import static
org.apache.hadoop.ozone.container.upgrade.UpgradeUtils.defaultVersionProto;
import static
org.apache.hadoop.ozone.container.upgrade.UpgradeUtils.toVersionProto;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -67,6 +69,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.hadoop.fs.FileUtil;
+import org.apache.hadoop.hdds.HDDSVersion;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.client.RatisReplicationConfig;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
@@ -97,9 +100,10 @@
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.NodeReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
+import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
import org.apache.hadoop.ozone.container.upgrade.UpgradeUtils;
import org.apache.hadoop.ozone.protocol.commands.CloseContainerCommand;
import org.apache.hadoop.ozone.protocol.commands.CommandForDatanode;
@@ -137,19 +141,21 @@ public class TestSCMNodeManager {
private StorageContainerManager scm;
private SCMContext scmContext;
- private static final int MAX_SOFTWARE_VERSION =
HDDSLayoutVersionManager.maxLayoutVersion();
- private static final LayoutVersionProto LARGER_SOFTWARE_PROTO =
- toVersionProto(MAX_SOFTWARE_VERSION, MAX_SOFTWARE_VERSION + 1);
+ private static final LayoutVersionProto LARGER_SOFTWARE_PROTO =
LayoutVersionProto.newBuilder()
+ .setMetadataLayoutVersion(HDDSVersion.SOFTWARE_VERSION.serialize())
+ .setSoftwareLayoutVersion(HDDSVersion.SOFTWARE_VERSION.serialize() + 1)
+ .build();
private static final LayoutVersionProto SMALLER_APPARENT_VERSION_PROTO =
- toVersionProto(MAX_SOFTWARE_VERSION - 1, MAX_SOFTWARE_VERSION);
- // In a real cluster, startup is disallowed if MLV is larger than SLV, so
- // increase both numbers to test smaller SLV or larger MLV.
+ toVersionProto(HDDSLayoutFeature.SCM_HA, HDDSVersion.SOFTWARE_VERSION);
+ // In a real cluster, startup is disallowed if apparent version is larger
than software version, so
+ // increase both numbers to test smaller software version or larger apparent
version.
private static final LayoutVersionProto SMALLER_ALL_VERSIONS_PROTO =
- toVersionProto(MAX_SOFTWARE_VERSION - 1, MAX_SOFTWARE_VERSION - 1);
- private static final LayoutVersionProto LARGER_ALL_VERSIONS_PROTO =
- toVersionProto(MAX_SOFTWARE_VERSION + 1, MAX_SOFTWARE_VERSION + 1);
- private static final LayoutVersionProto MATCHING_VERSION_PROTO =
- toVersionProto(MAX_SOFTWARE_VERSION, MAX_SOFTWARE_VERSION);
+ toVersionProto(HDDSLayoutFeature.SCM_HA, HDDSLayoutFeature.SCM_HA);
+ private static final LayoutVersionProto LARGER_ALL_VERSIONS_PROTO =
LayoutVersionProto.newBuilder()
+ .setMetadataLayoutVersion(HDDSVersion.SOFTWARE_VERSION.serialize() +
1)
+ .setSoftwareLayoutVersion(HDDSVersion.SOFTWARE_VERSION.serialize() +
1)
+ .build();
+ private static final LayoutVersionProto MATCHING_VERSION_PROTO =
defaultVersionProto();
@BeforeEach
public void setup() {
@@ -733,10 +739,10 @@ void testScmHandleJvmPause() throws Exception {
}
@Test
- public void testProcessLayoutVersion() throws IOException {
- testProcessLayoutVersionLowerMlv(true);
- testProcessLayoutVersionLowerMlv(false);
- testProcessLayoutVersionReportHigherMlv();
+ public void testProcessVersionReports() throws IOException {
+ testProcessVersionReportLowerApparentVersion(true);
+ testProcessVersionReportLowerApparentVersion(false);
+ testProcessVersionReportHigherApparentVersion();
}
@Test
@@ -749,27 +755,26 @@ public void
testDatanodeFinalizedCounterTracksVersionReports()
.getNumFinalizedDatanodes(),
"Initial datanode should be counted as finalized");
- int softwareVersion =
- nodeManager.getLayoutVersionManager().getSoftwareLayoutVersion();
- int metadataVersion =
- nodeManager.getLayoutVersionManager().getMetadataLayoutVersion();
+ // Report a pre-finalized datanode.
+ int softwareVersion = HDDSVersion.SOFTWARE_VERSION.serialize();
nodeManager.processVersionReport(node,
LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(metadataVersion - 1)
+
.setMetadataLayoutVersion(HDDSLayoutFeature.INITIAL_VERSION.serialize())
.setSoftwareLayoutVersion(softwareVersion)
.build());
assertEquals(0, nodeManager.getDatanodeFinalizationCounts()
.getNumFinalizedDatanodes(),
- "Lower metadata layout version should decrement finalized count");
+ "Lower apparent version should decrement finalized count");
+ // Report a finalized datanode.
nodeManager.processVersionReport(node,
LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(metadataVersion)
+ .setMetadataLayoutVersion(softwareVersion)
.setSoftwareLayoutVersion(softwareVersion)
.build());
assertEquals(1, nodeManager.getDatanodeFinalizationCounts()
.getNumFinalizedDatanodes(),
- "Restored metadata layout version should restore finalized count");
+ "Restored apparent version should restore finalized count");
}
}
@@ -880,7 +885,7 @@ public void
testDatanodeFinalizedCounterIncludesAllHealthyOpStates(
}
// Currently invoked by testProcessLayoutVersion.
- public void testProcessLayoutVersionReportHigherMlv()
+ public void testProcessVersionReportHigherApparentVersion()
throws IOException {
final int healthCheckInterval = 200; // milliseconds
final int heartbeatInterval = 1; // seconds
@@ -894,73 +899,61 @@ public void testProcessLayoutVersionReportHigherMlv()
SCMStorageConfig scmStorageConfig = mock(SCMStorageConfig.class);
when(scmStorageConfig.getClusterID()).thenReturn("xyz111");
EventPublisher eventPublisher = mock(EventPublisher.class);
- HDDSLayoutVersionManager lvm =
- new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(),
null, null);
+ ScmVersionManager versionManager = mockVersionManager();
+
SCMContext nodeManagerContext = SCMContext.emptyContext();
SCMNodeManager nodeManager = new SCMNodeManager(conf,
scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf),
- nodeManagerContext, lvm);
+ nodeManagerContext, versionManager);
- // Regardless of SCM's finalization checkpoint, datanodes with higher MLV
- // than SCM should not be found in the cluster.
+ // Datanodes should never have higher apparent version than SCM.
DatanodeDetails node1 =
HddsTestUtils.createRandomDatanodeAndRegister(nodeManager);
LogCapturer logCapturer = LogCapturer.captureLogs(SCMNodeManager.class);
- int scmMlv =
- nodeManager.getLayoutVersionManager().getMetadataLayoutVersion();
- int scmSlv =
- nodeManager.getLayoutVersionManager().getSoftwareLayoutVersion();
- nodeManager.processVersionReport(node1,
- LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(scmMlv + 1)
- .setSoftwareLayoutVersion(scmSlv + 1)
- .build());
- assertThat(logCapturer.getOutput())
- .contains("Invalid data node in the cluster");
+ nodeManager.processVersionReport(node1, LARGER_ALL_VERSIONS_PROTO);
+ assertThat(logCapturer.getOutput()).contains("will not be allowed to join
the cluster");
nodeManager.close();
}
// Currently invoked by testProcessLayoutVersion.
- public void testProcessLayoutVersionLowerMlv(boolean mvlLessThanSlv) throws
IOException {
+ public void testProcessVersionReportLowerApparentVersion(boolean
withScmFinalized) {
OzoneConfiguration conf = new OzoneConfiguration();
SCMStorageConfig scmStorageConfig = mock(SCMStorageConfig.class);
when(scmStorageConfig.getClusterID()).thenReturn("xyz111");
EventPublisher eventPublisher = mock(EventPublisher.class);
- int currentVersion = HDDSLayoutVersionManager.maxLayoutVersion();
- if (mvlLessThanSlv) {
- currentVersion -= 1;
+
+ ScmVersionManager versionManager;
+ if (withScmFinalized) {
+ versionManager = mockVersionManager();
+ } else {
+ // Use an apparent version for SCM that is in between SCM's software
version and the datanode's apparent version.
+ versionManager = mockVersionManager(HDDSLayoutFeature.SCM_HA);
}
- HDDSLayoutVersionManager lvm = new
HDDSLayoutVersionManager(currentVersion, null, null);
SCMContext nodeManagerContext = SCMContext.emptyContext();
SCMNodeManager nodeManager = new SCMNodeManager(conf,
scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf),
- nodeManagerContext, lvm);
+ nodeManagerContext, versionManager);
DatanodeDetails node1 =
HddsTestUtils.createRandomDatanodeAndRegister(nodeManager);
verify(eventPublisher,
times(1)).fireEvent(NEW_NODE, node1);
- int scmMlv =
- nodeManager.getLayoutVersionManager().getMetadataLayoutVersion();
nodeManager.processVersionReport(node1,
LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(scmMlv - 1)
- .setSoftwareLayoutVersion(scmMlv)
+
.setMetadataLayoutVersion(HDDSLayoutFeature.INITIAL_VERSION.serialize())
+
.setSoftwareLayoutVersion(versionManager.getSoftwareVersion().serialize())
.build());
ArgumentCaptor<CommandForDatanode> captor =
ArgumentCaptor.forClass(CommandForDatanode.class);
- if (!lvm.needsFinalization()) {
- // If the mlv equals slv checkpoint passed, datanodes with older mlvs
- // should be instructed to finalize.
+ // SCM will only tell datanodes to finalize after it has finalized.
+ if (withScmFinalized) {
verify(eventPublisher, times(1))
.fireEvent(eq(DATANODE_COMMAND), captor.capture());
assertEquals(captor.getValue().getDatanodeId(), node1.getID());
- assertEquals(captor.getValue().getCommand().getType(),
- finalizeNewLayoutVersionCommand);
+ assertEquals(finalizeNewLayoutVersionCommand,
+ captor.getValue().getCommand().getType());
} else {
- // SCM has not finished finalizing its mlv, so datanodes with older
- // mlvs should not be instructed to finalize yet.
verify(eventPublisher, times(0))
.fireEvent(eq(DATANODE_COMMAND), captor.capture());
}
@@ -973,12 +966,10 @@ public void testProcessCommandQueueReport()
SCMStorageConfig scmStorageConfig = mock(SCMStorageConfig.class);
when(scmStorageConfig.getClusterID()).thenReturn("xyz111");
EventPublisher eventPublisher = mock(EventPublisher.class);
- HDDSLayoutVersionManager lvm =
- new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(),
null, null);
createNodeManager(getConf());
SCMNodeManager nodeManager = new SCMNodeManager(conf,
scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf),
- scmContext, lvm);
+ scmContext, mockVersionManager());
DatanodeDetails node1 =
HddsTestUtils.createRandomDatanodeAndRegister(nodeManager);
@@ -2166,11 +2157,10 @@ public void testNodeOperationalStateChange(
SCMStorageConfig scmStorageConfig = mock(SCMStorageConfig.class);
when(scmStorageConfig.getClusterID()).thenReturn("xyz111");
EventPublisher eventPublisher = mock(EventPublisher.class);
- HDDSLayoutVersionManager lvm = new
HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(), null, null);
createNodeManager(getConf());
SCMNodeManager nodeManager = new SCMNodeManager(conf,
scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf),
- scmContext, lvm);
+ scmContext, mockVersionManager());
DatanodeDetails datanode = MockDatanodeDetails.randomDatanodeDetails();
datanode.setPersistedOpState(oldState);
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
index 5a5a9c594a7..bfce2f29097 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeMetrics.java
@@ -18,13 +18,11 @@
package org.apache.hadoop.hdds.scm.node;
import static java.lang.Thread.sleep;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.apache.ozone.test.MetricsAsserts.assertGauge;
import static org.apache.ozone.test.MetricsAsserts.getLongCounter;
import static org.apache.ozone.test.MetricsAsserts.getMetrics;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
@@ -40,8 +38,8 @@
import org.apache.hadoop.hdds.scm.ha.SCMContext;
import org.apache.hadoop.hdds.scm.net.NetworkTopologyImpl;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
@@ -63,9 +61,7 @@ public static void setup() throws Exception {
EventQueue publisher = new EventQueue();
SCMStorageConfig config =
new SCMStorageConfig(NodeType.DATANODE, new File("/tmp"), "storage");
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
-
when(versionManager.getMetadataLayoutVersion()).thenReturn(maxLayoutVersion());
-
when(versionManager.getSoftwareLayoutVersion()).thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
nodeManager = new SCMNodeManager(source, config, publisher,
new NetworkTopologyImpl(source), SCMContext.emptyContext(),
versionManager);
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/ScmUpgradeTestUtils.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/ScmUpgradeTestUtils.java
new file mode 100644
index 00000000000..3d97c639d68
--- /dev/null
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/ScmUpgradeTestUtils.java
@@ -0,0 +1,56 @@
+/*
+ * 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.upgrade;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.hadoop.hdds.ComponentVersion;
+import org.apache.hadoop.hdds.HDDSVersion;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
+
+/**
+ * Utility class to help test SCM upgrade scenarios.
+ */
+public final class ScmUpgradeTestUtils {
+
+ private ScmUpgradeTestUtils() {
+ // Utility class.
+ }
+
+ /**
+ * Constructs a mock ScmVersionManager for an SCM which may be pre-finalized.
+ */
+ public static ScmVersionManager mockVersionManager(ComponentVersion
apparentVersion) {
+ ScmVersionManager manager = mock(ScmVersionManager.class);
+ when(manager.getApparentVersion()).thenReturn(apparentVersion);
+
when(manager.getSoftwareVersion()).thenReturn(HDDSVersion.SOFTWARE_VERSION);
+ when(manager.isAllowed(any(ComponentVersion.class)))
+ .thenAnswer(v -> v.getArgument(0,
ComponentVersion.class).isSupportedBy(apparentVersion));
+
when(manager.needsFinalization()).thenReturn(!HDDSVersion.SOFTWARE_VERSION.equals(apparentVersion));
+ return manager;
+ }
+
+ /**
+ * Constructs a mock ScmVersionManager for a finalized SCM.
+ */
+ public static ScmVersionManager mockVersionManager() {
+ return mockVersionManager(HDDSVersion.SOFTWARE_VERSION);
+ }
+}
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmStartupInvalidApparentVersion.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmStartupInvalidApparentVersion.java
index cb78e35968b..0f678bdf5d7 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmStartupInvalidApparentVersion.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/upgrade/TestScmStartupInvalidApparentVersion.java
@@ -28,21 +28,20 @@
import java.io.IOException;
import java.nio.file.Path;
import java.util.Properties;
+import org.apache.hadoop.hdds.HDDSVersion;
import org.apache.hadoop.hdds.HddsConfigKeys;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.ozone.upgrade.UpgradeTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
/**
- * Ensures SCM does not start when the VERSION file records an apparent
version (still persisted as the layout-version
- * integer) that is not supported by the layout version manager for this build
- * ({@link HDDSLayoutVersionManager} / {@link HDDSLayoutFeature}).
+ * Ensures SCM does not start when the VERSION file records an apparent version
+ * that is larger than the software version.
*/
public class TestScmStartupInvalidApparentVersion {
@@ -74,18 +73,16 @@ private void
assertStartupFailsWithComponentVersionMessage(int serializedApparen
conf.set(ScmConfigKeys.OZONE_SCM_DB_DIRS,
folder.toAbsolutePath().toString());
conf.set(HddsConfigKeys.OZONE_METADATA_DIRS,
folder.toAbsolutePath().toString());
- int softwareLayoutVersion = HDDSLayoutVersionManager.maxLayoutVersion();
-
Properties properties = new Properties();
properties.setProperty(SCM_ID, "scm");
properties.setProperty(SCM_HA, "true");
UpgradeTestUtils.createVersionFile(scmSubdir, HddsProtos.NodeType.SCM,
serializedApparentVersion, properties);
- // TODO update this message when SCM migrated to using HDDSVersionManager.
- String expectedMessage = String.format(
- "Cannot initialize VersionManager. Metadata layout version (%s) >
software layout version (%s)",
- serializedApparentVersion, softwareLayoutVersion);
+ String expectedMessage =
+ "Initialization failed. Disk contains unknown apparent version " +
serializedApparentVersion
+ + " for software version " + HDDSVersion.SOFTWARE_VERSION + ".
Make sure this component was not" +
+ " downgraded after finalization";
IOException ioException =
assertThrows(IOException.class, () -> new
StorageContainerManager(conf));
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
index 6ab15c96aee..5f038f6b7c4 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
@@ -21,6 +21,7 @@
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVICE_INTERVAL;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -31,7 +32,6 @@
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.scm.ScmConfig;
import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
-import org.apache.hadoop.hdds.scm.server.SCMConfigurator;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.ozone.HddsDatanodeService;
import org.apache.hadoop.ozone.MiniOzoneCluster;
@@ -75,10 +75,7 @@ public void cleanup() {
public void init(OzoneConfiguration conf) throws Exception {
- SCMConfigurator configurator = new SCMConfigurator();
- configurator.setUpgradeFinalizationExecutor(null);
-
- conf.setInt(SCMStorageConfig.TESTING_INIT_LAYOUT_VERSION_KEY,
HDDSLayoutFeature.HBASE_SUPPORT.layoutVersion());
+ conf.setInt(SCMStorageConfig.TESTING_INIT_LAYOUT_VERSION_KEY,
HDDSLayoutFeature.HBASE_SUPPORT.serialize());
conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 100,
TimeUnit.MILLISECONDS);
conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 100,
@@ -101,7 +98,6 @@ public void init(OzoneConfiguration conf) throws Exception {
.setSCMServiceId("scmservice")
.setOMServiceId("omServiceId")
.setNumOfOzoneManagers(1)
- .setSCMConfigurator(configurator)
.setNumDatanodes(NUM_DATANODES)
.setDatanodeFactory(UniformDatanodesFactory.newBuilder()
.setLayoutVersion(HDDSLayoutFeature.INITIAL_VERSION.layoutVersion())
@@ -110,8 +106,8 @@ public void init(OzoneConfiguration conf) throws Exception {
scmClient = cluster.getStorageContainerLocationClient();
cluster.waitForClusterToBeReady();
- assertEquals(HDDSLayoutFeature.HBASE_SUPPORT.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+ assertEquals(HDDSLayoutFeature.HBASE_SUPPORT,
+
cluster.getStorageContainerManager().getVersionManager().getApparentVersion());
// Create Volume and Bucket
try (OzoneClient ozoneClient = OzoneClientFactory.getRpcClient(conf)) {
@@ -136,8 +132,8 @@ public void testDataDistributionUpgradeScenario() throws
Exception {
init(new OzoneConfiguration());
// Verify initial state - STORAGE_SPACE_DISTRIBUTION should not be
finalized yet
- assertEquals(HDDSLayoutFeature.HBASE_SUPPORT.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+ assertEquals(HDDSLayoutFeature.HBASE_SUPPORT,
+
cluster.getStorageContainerManager().getVersionManager().getApparentVersion());
// Create some data and delete operations to trigger pending deletion logic
String keyName1 = "testKey1";
@@ -163,8 +159,7 @@ public void testDataDistributionUpgradeScenario() throws
Exception {
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
// Verify finalization completed
- assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+
assertFalse(cluster.getStorageContainerManager().getVersionManager().needsFinalization());
// Create more data and deletions to test post-finalization behavior
String keyName3 = "testKey3";
@@ -198,8 +193,7 @@ public void testMissingPendingDeleteMetadataRecalculation()
throws Exception {
scmClient.finalizeUpgrade();
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
- assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+
assertFalse(cluster.getStorageContainerManager().getVersionManager().needsFinalization());
// Verify the system can handle scenarios where pendingDeleteBlockCount
// might be missing and needs recalculation
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestHddsUpgradeUtils.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestHddsUpgradeUtils.java
index bc9a71b72ac..ae7e091658c 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestHddsUpgradeUtils.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestHddsUpgradeUtils.java
@@ -21,13 +21,16 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
+import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeoutException;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
-import org.apache.hadoop.hdds.scm.container.ContainerInfo;
import org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
+import org.apache.hadoop.hdds.utils.db.CodecException;
+import org.apache.hadoop.hdds.utils.db.RocksDatabaseException;
import org.apache.hadoop.ozone.HddsDatanodeService;
+import org.apache.hadoop.ozone.OzoneConsts;
import
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
import org.apache.hadoop.ozone.container.upgrade.DatanodeVersionManager;
import org.apache.ozone.test.GenericTestUtils;
@@ -52,21 +55,6 @@ public static void
waitForFinalizationFromClient(StorageContainerLocationProtoco
});
}
- /*
- * Helper function to test Pre-Upgrade conditions on the SCM
- */
- public static void testPreUpgradeConditionsSCM(
- List<StorageContainerManager> scms) {
- for (StorageContainerManager scm : scms) {
- assertEquals(HDDSLayoutFeature.INITIAL_VERSION.layoutVersion(),
- scm.getLayoutVersionManager().getMetadataLayoutVersion());
- for (ContainerInfo ci : scm.getContainerManager()
- .getContainers()) {
- assertEquals(HddsProtos.LifeCycleState.OPEN, ci.getState());
- }
- }
- }
-
/*
* Helper function to test Post-Upgrade conditions on the SCM
*/
@@ -81,10 +69,9 @@ public static void testPostUpgradeConditionsSCM(
public static void testPostUpgradeConditionsSCM(StorageContainerManager scm,
int numContainers) {
- HDDSLayoutVersionManager scmVersionManager = scm.getLayoutVersionManager();
- assertEquals(scmVersionManager.getSoftwareLayoutVersion(),
- scmVersionManager.getMetadataLayoutVersion());
-
assertThat(scmVersionManager.getMetadataLayoutVersion()).isGreaterThanOrEqualTo(1);
+ assertEquals(scm.getVersionManager().getSoftwareVersion(),
+ scm.getVersionManager().getApparentVersion());
+
assertThat(scm.getVersionManager().getApparentVersion().serialize()).isGreaterThanOrEqualTo(1);
int countContainers = scm.getContainerManager().getContainers().size();
assertThat(countContainers).isGreaterThanOrEqualTo(numContainers);
@@ -122,4 +109,40 @@ public static void testPostUpgradeConditionsDataNodes(
}
assertThat(countContainers).isGreaterThanOrEqualTo(numContainers);
}
+
+ public static void waitForScmsToFinalize(Collection<StorageContainerManager>
scms)
+ throws Exception {
+ for (StorageContainerManager scm: scms) {
+ // SCM will flush entries to the DB async, the state is kept in memory
and the ratis logs.
+ // In the common case, the apparent version will not appear in the DB at
the time of finalization since the logs
+ // Will not have been flushed.
+ waitForScmToFinalize(scm, false);
+ }
+ }
+
+ public static void waitForScmToFinalize(StorageContainerManager scm, boolean
waitForDBKeyFlush)
+ throws Exception {
+ GenericTestUtils.waitFor(() -> isScmFinalized(scm, waitForDBKeyFlush),
2_000, 60_000);
+ }
+
+ private static boolean isScmFinalized(StorageContainerManager scm, boolean
waitForDBKeyFlush) {
+ boolean exitedSafemode = !scm.isInSafeMode();
+ boolean isFinalized = !scm.getVersionManager().needsFinalization();
+ boolean dbKeyFlushed = false;
+
+ try {
+ dbKeyFlushed =
scm.getScmMetadataStore().getMetaTable().get(OzoneConsts.APPARENT_VERSION_KEY)
!= null;
+ } catch (RocksDatabaseException | CodecException e) {
+ throw new RuntimeException(e);
+ }
+
+ LOG.info("Waiting for SCM {} (leader? {}) to finalize.\n" +
+ "Exited safemode? {}\n" +
+ "version manager finalized? {}\n" +
+ "DB key flushed? {}\n" +
+ "Requiring DB key to flush? {}",
+ scm.getSCMNodeId(), scm.checkLeader(), exitedSafemode, isFinalized,
dbKeyFlushed, waitForDBKeyFlush);
+
+ return exitedSafemode && isFinalized && (!waitForDBKeyFlush ||
dbKeyFlushed);
+ }
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
index b3230ee026b..3339e3c2387 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
@@ -28,6 +28,7 @@
import static org.apache.hadoop.hdds.client.ReplicationType.RATIS;
import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_HEARTBEAT_PROCESS_INTERVAL;
import static
org.apache.hadoop.hdds.scm.block.SCMDeletedBlockTransactionStatusManager.EMPTY_SUMMARY;
+import static
org.apache.hadoop.hdds.upgrade.TestHddsUpgradeUtils.waitForScmsToFinalize;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVICE_INTERVAL;
import static org.apache.hadoop.ozone.common.BlockGroup.SIZE_NOT_AVAILABLE;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -38,7 +39,6 @@
import java.io.IOException;
import java.time.Duration;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -59,7 +59,6 @@
import org.apache.hadoop.hdds.scm.server.SCMConfigurator;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
-import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext;
import org.apache.hadoop.hdds.utils.db.CodecException;
import org.apache.hadoop.hdds.utils.db.RocksDatabaseException;
import org.apache.hadoop.hdds.utils.db.Table;
@@ -76,21 +75,15 @@
import org.apache.hadoop.ozone.client.OzoneVolume;
import org.apache.hadoop.ozone.common.DeletedBlock;
import
org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalizationExecutor;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ozone.test.tag.Flaky;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Tests upgrade finalization failure scenarios and corner cases specific to
SCM data distribution feature.
*/
public class TestScmDataDistributionFinalization {
- private static final Logger LOG =
- LoggerFactory.getLogger(TestScmDataDistributionFinalization.class);
-
private StorageContainerLocationProtocol scmClient;
private MiniOzoneHAClusterImpl cluster;
private static final int NUM_DATANODES = 3;
@@ -101,11 +94,9 @@ public class TestScmDataDistributionFinalization {
private static final long BLOCK_SIZE = 1024 * 1024; // 1 MB
private static final long BLOCKS_PER_TX = 5; // 1 MB
- public void init(OzoneConfiguration conf,
- UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext> executor,
boolean doFinalize) throws Exception {
+ public void init(OzoneConfiguration conf) throws Exception {
SCMConfigurator configurator = new SCMConfigurator();
- configurator.setUpgradeFinalizationExecutor(executor);
conf.setInt(SCMStorageConfig.TESTING_INIT_LAYOUT_VERSION_KEY,
HDDSLayoutFeature.HBASE_SUPPORT.layoutVersion());
conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 100,
TimeUnit.MILLISECONDS);
@@ -142,8 +133,8 @@ public void init(OzoneConfiguration conf,
scmClient = cluster.getStorageContainerLocationClient();
cluster.waitForClusterToBeReady();
- assertEquals(HDDSLayoutFeature.HBASE_SUPPORT.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+ assertEquals(HDDSLayoutFeature.HBASE_SUPPORT,
+
cluster.getStorageContainerManager().getVersionManager().getApparentVersion());
// Create Volume and Bucket
try (OzoneClient ozoneClient = OzoneClientFactory.getRpcClient(conf)) {
@@ -169,15 +160,13 @@ public void shutdown() {
@Test
@Flaky("HDDS-14050")
public void testFinalizationEmptyClusterDataDistribution() throws Exception {
- init(new OzoneConfiguration(), null, true);
+ init(new OzoneConfiguration());
assertEquals(EMPTY_SUMMARY,
cluster.getStorageContainerLocationClient().getDeletedBlockSummary());
scmClient.finalizeUpgrade();
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
// Make sure old leader has caught up and all SCMs have finalized.
waitForScmsToFinalize(cluster.getStorageContainerManagersList());
- assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
TestHddsUpgradeUtils.testPostUpgradeConditionsSCM(
cluster.getStorageContainerManagersList(), 0);
@@ -264,7 +253,7 @@ public void testFinalizationEmptyClusterDataDistribution()
throws Exception {
*/
@Test
public void testFinalizationNonEmptyClusterDataDistribution() throws
Exception {
- init(new OzoneConfiguration(), null, false);
+ init(new OzoneConfiguration());
// stop SCMBlockDeletingService
for (StorageContainerManager scm:
cluster.getStorageContainerManagersList()) {
scm.getScmBlockManager().getSCMBlockDeletingService().stop();
@@ -281,8 +270,6 @@ public void
testFinalizationNonEmptyClusterDataDistribution() throws Exception {
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
// Make sure old leader has caught up and all SCMs have finalized.
waitForScmsToFinalize(cluster.getStorageContainerManagersList());
- assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
TestHddsUpgradeUtils.testPostUpgradeConditionsSCM(
cluster.getStorageContainerManagersList(), 0);
@@ -410,22 +397,6 @@ private long findLastTx() throws RocksDatabaseException,
CodecException {
return lastTxId;
}
- private void waitForScmsToFinalize(Collection<StorageContainerManager> scms)
- throws Exception {
- for (StorageContainerManager scm: scms) {
- waitForScmToFinalize(scm);
- }
- }
-
- private void waitForScmToFinalize(StorageContainerManager scm)
- throws Exception {
- GenericTestUtils.waitFor(() -> !scm.isInSafeMode(), 500, 5000);
- GenericTestUtils.waitFor(() -> {
- LOG.info("Waiting for SCM {} (leader? {}) to finalize.",
scm.getSCMNodeId(), scm.checkLeader());
- return !scm.getLayoutVersionManager().needsFinalization();
- }, 2_000, 60_000);
- }
-
private void flushDBTransactionBuffer(StorageContainerManager scm) throws
IOException {
DBTransactionBuffer dbTxBuffer =
scm.getScmHAManager().getDBTransactionBuffer();
if (dbTxBuffer instanceof SCMHADBTransactionBuffer) {
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmHAFinalization.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmHAFinalization.java
index b5b70eda97b..c024bf3ebb9 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmHAFinalization.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmHAFinalization.java
@@ -17,11 +17,13 @@
package org.apache.hadoop.hdds.upgrade;
+import static
org.apache.hadoop.hdds.upgrade.TestHddsUpgradeUtils.waitForScmToFinalize;
+import static
org.apache.hadoop.hdds.upgrade.TestHddsUpgradeUtils.waitForScmsToFinalize;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
+import org.apache.hadoop.hdds.HDDSVersion;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.scm.ScmConfigKeys;
@@ -30,14 +32,10 @@
import org.apache.hadoop.hdds.scm.server.SCMConfigurator;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
-import org.apache.hadoop.hdds.scm.server.upgrade.FinalizationStateManagerImpl;
-import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext;
import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.MiniOzoneHAClusterImpl;
import org.apache.hadoop.ozone.UniformDatanodesFactory;
-import org.apache.hadoop.ozone.upgrade.DefaultUpgradeFinalizationExecutor;
-import org.apache.hadoop.ozone.upgrade.UpgradeFinalizationExecutor;
-import org.apache.ozone.test.GenericTestUtils;
+import org.apache.hadoop.ozone.upgrade.RatisBasedVersionManager;
import org.apache.ozone.test.GenericTestUtils.LogCapturer;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
@@ -57,12 +55,9 @@ public class TestScmHAFinalization {
private static final int NUM_DATANODES = 3;
private static final int NUM_SCMS = 3;
- public void init(OzoneConfiguration conf,
- UpgradeFinalizationExecutor<SCMUpgradeFinalizationContext> executor,
- int numInactiveSCMs) throws Exception {
+ public void init(OzoneConfiguration conf, int numInactiveSCMs) throws
Exception {
SCMConfigurator configurator = new SCMConfigurator();
- configurator.setUpgradeFinalizationExecutor(executor);
conf.setInt(SCMStorageConfig.TESTING_INIT_LAYOUT_VERSION_KEY,
HDDSLayoutFeature.INITIAL_VERSION.layoutVersion());
conf.set(ScmConfigKeys.OZONE_SCM_HA_RATIS_SERVER_RPC_FIRST_ELECTION_TIMEOUT,
"5s");
@@ -94,7 +89,7 @@ public void shutdown() {
@Test
public void testFinalization() throws Exception {
OzoneConfiguration conf = new OzoneConfiguration();
- init(conf, new DefaultUpgradeFinalizationExecutor<>(), 0);
+ init(conf, 0);
scmClient.finalizeUpgrade();
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
// Ensure all SCMs finalize, indicating the message has been propagated
across them all
@@ -116,9 +111,9 @@ public void testSnapshotFinalization() throws Exception {
conf.setLong(ScmConfigKeys.OZONE_SCM_HA_RATIS_SNAPSHOT_THRESHOLD,
5);
- init(conf, new DefaultUpgradeFinalizationExecutor<>(), numInactiveSCMs);
+ init(conf, numInactiveSCMs);
- LogCapturer logCapture =
LogCapturer.captureLogs(FinalizationStateManagerImpl.class);
+ LogCapturer logCapture =
LogCapturer.captureLogs(RatisBasedVersionManager.class);
StorageContainerManager inactiveScm = cluster.getInactiveSCM().next();
LOG.info("Inactive SCM node ID: {}", inactiveScm.getSCMNodeId());
@@ -154,29 +149,16 @@ public void testSnapshotFinalization() throws Exception {
}
cluster.startInactiveSCM(inactiveScm.getSCMNodeId());
- waitForScmToFinalize(inactiveScm);
+ LOG.info("Waiting for restarted SCM to finalize");
+ // When the leader sends a snapshot to the follower, it should have
flushed all entries to the DB, including the
+ // apparent versin. This means the follower should see it in the DB it
receives immediately to trigger finalization.
+ waitForScmToFinalize(inactiveScm, true);
TestHddsUpgradeUtils.testPostUpgradeConditionsSCM(
inactiveScm, 0);
// Use log to verify a snapshot was installed.
- assertThat(logCapture.getOutput()).contains("New SCM snapshot " +
- "received with metadata layout version");
- }
-
- private void waitForScmsToFinalize(Collection<StorageContainerManager> scms)
- throws Exception {
- for (StorageContainerManager scm: scms) {
- waitForScmToFinalize(scm);
- }
- }
-
- private void waitForScmToFinalize(StorageContainerManager scm)
- throws Exception {
- GenericTestUtils.waitFor(() -> !scm.isInSafeMode(), 500, 5000);
- GenericTestUtils.waitFor(() -> {
- LOG.info("Waiting for SCM {} (leader? {}) to finalize.",
scm.getSCMNodeId(), scm.checkLeader());
- return !scm.getLayoutVersionManager().needsFinalization();
- }, 2_000, 60_000);
+ assertThat(logCapture.getOutput()).contains("New snapshot received with
higher apparent version " +
+ HDDSVersion.SOFTWARE_VERSION + ". Attempting to finalize to that
version.");
}
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmStartupInvalidApparentVersion.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmStartupInvalidApparentVersion.java
index bd4aad16a88..519421413a0 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmStartupInvalidApparentVersion.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOmStartupInvalidApparentVersion.java
@@ -67,7 +67,7 @@ private void
assertStartupFailsWithComponentVersionMessage(int serializedApparen
UpgradeTestUtils.createVersionFile(omSubdir, HddsProtos.NodeType.OM,
serializedApparentVersion);
- MiniOzoneCluster.Builder clusterBuilder =
MiniOzoneCluster.newBuilder(conf);
+ MiniOzoneCluster.Builder clusterBuilder =
MiniOzoneCluster.newBuilder(conf).withoutDatanodes();
String expectedMessage =
"Initialization failed. Disk contains unknown apparent version " +
serializedApparentVersion
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
index aa14184c2b6..257260f4622 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.om.service;
import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.HBASE_SUPPORT;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION;
import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVICE_INTERVAL;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.params.provider.Arguments.arguments;
@@ -98,8 +97,7 @@ public static void init() throws Exception {
.build();
cluster.waitForClusterToBeReady();
scmClient = cluster.getStorageContainerLocationClient();
- assertEquals(HBASE_SUPPORT.ordinal(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
+ assertEquals(HBASE_SUPPORT,
cluster.getStorageContainerManager().getVersionManager().getApparentVersion());
metrics =
cluster.getStorageContainerManager().getBlockProtocolServer().getMetrics();
OzoneClient ozoneClient = cluster.newClient();
@@ -140,8 +138,6 @@ public void testDeleteKeyQuotaWithUpgrade() throws
Exception {
// UPGRADE SCM (if specified)
scmClient.finalizeUpgrade();
TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient);
- assertEquals(STORAGE_SPACE_DISTRIBUTION.ordinal(),
-
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
// POST-UPGRADE
//Step 6: Repeat the same steps in pre-upgrade
diff --git a/hadoop-ozone/recon/pom.xml b/hadoop-ozone/recon/pom.xml
index ecaf38d8de6..9dacdf1f8ca 100644
--- a/hadoop-ozone/recon/pom.xml
+++ b/hadoop-ozone/recon/pom.xml
@@ -296,6 +296,12 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.ozone</groupId>
+ <artifactId>hdds-server-scm</artifactId>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.apache.ozone</groupId>
<artifactId>hdds-test-utils</artifactId>
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeMetadata.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeMetadata.java
index 324ce4f38d9..b8fb46d294d 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeMetadata.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/types/DatanodeMetadata.java
@@ -84,9 +84,9 @@ public final class DatanodeMetadata {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String revision;
- @XmlElement(name = "layoutVersion")
+ @XmlElement(name = "apparentVersion")
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
- private int layoutVersion;
+ private int apparentVersion;
@XmlElement(name = "networkLocation")
@JsonInclude(JsonInclude.Include.NON_NULL)
@@ -106,7 +106,7 @@ private DatanodeMetadata(Builder builder) {
this.version = builder.version;
this.setupTime = builder.setupTime;
this.revision = builder.revision;
- this.layoutVersion = builder.layoutVersion;
+ this.apparentVersion = builder.apparentVersion;
this.networkLocation = builder.networkLocation;
}
@@ -162,8 +162,8 @@ public String getRevision() {
return revision;
}
- public int getLayoutVersion() {
- return layoutVersion;
+ public int getApparentVersion() {
+ return apparentVersion;
}
public String getNetworkLocation() {
@@ -196,7 +196,7 @@ public static final class Builder {
private String version;
private long setupTime;
private String revision;
- private int layoutVersion;
+ private int apparentVersion;
private String networkLocation;
public Builder() {
@@ -260,7 +260,7 @@ public Builder setDatanode(DatanodeInfo datanode) {
this.version = datanode.getVersion();
this.revision = datanode.getRevision();
- this.layoutVersion =
datanode.getLastKnownLayoutVersion().getMetadataLayoutVersion();
+ this.apparentVersion =
datanode.getLastKnownApparentVersion().serialize();
this.setupTime = datanode.getSetupTime();
return this;
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java
index e5cdf65c910..0eacc90936b 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconNodeManager.java
@@ -47,12 +47,13 @@
import org.apache.hadoop.hdds.scm.node.SCMNodeManager;
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.HddsServerUtil;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.TableIterator;
+import org.apache.hadoop.ozone.container.upgrade.UpgradeUtils;
import org.apache.hadoop.ozone.protocol.VersionResponse;
import org.apache.hadoop.ozone.protocol.commands.CommandForDatanode;
import org.apache.hadoop.ozone.protocol.commands.RegisteredCommand;
@@ -89,9 +90,9 @@ public ReconNodeManager(OzoneConfiguration conf,
EventPublisher eventPublisher,
NetworkTopology networkTopology,
Table<DatanodeID, DatanodeDetails> nodeDB,
- HDDSLayoutVersionManager scmLayoutVersionManager) {
+ ScmVersionManager versionManager) {
super(conf, scmStorageConfig, eventPublisher, networkTopology,
- SCMContext.emptyContext(), scmLayoutVersionManager);
+ SCMContext.emptyContext(), versionManager);
final int reconStaleDatanodeMultiplier = 3;
this.reconDatanodeOutdatedTime = reconStaleDatanodeMultiplier *
HddsServerUtil.getReconHeartbeatInterval(conf);
@@ -100,8 +101,8 @@ public ReconNodeManager(OzoneConfiguration conf,
public ReconNodeManager(OzoneConfiguration conf, SCMStorageConfig
scmStorageConfig, EventQueue eventQueue,
NetworkTopology clusterMap, Table<DatanodeID,
DatanodeDetails> table,
- HDDSLayoutVersionManager scmLayoutVersionManager,
ReconContext reconContext) {
- this(conf, scmStorageConfig, eventQueue, clusterMap, table,
scmLayoutVersionManager);
+ ScmVersionManager versionManager, ReconContext
reconContext) {
+ this(conf, scmStorageConfig, eventQueue, clusterMap, table,
versionManager);
this.reconContext = reconContext;
loadExistingNodes();
}
@@ -112,13 +113,7 @@ private void loadExistingNodes() {
int nodeCount = 0;
while (iterator.hasNext()) {
DatanodeDetails datanodeDetails = iterator.next().getValue();
- register(datanodeDetails, null, null,
- LayoutVersionProto.newBuilder()
- .setMetadataLayoutVersion(
- HDDSLayoutVersionManager.maxLayoutVersion())
- .setSoftwareLayoutVersion(
- HDDSLayoutVersionManager.maxLayoutVersion())
- .build());
+ register(datanodeDetails, null, null,
UpgradeUtils.defaultVersionProto());
nodeCount++;
}
LOG.info("Loaded {} nodes from node DB.", nodeCount);
@@ -212,7 +207,7 @@ public void refreshAllHealthyDnUsageInfo() {
public RegisteredCommand register(
DatanodeDetails datanodeDetails, NodeReportProto nodeReport,
PipelineReportsProto pipelineReportsProto,
- LayoutVersionProto layoutInfo) {
+ LayoutVersionProto dnVersionInfo) {
if (isNodeRegistered(datanodeDetails)) {
try {
nodeDB.put(datanodeDetails.getID(), datanodeDetails);
@@ -223,7 +218,7 @@ public RegisteredCommand register(
}
try {
RegisteredCommand registeredCommand = super.register(datanodeDetails,
nodeReport, pipelineReportsProto,
- layoutInfo);
+ dnVersionInfo);
reconContext.updateHealthStatus(new AtomicBoolean(true));
reconContext.getErrors().remove(ReconContext.ErrorCode.INVALID_NETWORK_TOPOLOGY);
return registeredCommand;
@@ -298,31 +293,9 @@ public void removeNode(DatanodeDetails datanodeDetails)
throws NodeNotFoundExcep
@Override
protected void sendFinalizeToDatanodeIfNeeded(DatanodeDetails
datanodeDetails,
- LayoutVersionProto layoutVersionReport) {
- // Recon should do nothing here.
- int scmSlv = getLayoutVersionManager().getSoftwareLayoutVersion();
- int scmMlv = getLayoutVersionManager().getMetadataLayoutVersion();
- int dnSlv = layoutVersionReport.getSoftwareLayoutVersion();
- int dnMlv = layoutVersionReport.getMetadataLayoutVersion();
-
- if (dnSlv > scmSlv) {
- LOG.error("Invalid data node reporting to Recon : {}. " +
- "DataNode SoftwareLayoutVersion = {}, Recon/SCM " +
- "SoftwareLayoutVersion = {}",
- datanodeDetails.getHostName(), dnSlv, scmSlv);
- }
-
- if (scmMlv == scmSlv) {
- // Recon metadata is finalised.
- if (dnMlv < scmMlv) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Data node {} reports a lower MLV than Recon "
- + "DataNode MetadataLayoutVersion = {}, Recon/SCM "
- + "MetadataLayoutVersion = {}. SCM needs to finalize this
DN",
- datanodeDetails.getHostName(), dnMlv, scmMlv);
- }
- }
- }
-
+ LayoutVersionProto versionReport) {
+ // Recon will not send commands to datanodes, but it should still log if a
datanode with an invalid version is
+ // heartbeating.
+ shouldFenceDatanode(datanodeDetails, versionReport);
}
}
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java
index f44d4e57a1a..466bc50878a 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java
@@ -98,9 +98,9 @@
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.ContainerReportFromDatanode;
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.IncrementalContainerReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
import
org.apache.hadoop.hdds.server.events.FixedThreadPoolWithAffinityExecutor;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.IOUtils;
import org.apache.hadoop.hdds.utils.db.DBCheckpoint;
import org.apache.hadoop.hdds.utils.db.DBStore;
@@ -215,8 +215,8 @@ public
ReconStorageContainerManagerFacade(OzoneConfiguration conf,
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
this.dbStore = DBStoreBuilder.createDBStore(ozoneConfiguration,
ReconSCMDBDefinition.get());
- HDDSLayoutVersionManager scmLayoutVersionManager =
- new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(),
null, null);
+ // TODO HDDS-15374 Fully switch recon to the new versioning framework.
+ ScmVersionManager versionManager = new ScmVersionManager(scmStorageConfig,
this);
this.scmhaManager = SCMHAManagerStub.getInstance(
true, new SCMDBTransactionBufferImpl());
this.sequenceIdGen = new SequenceIdGenerator(
@@ -225,7 +225,7 @@ public
ReconStorageContainerManagerFacade(OzoneConfiguration conf,
this.nodeManager =
new ReconNodeManager(conf, scmStorageConfig, eventQueue, clusterMap,
ReconSCMDBDefinition.NODES.getTable(dbStore),
- scmLayoutVersionManager, reconContext);
+ versionManager, reconContext);
SCMContainerPlacementMetrics placementMetrics =
SCMContainerPlacementMetrics.create();
PlacementPolicy containerPlacementPolicy =
ContainerPlacementPolicyFactory.getPolicy(conf, nodeManager,
clusterMap, true, placementMetrics);
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
index 04cdb2751aa..7b28bd793d2 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
@@ -654,7 +654,7 @@ private void testDatanodeResponse(DatanodeMetadata
datanodeMetadata)
fail(String.format("Datanode %s not registered",
hostname));
}
- assertEquals(HDDSVersion.SOFTWARE_VERSION.serialize(),
datanodeMetadata.getLayoutVersion());
+ assertEquals(HDDSVersion.SOFTWARE_VERSION.serialize(),
datanodeMetadata.getApparentVersion());
}
@Test
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
index 33e20413bfd..153519ecc33 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/AbstractReconContainerManagerTest.java
@@ -21,7 +21,7 @@
import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.ONE;
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_NAMES;
import static org.apache.hadoop.hdds.scm.metadata.SCMDBDefinition.CONTAINERS;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_METADATA_DIRS;
import static
org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline;
import static org.mockito.Mockito.mock;
@@ -52,8 +52,8 @@
import org.apache.hadoop.hdds.scm.node.SCMNodeManager;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.DBStoreBuilder;
import org.apache.hadoop.hdds.utils.db.Table;
@@ -89,13 +89,9 @@ public void setUp(@TempDir File tempDir) throws Exception {
SCMStorageConfig scmStorageConfig = new ReconStorageConfig(conf, new
ReconUtils());
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
- HDDSLayoutVersionManager layoutVersionManager =
mock(HDDSLayoutVersionManager.class);
- when(layoutVersionManager.getSoftwareLayoutVersion())
- .thenReturn(maxLayoutVersion());
- when(layoutVersionManager.getMetadataLayoutVersion())
- .thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig,
- eventQueue, clusterMap, scmContext, layoutVersionManager);
+ eventQueue, clusterMap, scmContext, versionManager);
pipelineManager = ReconPipelineManager.newReconPipelineManager(
conf,
nodeManager,
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconIncrementalContainerReportHandler.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconIncrementalContainerReportHandler.java
index 78f9bbceafc..2ec3c5b1b5d 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconIncrementalContainerReportHandler.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconIncrementalContainerReportHandler.java
@@ -19,7 +19,7 @@
import static
org.apache.hadoop.hdds.protocol.MockDatanodeDetails.randomDatanodeDetails;
import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState.OPEN;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.any;
@@ -51,9 +51,9 @@
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
import
org.apache.hadoop.hdds.scm.server.SCMDatanodeHeartbeatDispatcher.IncrementalContainerReportFromDatanode;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventPublisher;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.ozone.recon.TestReconUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@@ -93,11 +93,7 @@ public void testProcessICR(@TempDir Path scmPath)
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
SCMStorageConfig storageConfig = new SCMStorageConfig(conf);
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
- when(versionManager.getMetadataLayoutVersion())
- .thenReturn(maxLayoutVersion());
- when(versionManager.getSoftwareLayoutVersion())
- .thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeManager nodeManager = new SCMNodeManager(conf, storageConfig,
eventQueue, clusterMap, SCMContext.emptyContext(), versionManager);
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java
index adb09e4ad90..c1315cee114 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java
@@ -35,6 +35,7 @@
import java.io.IOException;
import java.nio.file.Path;
+import java.util.HashMap;
import java.util.List;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.DatanodeDetails;
@@ -45,8 +46,9 @@
import org.apache.hadoop.hdds.scm.net.NetworkTopology;
import org.apache.hadoop.hdds.scm.net.NetworkTopologyImpl;
import org.apache.hadoop.hdds.scm.node.states.NodeNotFoundException;
+import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.DBStoreBuilder;
import org.apache.hadoop.hdds.utils.db.Table;
@@ -71,7 +73,7 @@ public class TestReconNodeManager {
private OzoneConfiguration conf;
private DBStore store;
- private HDDSLayoutVersionManager versionManager;
+ private ScmVersionManager versionManager;
private ReconContext reconContext;
@BeforeEach
@@ -81,8 +83,8 @@ public void setUp() throws Exception {
conf.set(OZONE_SCM_NAMES, "localhost");
ReconUtils reconUtils = new ReconUtils();
ReconStorageConfig reconStorageConfig = new ReconStorageConfig(conf,
reconUtils);
- versionManager = new HDDSLayoutVersionManager(
- reconStorageConfig.getApparentVersion(), null, null);
+ versionManager = new ScmVersionManager(reconStorageConfig,
+ mock(OzoneStorageContainerManager.class), HashMap::new);
store = DBStoreBuilder.createDBStore(conf, ReconSCMDBDefinition.get());
reconContext = new ReconContext(conf, reconUtils);
}
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconPipelineManager.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconPipelineManager.java
index f837d1a41fd..86b0e48417f 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconPipelineManager.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconPipelineManager.java
@@ -19,7 +19,7 @@
import static
org.apache.hadoop.hdds.protocol.MockDatanodeDetails.randomDatanodeDetails;
import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_NAMES;
-import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
+import static
org.apache.hadoop.hdds.scm.upgrade.ScmUpgradeTestUtils.mockVersionManager;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_METADATA_DIRS;
import static
org.apache.hadoop.ozone.recon.OMMetadataManagerTestUtils.getRandomPipeline;
import static org.assertj.core.api.Assertions.assertThat;
@@ -57,8 +57,8 @@
import org.apache.hadoop.hdds.scm.safemode.SCMSafeModeManager;
import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
+import org.apache.hadoop.hdds.scm.server.upgrade.ScmVersionManager;
import org.apache.hadoop.hdds.server.events.EventQueue;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.hdds.utils.db.DBStoreBuilder;
import org.apache.hadoop.ozone.recon.ReconUtils;
@@ -129,11 +129,7 @@ public void testInitialize() throws IOException,
TimeoutException {
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
- when(versionManager.getMetadataLayoutVersion())
- .thenReturn(maxLayoutVersion());
- when(versionManager.getSoftwareLayoutVersion())
- .thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig,
eventQueue, clusterMap, SCMContext.emptyContext(), versionManager);
@@ -183,11 +179,7 @@ public void testAddPipeline() throws IOException,
TimeoutException {
Pipeline pipeline = getRandomPipeline();
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
- when(versionManager.getMetadataLayoutVersion())
- .thenReturn(maxLayoutVersion());
- when(versionManager.getSoftwareLayoutVersion())
- .thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig,
eventQueue, clusterMap, SCMContext.emptyContext(), versionManager);
@@ -210,9 +202,7 @@ public void testDuplicatePipelineHandling() throws
IOException {
Pipeline pipeline = getRandomPipeline();
NetworkTopology clusterMap = new NetworkTopologyImpl(conf);
EventQueue eventQueue = new EventQueue();
- HDDSLayoutVersionManager versionManager =
mock(HDDSLayoutVersionManager.class);
-
when(versionManager.getMetadataLayoutVersion()).thenReturn(maxLayoutVersion());
-
when(versionManager.getSoftwareLayoutVersion()).thenReturn(maxLayoutVersion());
+ ScmVersionManager versionManager = mockVersionManager();
NodeManager nodeManager =
new SCMNodeManager(conf, scmStorageConfig, eventQueue, clusterMap,
SCMContext.emptyContext(), versionManager);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]