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]

Reply via email to