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 04d44dedcaa HDDS-15484. Decouple ComponentVersionManager from Storage
(#10437)
04d44dedcaa is described below
commit 04d44dedcaa23926513cdac62de980e00c98cad0
Author: Ethan Rose <[email protected]>
AuthorDate: Fri Jun 12 10:14:29 2026 -0400
HDDS-15484. Decouple ComponentVersionManager from Storage (#10437)
Co-authored-by: Cursor <[email protected]>
---
.../container/upgrade/DatanodeVersionManager.java | 16 +++++++-
.../upgrade/TestDatanodeVersionManager.java | 2 +-
.../ozone/upgrade/ComponentVersionManager.java | 48 ++++++++++++----------
.../ozone/upgrade/RatisBasedVersionManager.java | 6 +--
.../AbstractComponentVersionManagerTest.java | 22 ++++------
.../hadoop/hdds/scm/server/SCMStorageConfig.java | 3 +-
.../hdds/scm/server/upgrade/ScmVersionManager.java | 15 ++++++-
.../scm/server/upgrade/TestScmVersionManager.java | 1 +
.../hadoop/ozone/om/upgrade/OMVersionManager.java | 15 ++++++-
.../ozone/om/upgrade/TestOMVersionManager.java | 2 +-
10 files changed, 83 insertions(+), 47 deletions(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeVersionManager.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeVersionManager.java
index ec763575c22..a4a762ffa27 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeVersionManager.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeVersionManager.java
@@ -36,6 +36,7 @@
*/
public class DatanodeVersionManager extends ComponentVersionManager {
+ private final DatanodeStorage storage;
private final Map<ComponentVersion, DatanodeUpgradeAction> upgradeActions;
private final DatanodeStateMachine upgradeActionArg;
@@ -46,13 +47,24 @@ public DatanodeVersionManager(DatanodeStorage storage,
DatanodeStateMachine upgr
@VisibleForTesting
public DatanodeVersionManager(DatanodeStorage storage, DatanodeStateMachine
upgradeActionArg,
ComponentUpgradeActionProvider<DatanodeUpgradeAction>
upgradeActionProvider) throws IOException {
- super(storage,
-
HDDSVersionUtils.deserializedPersistedApparentVersion(storage.getApparentVersion()),
+
super(HDDSVersionUtils.deserializedPersistedApparentVersion(storage.getApparentVersion()),
HDDSVersion.SOFTWARE_VERSION);
+ this.storage = storage;
this.upgradeActionArg = upgradeActionArg;
upgradeActions = upgradeActionProvider.load();
}
+ @Override
+ protected void persistApparentVersion(ComponentVersion newVersion) throws
IOException {
+ storage.setApparentVersion(newVersion.serialize());
+ storage.persistCurrentState();
+ }
+
+ @Override
+ public int getPersistedApparentVersion() {
+ return storage.getApparentVersion();
+ }
+
@VisibleForTesting
public Map<ComponentVersion, DatanodeUpgradeAction>
getUpgradeActionsForTesting() {
return upgradeActions;
diff --git
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeVersionManager.java
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeVersionManager.java
index 840fcf2aee0..d3c9f7802d3 100644
---
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeVersionManager.java
+++
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/TestDatanodeVersionManager.java
@@ -216,7 +216,7 @@ public void testPersistFailureRollsBack() throws Exception {
UpgradeException thrown = assertThrows(UpgradeException.class,
versionManager::finalizeUpgrade);
assertEquals(UpgradeException.ResultCodes.APPARENT_VERSION_UPDATE_FAILED,
thrown.getResult());
assertEquals(INITIAL_VERSION, versionManager.getApparentVersion());
- assertEquals(INITIAL_VERSION.serialize(), storage.getApparentVersion());
+ assertEquals(INITIAL_VERSION.serialize(),
versionManager.getPersistedApparentVersion());
}
}
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java
index b2f6c7e6c61..5ab47c4e7f1 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentVersionManager.java
@@ -25,7 +25,6 @@
import java.util.Iterator;
import java.util.NoSuchElementException;
import org.apache.hadoop.hdds.ComponentVersion;
-import org.apache.hadoop.ozone.common.Storage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -55,13 +54,11 @@ public abstract class ComponentVersionManager implements
Closeable {
// Software version will never change.
private final ComponentVersion softwareVersion;
private final ComponentVersionManagerMetrics metrics;
- private final Storage storage;
private static final Logger LOG =
LoggerFactory.getLogger(ComponentVersionManager.class);
- protected ComponentVersionManager(Storage storage, ComponentVersion
apparentVersion,
+ protected ComponentVersionManager(ComponentVersion apparentVersion,
ComponentVersion softwareVersion) {
- this.storage = storage;
this.apparentVersion = apparentVersion;
this.softwareVersion = softwareVersion;
@@ -87,20 +84,20 @@ public boolean needsFinalization() {
}
/**
- * Test-only accessor for the {@link Storage} instance supplied to the
constructor.
+ * Returns the apparent version currently persisted in storage.
*/
@VisibleForTesting
- protected Storage getStorageForTesting() {
- return storage;
- }
+ public abstract int getPersistedApparentVersion();
public void finalizeUpgrade() throws UpgradeException {
- for (ComponentVersion version : getUnfinalizedVersions()) {
- validateForFinalization(version);
- runUpgradeAction(version);
- persistApparentVersion(version);
-
- LOG.info("Version {} has been finalized.", version);
+ ComponentVersion prevVersion = apparentVersion;
+ for (ComponentVersion newVersion : getUnfinalizedVersions()) {
+ validateForFinalization(newVersion);
+ runUpgradeAction(newVersion);
+ persistApparentVersion(newVersion, prevVersion);
+ prevVersion = newVersion;
+
+ LOG.info("Version {} has been finalized.", newVersion);
}
LOG.info("Finalization is complete.");
}
@@ -155,20 +152,27 @@ private void validateForFinalization(ComponentVersion
newApparentVersion) {
}
}
- private void persistApparentVersion(ComponentVersion version) throws
UpgradeException {
- int prevVersion = storage.getApparentVersion();
-
- storage.setApparentVersion(version.serialize());
+ private void persistApparentVersion(ComponentVersion newVersion,
ComponentVersion prevVersion)
+ throws UpgradeException {
try {
- storage.persistCurrentState();
+ persistApparentVersion(newVersion);
} catch (IOException e) {
- storage.setApparentVersion(prevVersion);
- logAndThrow(e, "Updating version in the VERSION file from " +
prevVersion + " to " + version +
+ if (prevVersion != null) {
+ try {
+ persistApparentVersion(prevVersion);
+ } catch (IOException rollbackFailure) {
+ LOG.warn("Failed to roll back apparent version to {} after persist
failure.", prevVersion,
+ rollbackFailure);
+ }
+ }
+ logAndThrow(e, "Updating version in the VERSION file from " +
prevVersion + " to " + newVersion +
" failed.", APPARENT_VERSION_UPDATE_FAILED);
}
- apparentVersion = version;
+ apparentVersion = newVersion;
}
+ protected abstract void persistApparentVersion(ComponentVersion newVersion)
throws IOException;
+
protected void logAndThrow(Exception e, String msg,
UpgradeException.ResultCodes resultCode) throws UpgradeException {
LOG.error(msg, e);
throw new UpgradeException(msg, e, resultCode);
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/RatisBasedVersionManager.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/RatisBasedVersionManager.java
index 74ba51a09da..25f13ca40c3 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/RatisBasedVersionManager.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/RatisBasedVersionManager.java
@@ -22,7 +22,6 @@
import java.io.IOException;
import org.apache.hadoop.hdds.ComponentVersion;
import org.apache.hadoop.hdds.utils.db.Table;
-import org.apache.hadoop.ozone.common.Storage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,9 +32,8 @@ public abstract class RatisBasedVersionManager extends
ComponentVersionManager {
private static final Logger LOG =
LoggerFactory.getLogger(RatisBasedVersionManager.class);
- protected RatisBasedVersionManager(Storage storage, ComponentVersion
apparentVersion,
- ComponentVersion softwareVersion) {
- super(storage, apparentVersion, softwareVersion);
+ protected RatisBasedVersionManager(ComponentVersion apparentVersion,
ComponentVersion softwareVersion) {
+ super(apparentVersion, softwareVersion);
}
public void validateDBVersion(Table<String, String> finalizationStore)
throws IOException {
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/AbstractComponentVersionManagerTest.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/AbstractComponentVersionManagerTest.java
index 9eb0eb7e3de..9b2267743e0 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/AbstractComponentVersionManagerTest.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/AbstractComponentVersionManagerTest.java
@@ -29,7 +29,6 @@
import org.apache.hadoop.hdds.ComponentVersion;
import org.apache.hadoop.metrics2.MetricsRecordBuilder;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
-import org.apache.hadoop.ozone.common.Storage;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -38,17 +37,16 @@
/**
* Shared tests for concrete {@link ComponentVersionManager} implementations.
*
- * <p>Each subclass {@linkplain #createManager(int) builds} the version
manager with a real {@link Storage}
- * instance rooted under a JUnit temporary directory (see for example {@code
TestOMStorage} in ozone-manager).
- * Assertions use {@link ComponentVersionManager#getStorageForTesting()} and
{@link Storage#getApparentVersion()}
- * to confirm what was persisted, instead of Mockito interaction verification.
+ * <p>Each subclass {@linkplain #createManager(int) builds} the version
manager with real storage rooted under a JUnit
+ * temporary directory (see for example {@code TestOMStorage} in
ozone-manager). Assertions use
+ * {@link ComponentVersionManager#getPersistedApparentVersion()} to confirm
what was persisted, instead of Mockito
+ * interaction verification.
*/
public abstract class AbstractComponentVersionManagerTest {
/**
- * Creates a new manager for {@code serializedApparentVersion}. The
implementation must initialize real
- * {@link Storage} on disk with that apparent version (and return a manager
whose
- * {@link ComponentVersionManager#getStorageForTesting()} is that instance).
+ * Creates a new manager for {@code serializedApparentVersion}. The
implementation must initialize real storage on
+ * disk with that apparent version.
*/
protected abstract ComponentVersionManager createManager(int
serializedApparentVersion) throws IOException;
@@ -112,8 +110,7 @@ public void
testFinalizationFromEarlierVersions(ComponentVersion apparentVersion
assertApparentVersion(versionManager, expectedSoftwareVersion());
assertFalse(versionManager.needsFinalization());
- Storage storage = versionManager.getStorageForTesting();
- assertEquals(expectedSoftwareVersion().serialize(),
storage.getApparentVersion(),
+ assertEquals(expectedSoftwareVersion().serialize(),
versionManager.getPersistedApparentVersion(),
"Storage apparent version should match software version after
finalization");
}
}
@@ -124,13 +121,12 @@ public void testFinalizationFromSoftwareVersionNoOp()
throws Exception {
assertApparentVersion(versionManager, expectedSoftwareVersion());
assertFalse(versionManager.needsFinalization());
- Storage storage = versionManager.getStorageForTesting();
- int apparentOnStorageBefore = storage.getApparentVersion();
+ int apparentOnStorageBefore =
versionManager.getPersistedApparentVersion();
versionManager.finalizeUpgrade();
assertApparentVersion(versionManager, expectedSoftwareVersion());
assertFalse(versionManager.needsFinalization());
- assertEquals(apparentOnStorageBefore, storage.getApparentVersion(),
+ assertEquals(apparentOnStorageBefore,
versionManager.getPersistedApparentVersion(),
"No-op finalize should not change the persisted apparent version");
}
}
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 3f42861777e..ffd08d86497 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
@@ -47,8 +47,7 @@ public class SCMStorageConfig extends Storage {
*/
public SCMStorageConfig(OzoneConfiguration conf) throws IOException {
super(NodeType.SCM, ServerUtils.getScmDbDir(conf), STORAGE_DIR,
- getInitApparentVersion(conf, TESTING_INIT_APPARENT_VERSION_KEY,
- HDDSVersion.SOFTWARE_VERSION::serialize));
+ getInitApparentVersion(conf, TESTING_INIT_APPARENT_VERSION_KEY,
HDDSVersion.SOFTWARE_VERSION::serialize));
}
public SCMStorageConfig(NodeType type, File root, String sdName)
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmVersionManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmVersionManager.java
index 7d28a332850..18e5dbe3179 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmVersionManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmVersionManager.java
@@ -36,6 +36,7 @@
*/
public class ScmVersionManager extends RatisBasedVersionManager {
+ private final SCMStorageConfig storage;
private final Map<ComponentVersion, ScmUpgradeAction> upgradeActions;
private final OzoneStorageContainerManager upgradeActionArg;
@@ -48,12 +49,24 @@ public ScmVersionManager(SCMStorageConfig storage,
OzoneStorageContainerManager upgradeActionArg,
ComponentUpgradeActionProvider<ScmUpgradeAction> upgradeActionProvider)
throws IOException {
- super(storage,
HDDSVersionUtils.deserializedPersistedApparentVersion(storage.getApparentVersion()),
+
super(HDDSVersionUtils.deserializedPersistedApparentVersion(storage.getApparentVersion()),
HDDSVersion.SOFTWARE_VERSION);
+ this.storage = storage;
this.upgradeActionArg = upgradeActionArg;
upgradeActions = upgradeActionProvider.load();
}
+ @Override
+ protected void persistApparentVersion(ComponentVersion newVersion) throws
IOException {
+ storage.setApparentVersion(newVersion.serialize());
+ storage.persistCurrentState();
+ }
+
+ @Override
+ public int getPersistedApparentVersion() {
+ return storage.getApparentVersion();
+ }
+
@VisibleForTesting
public Map<ComponentVersion, ScmUpgradeAction> getUpgradeActionsForTesting()
{
return upgradeActions;
diff --git
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/TestScmVersionManager.java
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/TestScmVersionManager.java
index c112217f80e..0801ac1a01d 100644
---
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/TestScmVersionManager.java
+++
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/TestScmVersionManager.java
@@ -212,6 +212,7 @@ public void testPersistFailureRollsBack() throws Exception {
UpgradeException thrown = assertThrows(UpgradeException.class,
versionManager::finalizeUpgrade);
assertEquals(UpgradeException.ResultCodes.APPARENT_VERSION_UPDATE_FAILED,
thrown.getResult());
assertEquals(INITIAL_VERSION, versionManager.getApparentVersion());
+ assertEquals(INITIAL_VERSION.serialize(),
versionManager.getPersistedApparentVersion());
assertEquals(INITIAL_VERSION.serialize(), storage.getApparentVersion());
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMVersionManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMVersionManager.java
index 4d6547792c0..f03e14819d6 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMVersionManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMVersionManager.java
@@ -33,6 +33,7 @@
*/
public class OMVersionManager extends RatisBasedVersionManager {
+ private final OMStorage storage;
private final Map<ComponentVersion, OmUpgradeAction> upgradeActions;
// The OM may not be fully initialized when the version manager is
constructed. This field is just provided as an
@@ -46,11 +47,23 @@ public OMVersionManager(OMStorage storage, OzoneManager
upgradeActionArg) throws
@VisibleForTesting
public OMVersionManager(OMStorage storage, OzoneManager upgradeActionArg,
ComponentUpgradeActionProvider<OmUpgradeAction> upgradeActionProvider)
throws IOException {
- super(storage,
computeApparentVersionInternal(storage.getApparentVersion()),
OzoneManagerVersion.SOFTWARE_VERSION);
+ super(computeApparentVersionInternal(storage.getApparentVersion()),
OzoneManagerVersion.SOFTWARE_VERSION);
+ this.storage = storage;
this.upgradeActionArg = upgradeActionArg;
upgradeActions = upgradeActionProvider.load();
}
+ @Override
+ protected void persistApparentVersion(ComponentVersion newVersion) throws
IOException {
+ storage.setApparentVersion(newVersion.serialize());
+ storage.persistCurrentState();
+ }
+
+ @Override
+ public int getPersistedApparentVersion() {
+ return storage.getApparentVersion();
+ }
+
@VisibleForTesting
public Map<ComponentVersion, OmUpgradeAction> getUpgradeActionsForTesting() {
return upgradeActions;
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
index 6d232e85be9..b1df2fc62fb 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMVersionManager.java
@@ -205,7 +205,7 @@ public void testPersistFailureRollsBack() throws Exception {
UpgradeException thrown = assertThrows(UpgradeException.class,
versionManager::finalizeUpgrade);
assertEquals(UpgradeException.ResultCodes.APPARENT_VERSION_UPDATE_FAILED,
thrown.getResult());
assertEquals(INITIAL_VERSION, versionManager.getApparentVersion());
- assertEquals(INITIAL_VERSION.serialize(), storage.getApparentVersion());
+ assertEquals(INITIAL_VERSION.serialize(),
versionManager.getPersistedApparentVersion());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]