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 98c55fe4905 HDDS-15848. Add new upgrade action annotations for 
component versions (#10744)
98c55fe4905 is described below

commit 98c55fe4905fdaa6347818945a342fba22f2353d
Author: Ethan Rose <[email protected]>
AuthorDate: Thu Jul 16 12:33:08 2026 -0400

    HDDS-15848. Add new upgrade action annotations for component versions 
(#10744)
---
 .../upgrade/DatanodeUpgradeActionProvider.java     | 18 +++++--
 .../ContainerTableSchemaFinalizeAction.java        |  4 +-
 .../upgrade/DatanodeSchemaV2FinalizeAction.java    |  4 +-
 .../upgrade/DatanodeSchemaV3FinalizeAction.java    |  4 +-
 .../upgrade/DatanodeUpgradeActionProvider.java     | 41 ---------------
 .../ScmHAFinalizeUpgradeActionDatanode.java        |  4 +-
 ... => DatanodeUpgradeActionForLayoutFeature.java} |  4 +-
 .../upgrade/DatanodeUpgradeActionForVersion.java}  |  8 +--
 .../upgrade/TestDatanodeVersionManager.java        |  4 ++
 .../upgrade/ZduDatanodeUpgradeActionForTest.java}  | 23 +++------
 .../upgrade/AbstractUpgradeActionProvider.java     | 21 +++++---
 .../ScmOnFinalizeActionForDatanodeSchemaV2.java    |  4 +-
 .../hdds/upgrade/ScmUpgradeActionProvider.java     | 17 +++++--
 ....java => ScmUpgradeActionForLayoutFeature.java} |  4 +-
 ...ionScm.java => ScmUpgradeActionForVersion.java} |  8 +--
 .../scm/server/upgrade/TestScmVersionManager.java  |  4 ++
 .../upgrade/ZduScmUpgradeActionForTest.java}       | 19 +++----
 .../ozone/om/upgrade/OMUpgradeActionProvider.java  | 17 ++++---
 ...m.java => OmUpgradeActionForLayoutFeature.java} |  2 +-
 ...ctionOm.java => OmUpgradeActionForVersion.java} |  5 +-
 .../ozone/om/upgrade/QuotaRepairUpgradeAction.java |  2 +-
 .../ozone/om/upgrade/TestOMVersionManager.java     |  4 ++
 .../om/upgrade/ZduOmUpgradeActionForTest.java}     | 19 +++----
 .../upgrade/InitialConstraintUpgradeAction.java    |  2 +-
 .../upgrade/NSSummaryAggregatedTotalsUpgrade.java  |  2 +-
 .../upgrade/ReconTaskStatusTableUpgradeAction.java |  2 +-
 .../upgrade/ReconUpgradeActionForVersion.java      | 10 ++--
 .../recon/upgrade/ReconUpgradeActionProvider.java  |  8 +--
 .../ReplicatedSizeOfFilesUpgradeAction.java        |  2 +-
 .../UnhealthyContainerReplicaMismatchAction.java   |  2 +-
 ...ntainersStateContainerIdIndexUpgradeAction.java |  2 +-
 .../ozone/recon/upgrade/UpgradeActionRecon.java    | 59 ----------------------
 32 files changed, 129 insertions(+), 200 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeActionProvider.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeActionProvider.java
index a2e9ca8a925..34874e9439c 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeActionProvider.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeActionProvider.java
@@ -17,24 +17,32 @@
 
 package org.apache.hadoop.hdds.upgrade;
 
+import com.google.common.collect.ImmutableSet;
 import org.apache.hadoop.hdds.ComponentVersion;
 import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForLayoutFeature;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForVersion;
 
 /**
- * Loads {@link DatanodeUpgradeAction} implementations annotated with {@link 
UpgradeActionDatanode}.
+ * Loads {@link DatanodeUpgradeAction} implementations annotated with {@link 
DatanodeUpgradeActionForLayoutFeature} or
+ * {@link DatanodeUpgradeActionForVersion}.
  */
 public final class DatanodeUpgradeActionProvider extends 
AbstractUpgradeActionProvider<DatanodeUpgradeAction> {
 
   public static final String DATANODE_UPGRADE_CLASS_PACKAGE = 
"org.apache.hadoop.ozone.container";
 
   public DatanodeUpgradeActionProvider() {
-    super(UpgradeActionDatanode.class, DatanodeUpgradeAction.class, 
DATANODE_UPGRADE_CLASS_PACKAGE);
+    super(ImmutableSet.of(DatanodeUpgradeActionForLayoutFeature.class, 
DatanodeUpgradeActionForVersion.class),
+        DatanodeUpgradeAction.class, DATANODE_UPGRADE_CLASS_PACKAGE);
   }
 
   @Override
   protected ComponentVersion extractVersion(Class<?> clazz) {
-    UpgradeActionDatanode annotation = 
clazz.getAnnotation(UpgradeActionDatanode.class);
-    return annotation.feature();
+    DatanodeUpgradeActionForLayoutFeature layoutAnnotation =
+        clazz.getAnnotation(DatanodeUpgradeActionForLayoutFeature.class);
+    if (layoutAnnotation != null) {
+      return layoutAnnotation.feature();
+    }
+    return 
clazz.getAnnotation(DatanodeUpgradeActionForVersion.class).version();
   }
 }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ContainerTableSchemaFinalizeAction.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ContainerTableSchemaFinalizeAction.java
index 281c68e6641..116715e6616 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ContainerTableSchemaFinalizeAction.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ContainerTableSchemaFinalizeAction.java
@@ -31,14 +31,14 @@
 import 
org.apache.hadoop.ozone.container.metadata.WitnessedContainerDBDefinition;
 import 
org.apache.hadoop.ozone.container.metadata.WitnessedContainerMetadataStore;
 import 
org.apache.hadoop.ozone.container.metadata.WitnessedContainerMetadataStoreImpl;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForLayoutFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Upgrade Action for DataNode for update the table schema data of 
containerIds Table.
  */
-@UpgradeActionDatanode(feature = WITNESSED_CONTAINER_DB_PROTO_VALUE)
+@DatanodeUpgradeActionForLayoutFeature(feature = 
WITNESSED_CONTAINER_DB_PROTO_VALUE)
 public class ContainerTableSchemaFinalizeAction
     implements DatanodeUpgradeAction {
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
index 20005ff9c48..ad11bf87ce8 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
@@ -21,14 +21,14 @@
 
 import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForLayoutFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Upgrade Action for DataNode for the very first first Upgrade Version.
  */
-@UpgradeActionDatanode(feature = DATANODE_SCHEMA_V2)
+@DatanodeUpgradeActionForLayoutFeature(feature = DATANODE_SCHEMA_V2)
 public class DatanodeSchemaV2FinalizeAction
     implements DatanodeUpgradeAction {
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV3FinalizeAction.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV3FinalizeAction.java
index e4d97ad5ae4..9152e7cd664 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV3FinalizeAction.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV3FinalizeAction.java
@@ -26,7 +26,7 @@
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForLayoutFeature;
 import org.apache.ratis.util.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +34,7 @@
 /**
  * Upgrade Action for DataNode for SCHEMA V3.
  */
-@UpgradeActionDatanode(feature = DATANODE_SCHEMA_V3)
+@DatanodeUpgradeActionForLayoutFeature(feature = DATANODE_SCHEMA_V3)
 public class DatanodeSchemaV3FinalizeAction
     implements DatanodeUpgradeAction {
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeUpgradeActionProvider.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeUpgradeActionProvider.java
deleted file mode 100644
index 5f280b2887f..00000000000
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeUpgradeActionProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.ozone.container.upgrade;
-
-import org.apache.hadoop.hdds.ComponentVersion;
-import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction;
-import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
-
-/**
- * Loads {@link DatanodeUpgradeAction} implementations annotated with {@link 
UpgradeActionDatanode}.
- */
-public final class DatanodeUpgradeActionProvider extends 
AbstractUpgradeActionProvider<DatanodeUpgradeAction> {
-
-  public static final String DATANODE_UPGRADE_CLASS_PACKAGE = 
"org.apache.hadoop.ozone.container";
-
-  public DatanodeUpgradeActionProvider() {
-    super(UpgradeActionDatanode.class, DatanodeUpgradeAction.class, 
DATANODE_UPGRADE_CLASS_PACKAGE);
-  }
-
-  @Override
-  protected ComponentVersion extractVersion(Class<?> clazz) {
-    UpgradeActionDatanode annotation = 
clazz.getAnnotation(UpgradeActionDatanode.class);
-    return annotation.feature();
-  }
-}
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ScmHAFinalizeUpgradeActionDatanode.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ScmHAFinalizeUpgradeActionDatanode.java
index c8c7ca6d1da..8bba11e81a0 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ScmHAFinalizeUpgradeActionDatanode.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/ScmHAFinalizeUpgradeActionDatanode.java
@@ -29,14 +29,14 @@
 import org.apache.hadoop.ozone.container.common.volume.HddsVolume;
 import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
 import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForLayoutFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Action to run upgrade flow for SCM HA exactly once.
  */
-@UpgradeActionDatanode(feature = SCM_HA)
+@DatanodeUpgradeActionForLayoutFeature(feature = SCM_HA)
 public class ScmHAFinalizeUpgradeActionDatanode
     implements DatanodeUpgradeAction {
   private static final Logger LOG =
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForLayoutFeature.java
similarity index 89%
rename from 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java
rename to 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForLayoutFeature.java
index f6419085f3b..42fdbd8f12a 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForLayoutFeature.java
@@ -24,10 +24,10 @@
 import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
 
 /**
- * Annotation to specify a Datanode upgrade action.
+ * Annotation to specify a Datanode upgrade action tied to an HDDS layout 
feature.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionDatanode {
+public @interface DatanodeUpgradeActionForLayoutFeature {
   HDDSLayoutFeature feature();
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForVersion.java
similarity index 83%
copy from 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
copy to 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForVersion.java
index 4cbbcd4e987..28c2bc0bd51 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/DatanodeUpgradeActionForVersion.java
@@ -21,13 +21,13 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
+import org.apache.hadoop.hdds.HDDSVersion;
 
 /**
- * Annotation to specify an SCM upgrade action.
+ * Annotation to specify a Datanode upgrade action tied to an HDDS component 
version.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionScm {
-  HDDSLayoutFeature feature();
+public @interface DatanodeUpgradeActionForVersion {
+  HDDSVersion version();
 }
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 d3c9f7802d3..572b7baa679 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
@@ -141,6 +141,8 @@ public void testClasspathScanDiscoversUpgradeActions() 
throws Exception {
       assertTrue(versionManager.needsFinalization());
       DatanodeUpgradeAction quotaAction = 
versionManager.getUpgradeActionsForTesting().get(DATANODE_SCHEMA_V3);
       assertInstanceOf(DatanodeSchemaV3FinalizeAction.class, quotaAction);
+      DatanodeUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(HDDSVersion.ZDU);
+      assertInstanceOf(ZduDatanodeUpgradeActionForTest.class, zduAction);
     }
 
     try (DatanodeVersionManager versionManager =
@@ -148,6 +150,8 @@ public void testClasspathScanDiscoversUpgradeActions() 
throws Exception {
       assertFalse(versionManager.needsFinalization());
       DatanodeUpgradeAction quotaAction = 
versionManager.getUpgradeActionsForTesting().get(DATANODE_SCHEMA_V3);
       assertInstanceOf(DatanodeSchemaV3FinalizeAction.class, quotaAction);
+      DatanodeUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(HDDSVersion.ZDU);
+      assertInstanceOf(ZduDatanodeUpgradeActionForTest.class, zduAction);
     }
   }
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/ZduDatanodeUpgradeActionForTest.java
similarity index 56%
copy from 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
copy to 
hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/ZduDatanodeUpgradeActionForTest.java
index 20005ff9c48..f6f8c36c603 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DatanodeSchemaV2FinalizeAction.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/upgrade/ZduDatanodeUpgradeActionForTest.java
@@ -17,28 +17,19 @@
 
 package org.apache.hadoop.ozone.container.upgrade;
 
-import static 
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
+import static org.apache.hadoop.hdds.HDDSVersion.ZDU;
 
 import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.ozone.upgrade.DatanodeUpgradeActionForVersion;
 
 /**
- * Upgrade Action for DataNode for the very first first Upgrade Version.
+ * No-op upgrade action used only to verify that {@link 
DatanodeUpgradeActionForVersion} is scanned by
+ * {@link org.apache.hadoop.hdds.upgrade.DatanodeUpgradeActionProvider} in 
tests.
  */
-@UpgradeActionDatanode(feature = DATANODE_SCHEMA_V2)
-public class DatanodeSchemaV2FinalizeAction
-    implements DatanodeUpgradeAction {
-
-  private static final Logger LOG =
-      LoggerFactory.getLogger(DatanodeSchemaV2FinalizeAction.class);
-
+@DatanodeUpgradeActionForVersion(version = ZDU)
+public class ZduDatanodeUpgradeActionForTest implements DatanodeUpgradeAction {
   @Override
-  public void execute(DatanodeStateMachine arg) throws Exception {
-    LOG.info("Executing datanode 'onFinalize' action for the first " +
-        "version with upgrade support. New containers will be " +
-        "created with Schema Version 2 henceforth.");
+  public void execute(DatanodeStateMachine arg) {
   }
 }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractUpgradeActionProvider.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractUpgradeActionProvider.java
index 8932422f0f3..f80514ec5e9 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractUpgradeActionProvider.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractUpgradeActionProvider.java
@@ -19,6 +19,7 @@
 
 import java.lang.annotation.Annotation;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import org.apache.hadoop.hdds.ComponentVersion;
@@ -39,14 +40,14 @@ public abstract class AbstractUpgradeActionProvider<T 
extends UpgradeAction<?>>
 
   private static final Logger LOG = 
LoggerFactory.getLogger(AbstractUpgradeActionProvider.class);
 
-  private final Class<? extends Annotation> annotationClass;
+  private final Set<Class<? extends Annotation>> annotationClasses;
   private final Class<T> actionClass;
   private final String[] packagesToScan;
 
-  protected AbstractUpgradeActionProvider(Class<? extends Annotation> 
annotationClass,
+  protected AbstractUpgradeActionProvider(Set<Class<? extends Annotation>> 
annotationClasses,
                                           Class<T> actionClass,
                                           String... packagesToScan) {
-    this.annotationClass = annotationClass;
+    this.annotationClasses = annotationClasses;
     this.actionClass = actionClass;
     this.packagesToScan = packagesToScan;
   }
@@ -60,16 +61,24 @@ public Map<ComponentVersion, T> load() {
         .setScanners(new TypeAnnotationsScanner(), new SubTypesScanner())
         .setExpandSuperTypes(false)
         .setParallel(true));
-    Set<Class<?>> typesAnnotatedWith = 
reflections.getTypesAnnotatedWith(annotationClass);
+    Set<Class<?>> typesAnnotatedWith = new HashSet<>();
+    for (Class<? extends Annotation> annotationClass : annotationClasses) {
+      
typesAnnotatedWith.addAll(reflections.getTypesAnnotatedWith(annotationClass));
+    }
 
     typesAnnotatedWith.forEach(clazz -> {
+      long annotationCount = 
annotationClasses.stream().filter(clazz::isAnnotationPresent).count();
+      if (annotationCount > 1) {
+        throw new IllegalStateException("Upgrade action class " + 
clazz.getName()
+            + " has more than one upgrade action annotation. Only one is 
allowed.");
+      }
       if (actionClass.isAssignableFrom(clazz)) {
         try {
           @SuppressWarnings("unchecked")
           T action = (T) clazz.getDeclaredConstructor().newInstance();
-          ComponentVersion feature = extractVersion(clazz);
+          ComponentVersion version = extractVersion(clazz);
           LOG.info("Registering Upgrade Action : {}", action.name());
-          upgradeActions.put(feature, action);
+          upgradeActions.put(version, action);
         } catch (Exception e) {
           LOG.error("Cannot instantiate Upgrade Action class {}",
               clazz.getSimpleName(), e);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
index d6b3cef1ce3..44f298018ae 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
@@ -21,14 +21,14 @@
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.upgrade.ScmUpgradeAction;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionScm;
+import org.apache.hadoop.ozone.upgrade.ScmUpgradeActionForLayoutFeature;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * SCM Upgrade Action for the very first Upgrade Version.
  */
-@UpgradeActionScm(feature = DATANODE_SCHEMA_V2)
+@ScmUpgradeActionForLayoutFeature(feature = DATANODE_SCHEMA_V2)
 public class ScmOnFinalizeActionForDatanodeSchemaV2 implements 
ScmUpgradeAction {
   private static final Logger LOG = 
LoggerFactory.getLogger(ScmOnFinalizeActionForDatanodeSchemaV2.class);
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeActionProvider.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeActionProvider.java
index 63d8dec0b15..21a7c7b5373 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeActionProvider.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeActionProvider.java
@@ -17,24 +17,31 @@
 
 package org.apache.hadoop.hdds.upgrade;
 
+import com.google.common.collect.ImmutableSet;
 import org.apache.hadoop.hdds.ComponentVersion;
 import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionScm;
+import org.apache.hadoop.ozone.upgrade.ScmUpgradeActionForLayoutFeature;
+import org.apache.hadoop.ozone.upgrade.ScmUpgradeActionForVersion;
 
 /**
- * Loads {@link ScmUpgradeAction} implementations annotated with {@link 
UpgradeActionScm}.
+ * Loads {@link ScmUpgradeAction} implementations annotated with {@link 
ScmUpgradeActionForLayoutFeature} or
+ * {@link ScmUpgradeActionForVersion}.
  */
 public final class ScmUpgradeActionProvider extends 
AbstractUpgradeActionProvider<ScmUpgradeAction> {
 
   public static final String SCM_UPGRADE_CLASS_PACKAGE = 
"org.apache.hadoop.hdds.scm.server";
 
   public ScmUpgradeActionProvider() {
-    super(UpgradeActionScm.class, ScmUpgradeAction.class, 
SCM_UPGRADE_CLASS_PACKAGE);
+    super(ImmutableSet.of(ScmUpgradeActionForLayoutFeature.class, 
ScmUpgradeActionForVersion.class),
+        ScmUpgradeAction.class, SCM_UPGRADE_CLASS_PACKAGE);
   }
 
   @Override
   protected ComponentVersion extractVersion(Class<?> clazz) {
-    UpgradeActionScm annotation = clazz.getAnnotation(UpgradeActionScm.class);
-    return annotation.feature();
+    ScmUpgradeActionForLayoutFeature layoutAnnotation = 
clazz.getAnnotation(ScmUpgradeActionForLayoutFeature.class);
+    if (layoutAnnotation != null) {
+      return layoutAnnotation.feature();
+    }
+    return clazz.getAnnotation(ScmUpgradeActionForVersion.class).version();
   }
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForLayoutFeature.java
similarity index 89%
copy from 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
copy to 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForLayoutFeature.java
index 4cbbcd4e987..d0845143ce7 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForLayoutFeature.java
@@ -24,10 +24,10 @@
 import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
 
 /**
- * Annotation to specify an SCM upgrade action.
+ * Annotation to specify an SCM upgrade action tied to an HDDS layout feature.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionScm {
+public @interface ScmUpgradeActionForLayoutFeature {
   HDDSLayoutFeature feature();
 }
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForVersion.java
similarity index 84%
copy from 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
copy to 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForVersion.java
index 4cbbcd4e987..ff48b93e300 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/ScmUpgradeActionForVersion.java
@@ -21,13 +21,13 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
+import org.apache.hadoop.hdds.HDDSVersion;
 
 /**
- * Annotation to specify an SCM upgrade action.
+ * Annotation to specify an SCM upgrade action tied to an HDDS component 
version.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionScm {
-  HDDSLayoutFeature feature();
+public @interface ScmUpgradeActionForVersion {
+  HDDSVersion version();
 }
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 0801ac1a01d..61dcae5826d 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
@@ -139,6 +139,8 @@ public void testClasspathScanDiscoversUpgradeActions() 
throws Exception {
       assertTrue(versionManager.needsFinalization());
       ScmUpgradeAction upgradeAction = 
versionManager.getUpgradeActionsForTesting().get(DATANODE_SCHEMA_V2);
       assertInstanceOf(ScmOnFinalizeActionForDatanodeSchemaV2.class, 
upgradeAction);
+      ScmUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(HDDSVersion.ZDU);
+      assertInstanceOf(ZduScmUpgradeActionForTest.class, zduAction);
     }
 
     try (ScmVersionManager versionManager = 
createManager(HDDSVersion.SOFTWARE_VERSION.serialize(),
@@ -146,6 +148,8 @@ public void testClasspathScanDiscoversUpgradeActions() 
throws Exception {
       assertFalse(versionManager.needsFinalization());
       ScmUpgradeAction upgradeAction = 
versionManager.getUpgradeActionsForTesting().get(DATANODE_SCHEMA_V2);
       assertInstanceOf(ScmOnFinalizeActionForDatanodeSchemaV2.class, 
upgradeAction);
+      ScmUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(HDDSVersion.ZDU);
+      assertInstanceOf(ZduScmUpgradeActionForTest.class, zduAction);
     }
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/ZduScmUpgradeActionForTest.java
similarity index 60%
copy from 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
copy to 
hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/ZduScmUpgradeActionForTest.java
index d6b3cef1ce3..aa12c999292 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/ScmOnFinalizeActionForDatanodeSchemaV2.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/upgrade/ZduScmUpgradeActionForTest.java
@@ -17,24 +17,19 @@
 
 package org.apache.hadoop.hdds.scm.server.upgrade;
 
-import static 
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
+import static org.apache.hadoop.hdds.HDDSVersion.ZDU;
 
 import org.apache.hadoop.hdds.scm.server.OzoneStorageContainerManager;
 import org.apache.hadoop.hdds.upgrade.ScmUpgradeAction;
-import org.apache.hadoop.ozone.upgrade.UpgradeActionScm;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.hadoop.ozone.upgrade.ScmUpgradeActionForVersion;
 
 /**
- * SCM Upgrade Action for the very first Upgrade Version.
+ * No-op upgrade action used only to verify that {@link 
ScmUpgradeActionForVersion} is scanned by
+ * {@link org.apache.hadoop.hdds.upgrade.ScmUpgradeActionProvider} in tests.
  */
-@UpgradeActionScm(feature = DATANODE_SCHEMA_V2)
-public class ScmOnFinalizeActionForDatanodeSchemaV2 implements 
ScmUpgradeAction {
-  private static final Logger LOG = 
LoggerFactory.getLogger(ScmOnFinalizeActionForDatanodeSchemaV2.class);
-
+@ScmUpgradeActionForVersion(version = ZDU)
+public class ZduScmUpgradeActionForTest implements ScmUpgradeAction {
   @Override
-  public void execute(OzoneStorageContainerManager context) throws Exception {
-    LOG.info("Executing SCM On Finalize action for layout feature {}",
-        DATANODE_SCHEMA_V2);
+  public void execute(OzoneStorageContainerManager arg) {
   }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeActionProvider.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeActionProvider.java
index 68b0362d1f5..c0a81ffcf71 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeActionProvider.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeActionProvider.java
@@ -17,27 +17,32 @@
 
 package org.apache.hadoop.ozone.om.upgrade;
 
+import com.google.common.collect.ImmutableSet;
 import org.apache.hadoop.hdds.ComponentVersion;
 import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider;
 
 /**
- * Loads {@link OmUpgradeAction} implementations annotated with {@link 
UpgradeActionOm} from
- * {@link #OM_UPGRADE_CLASS_PACKAGE} only.
+ * Loads {@link OmUpgradeAction} implementations annotated with {@link 
OmUpgradeActionForLayoutFeature} or
+ * {@link OmUpgradeActionForVersion} from {@link #OM_UPGRADE_CLASS_PACKAGE}.
  */
 public final class OMUpgradeActionProvider extends 
AbstractUpgradeActionProvider<OmUpgradeAction> {
 
   /**
-   * Package scanned for {@link UpgradeActionOm}-annotated classes (production 
OM upgrade actions).
+   * Package scanned for upgrade-action-annotated classes.
    */
   public static final String OM_UPGRADE_CLASS_PACKAGE = 
"org.apache.hadoop.ozone.om.upgrade";
 
   public OMUpgradeActionProvider() {
-    super(UpgradeActionOm.class, OmUpgradeAction.class, 
OM_UPGRADE_CLASS_PACKAGE);
+    super(ImmutableSet.of(OmUpgradeActionForLayoutFeature.class, 
OmUpgradeActionForVersion.class),
+        OmUpgradeAction.class, OM_UPGRADE_CLASS_PACKAGE);
   }
 
   @Override
   protected ComponentVersion extractVersion(Class<?> clazz) {
-    UpgradeActionOm annotation = clazz.getAnnotation(UpgradeActionOm.class);
-    return annotation.feature();
+    OmUpgradeActionForLayoutFeature layoutAnnotation = 
clazz.getAnnotation(OmUpgradeActionForLayoutFeature.class);
+    if (layoutAnnotation != null) {
+      return layoutAnnotation.feature();
+    }
+    return clazz.getAnnotation(OmUpgradeActionForVersion.class).version();
   }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForLayoutFeature.java
similarity index 95%
copy from 
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
copy to 
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForLayoutFeature.java
index 4d0d6b5c017..8b86b6c7ae4 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForLayoutFeature.java
@@ -27,6 +27,6 @@
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionOm {
+public @interface OmUpgradeActionForLayoutFeature {
   OMLayoutFeature feature();
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForVersion.java
similarity index 89%
copy from 
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
copy to 
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForVersion.java
index 4d0d6b5c017..af05132568d 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OmUpgradeActionForVersion.java
@@ -21,12 +21,13 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+import org.apache.hadoop.ozone.OzoneManagerVersion;
 
 /**
  * Annotation to specify upgrade action run during Ozone Manager finalization.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionOm {
-  OMLayoutFeature feature();
+public @interface OmUpgradeActionForVersion {
+  OzoneManagerVersion version();
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/QuotaRepairUpgradeAction.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/QuotaRepairUpgradeAction.java
index eef1c710252..5064f877b7f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/QuotaRepairUpgradeAction.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/QuotaRepairUpgradeAction.java
@@ -30,7 +30,7 @@
 /**
  * Quota repair for usages action to be triggered after upgrade.
  */
-@UpgradeActionOm(feature = QUOTA)
+@OmUpgradeActionForLayoutFeature(feature = QUOTA)
 public class QuotaRepairUpgradeAction implements OmUpgradeAction {
   private static final Logger LOG = 
LoggerFactory.getLogger(QuotaRepairUpgradeAction.class);
 
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 b1df2fc62fb..009ff9f2020 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
@@ -132,12 +132,16 @@ public void testClasspathScanDiscoversUpgradeActions() 
throws Exception {
       assertTrue(versionManager.needsFinalization());
       OmUpgradeAction quotaAction = 
versionManager.getUpgradeActionsForTesting().get(QUOTA);
       assertInstanceOf(QuotaRepairUpgradeAction.class, quotaAction);
+      OmUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(ZDU);
+      assertInstanceOf(ZduOmUpgradeActionForTest.class, zduAction);
     }
 
     try (OMVersionManager versionManager = 
createManager(SOFTWARE_VERSION.serialize(), new OMUpgradeActionProvider())) {
       assertFalse(versionManager.needsFinalization());
       OmUpgradeAction quotaAction = 
versionManager.getUpgradeActionsForTesting().get(QUOTA);
       assertInstanceOf(QuotaRepairUpgradeAction.class, quotaAction);
+      OmUpgradeAction zduAction = 
versionManager.getUpgradeActionsForTesting().get(ZDU);
+      assertInstanceOf(ZduOmUpgradeActionForTest.class, zduAction);
     }
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/ZduOmUpgradeActionForTest.java
similarity index 67%
rename from 
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
rename to 
hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/ZduOmUpgradeActionForTest.java
index 4d0d6b5c017..b4609992651 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/UpgradeActionOm.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/ZduOmUpgradeActionForTest.java
@@ -17,16 +17,17 @@
 
 package org.apache.hadoop.ozone.om.upgrade;
 
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import static org.apache.hadoop.ozone.OzoneManagerVersion.ZDU;
+
+import org.apache.hadoop.ozone.om.OzoneManager;
 
 /**
- * Annotation to specify upgrade action run during Ozone Manager finalization.
+ * No-op upgrade action used only to verify that {@link 
OmUpgradeActionForVersion} is scanned by
+ * {@link OMUpgradeActionProvider} in tests.
  */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface UpgradeActionOm {
-  OMLayoutFeature feature();
+@OmUpgradeActionForVersion(version = ZDU)
+public class ZduOmUpgradeActionForTest implements OmUpgradeAction {
+  @Override
+  public void execute(OzoneManager arg) {
+  }
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/InitialConstraintUpgradeAction.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/InitialConstraintUpgradeAction.java
index 3adadafe222..ffcf89768f2 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/InitialConstraintUpgradeAction.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/InitialConstraintUpgradeAction.java
@@ -28,7 +28,7 @@
  * Upgrade action for the INITIAL schema version, which manages constraints
  * for the UNHEALTHY_CONTAINERS table.
  */
-@UpgradeActionRecon(feature = INITIAL_VERSION)
+@ReconUpgradeActionForVersion(version = INITIAL_VERSION)
 public class InitialConstraintUpgradeAction implements ReconUpgradeAction {
   private static final Logger LOG = 
LoggerFactory.getLogger(InitialConstraintUpgradeAction.class);
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/NSSummaryAggregatedTotalsUpgrade.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/NSSummaryAggregatedTotalsUpgrade.java
index b806e29fd61..45b91b233ff 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/NSSummaryAggregatedTotalsUpgrade.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/NSSummaryAggregatedTotalsUpgrade.java
@@ -29,7 +29,7 @@
  * Recon startup is not blocked. During rebuild, APIs that depend on
  * the tree may return initializing responses as designed.
  */
-@UpgradeActionRecon(feature = ReconVersion.NSSUMMARY_AGGREGATED_TOTALS)
+@ReconUpgradeActionForVersion(version = 
ReconVersion.NSSUMMARY_AGGREGATED_TOTALS)
 public class NSSummaryAggregatedTotalsUpgrade implements ReconUpgradeAction {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(NSSummaryAggregatedTotalsUpgrade.class);
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconTaskStatusTableUpgradeAction.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconTaskStatusTableUpgradeAction.java
index 91509598c4f..f8a5a98a695 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconTaskStatusTableUpgradeAction.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconTaskStatusTableUpgradeAction.java
@@ -38,7 +38,7 @@
  * <code>last_task_run_status</code> and <code>current_task_run_status</code> 
columns to
  * {@link ReconTaskSchemaDefinition} in case it is missing .
  */
-@UpgradeActionRecon(feature = ReconVersion.TASK_STATUS_STATISTICS)
+@ReconUpgradeActionForVersion(version = ReconVersion.TASK_STATUS_STATISTICS)
 public class ReconTaskStatusTableUpgradeAction implements ReconUpgradeAction {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(ReconTaskStatusTableUpgradeAction.class);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionForVersion.java
similarity index 77%
rename from 
hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
rename to 
hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionForVersion.java
index 4cbbcd4e987..6de014cc46c 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionForVersion.java
@@ -15,19 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.ozone.upgrade;
+package org.apache.hadoop.ozone.recon.upgrade;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
-import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
 
 /**
- * Annotation to specify an SCM upgrade action.
+ * Annotation to specify a Recon upgrade action tied to a {@link ReconVersion}.
+ * The framework discovers annotated classes via reflection and executes them 
during finalization.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE)
-public @interface UpgradeActionScm {
-  HDDSLayoutFeature feature();
+public @interface ReconUpgradeActionForVersion {
+  ReconVersion version();
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionProvider.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionProvider.java
index 76fb392d3bb..8ae3c13307a 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionProvider.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeActionProvider.java
@@ -17,23 +17,23 @@
 
 package org.apache.hadoop.ozone.recon.upgrade;
 
+import com.google.common.collect.ImmutableSet;
 import org.apache.hadoop.hdds.ComponentVersion;
 import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider;
 
 /**
- * Loads {@link ReconUpgradeAction} implementations annotated with {@link 
UpgradeActionRecon}.
+ * Loads {@link ReconUpgradeAction} implementations annotated with {@link 
ReconUpgradeActionForVersion}.
  */
 public final class ReconUpgradeActionProvider extends 
AbstractUpgradeActionProvider<ReconUpgradeAction> {
 
   public static final String RECON_UPGRADE_CLASS_PACKAGE = 
"org.apache.hadoop.ozone.recon.upgrade";
 
   public ReconUpgradeActionProvider() {
-    super(UpgradeActionRecon.class, ReconUpgradeAction.class, 
RECON_UPGRADE_CLASS_PACKAGE);
+    super(ImmutableSet.of(ReconUpgradeActionForVersion.class), 
ReconUpgradeAction.class, RECON_UPGRADE_CLASS_PACKAGE);
   }
 
   @Override
   protected ComponentVersion extractVersion(Class<?> clazz) {
-    UpgradeActionRecon annotation = 
clazz.getAnnotation(UpgradeActionRecon.class);
-    return annotation.feature();
+    return clazz.getAnnotation(ReconUpgradeActionForVersion.class).version();
   }
 }
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReplicatedSizeOfFilesUpgradeAction.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReplicatedSizeOfFilesUpgradeAction.java
index d1e5889d599..66131e7d36b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReplicatedSizeOfFilesUpgradeAction.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReplicatedSizeOfFilesUpgradeAction.java
@@ -26,7 +26,7 @@
  * The action triggers a full rebuild of the NSSummary ensuring that the new 
field: replicatedSizeOfFiles is correctly
  * populated for all objects.
  */
-@UpgradeActionRecon(feature = ReconVersion.REPLICATED_SIZE_OF_FILES)
+@ReconUpgradeActionForVersion(version = ReconVersion.REPLICATED_SIZE_OF_FILES)
 public class ReplicatedSizeOfFilesUpgradeAction implements ReconUpgradeAction {
 
   private static final Logger LOG = 
LoggerFactory.getLogger(ReplicatedSizeOfFilesUpgradeAction.class);
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainerReplicaMismatchAction.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainerReplicaMismatchAction.java
index 3753ad244ab..f9a42d59791 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainerReplicaMismatchAction.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainerReplicaMismatchAction.java
@@ -27,7 +27,7 @@
  * Upgrade action for handling the addition of a new unhealthy container state 
in Recon, which will be for containers,
  * that have replicas with different data checksums.
  */
-@UpgradeActionRecon(feature = UNHEALTHY_CONTAINER_REPLICA_MISMATCH)
+@ReconUpgradeActionForVersion(version = UNHEALTHY_CONTAINER_REPLICA_MISMATCH)
 public class UnhealthyContainerReplicaMismatchAction implements 
ReconUpgradeAction {
   private static final Logger LOG = 
LoggerFactory.getLogger(UnhealthyContainerReplicaMismatchAction.class);
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainersStateContainerIdIndexUpgradeAction.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainersStateContainerIdIndexUpgradeAction.java
index c64a6e33ca1..df021e5f5d5 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainersStateContainerIdIndexUpgradeAction.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UnhealthyContainersStateContainerIdIndexUpgradeAction.java
@@ -32,7 +32,7 @@
 /**
  * Upgrade action to ensure idx_state_container_id exists on 
UNHEALTHY_CONTAINERS.
  */
-@UpgradeActionRecon(feature = 
ReconVersion.UNHEALTHY_CONTAINERS_STATE_CONTAINER_ID_INDEX)
+@ReconUpgradeActionForVersion(version = 
ReconVersion.UNHEALTHY_CONTAINERS_STATE_CONTAINER_ID_INDEX)
 public class UnhealthyContainersStateContainerIdIndexUpgradeAction
     implements ReconUpgradeAction {
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UpgradeActionRecon.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UpgradeActionRecon.java
deleted file mode 100644
index 010af79851f..00000000000
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/UpgradeActionRecon.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * 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.ozone.recon.upgrade;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * The {@code UpgradeActionRecon} annotation is used to specify
- * upgrade actions that should be executed during finalization
- * of the Recon service layout upgrade process.
- *
- * <p>This annotation can be used to associate an upgrade action
- * class with a specific layout feature. The framework will
- * dynamically discover these annotated upgrade actions and execute
- * them based on the feature's version during finalization.
- *
- * <p>The annotation is retained at runtime, allowing the reflection-based
- * mechanism to scan for annotated classes, register the associated actions,
- * and execute them as necessary during the layout upgrade process.
- *
- * Example usage:
- *
- * <pre>
- * &#64;UpgradeActionRecon(feature = FEATURE_NAME)
- * public class FeatureNameUpgradeAction implements ReconUpgradeAction {
- *   &#64;Override
- *   public void execute(DataSource source) throws Exception {
- *     // Custom upgrade logic for FEATURE_NAME
- *   }
- * }
- * </pre>
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
-public @interface UpgradeActionRecon {
-
-  /**
-   * Defines the component version this upgrade action is associated with.
-   */
-  ReconVersion feature();
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to