This is an automated email from the ASF dual-hosted git repository.
sodonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 5b9265d980b HDDS-14569. Remove support for upgrade actions that run
outside of finalization (#9716)
5b9265d980b is described below
commit 5b9265d980beab0f8063b807e7618e611044f2d5
Author: Ethan Rose <[email protected]>
AuthorDate: Wed Feb 18 05:04:51 2026 -0500
HDDS-14569. Remove support for upgrade actions that run outside of
finalization (#9716)
---
.../hadoop/hdds/upgrade/HDDSLayoutFeature.java | 40 +++++---
.../apache/hadoop/ozone/upgrade/LayoutFeature.java | 35 +------
.../common/statemachine/DatanodeStateMachine.java | 1 -
.../ContainerTableSchemaFinalizeAction.java | 3 +-
.../upgrade/DataNodeUpgradeFinalizer.java | 11 +--
.../upgrade/DatanodeSchemaV2FinalizeAction.java | 4 +-
.../upgrade/DatanodeSchemaV3FinalizeAction.java | 4 +-
.../ScmHAFinalizeUpgradeActionDatanode.java | 4 +-
.../docs/content/design/upgrade-dev-primer.md | 24 +----
.../hdds/upgrade/HDDSLayoutVersionManager.java | 4 +-
.../ozone/upgrade/BasicUpgradeFinalizer.java | 81 +---------------
.../hadoop/ozone/upgrade/UpgradeActionHdds.java | 5 +-
.../hadoop/ozone/upgrade/UpgradeFinalizer.java | 10 --
.../hdds/upgrade/TestHDDSLayoutVersionManager.java | 14 ++-
.../hadoop/hdds/upgrade/test/MockComponent.java | 7 +-
.../ozone/upgrade/TestBasicUpgradeFinalizer.java | 8 +-
.../TestDefaultUpgradeFinalizationExecutor.java | 10 --
.../ozone/upgrade/TestUpgradeFinalizerActions.java | 103 +--------------------
.../hdds/scm/server/StorageContainerManager.java | 2 -
.../scm/server/upgrade/FinalizationManager.java | 2 -
.../server/upgrade/FinalizationManagerImpl.java | 5 -
.../scm/server/upgrade/SCMUpgradeFinalizer.java | 10 +-
.../ScmOnFinalizeActionForDatanodeSchemaV2.java | 4 +-
.../org/apache/hadoop/ozone/om/OzoneManager.java | 1 -
.../hadoop/ozone/om/upgrade/OMLayoutFeature.java | 37 +++-----
.../ozone/om/upgrade/OMLayoutVersionManager.java | 2 +-
.../ozone/om/upgrade/OMUpgradeFinalizer.java | 11 +--
.../ozone/om/upgrade/QuotaRepairUpgradeAction.java | 3 +-
.../hadoop/ozone/om/upgrade/UpgradeActionOm.java | 5 +-
.../ozone/om/upgrade/TestOMUpgradeFinalizer.java | 5 +-
.../ozone/om/upgrade/TestOMVersionManager.java | 22 ++---
.../upgrade/InitialConstraintUpgradeAction.java | 8 +-
.../upgrade/NSSummaryAggregatedTotalsUpgrade.java | 9 +-
.../ozone/recon/upgrade/ReconLayoutFeature.java | 27 +++---
.../recon/upgrade/ReconLayoutVersionManager.java | 4 +-
.../upgrade/ReconTaskStatusTableUpgradeAction.java | 7 +-
.../ozone/recon/upgrade/ReconUpgradeAction.java | 20 +---
.../ReplicatedSizeOfFilesUpgradeAction.java | 8 +-
.../UnhealthyContainerReplicaMismatchAction.java | 8 +-
.../ozone/recon/upgrade/UpgradeActionRecon.java | 20 ++--
.../TestNSSummaryAggregatedTotalsUpgrade.java | 5 -
.../upgrade/TestReconLayoutVersionManager.java | 25 ++---
.../TestReplicatedSizeOfFilesUpgradeAction.java | 5 -
43 files changed, 123 insertions(+), 500 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java
index d99b5917159..0d45298da8b 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java
@@ -17,7 +17,6 @@
package org.apache.hadoop.hdds.upgrade;
-import java.util.EnumMap;
import java.util.Optional;
import org.apache.hadoop.ozone.upgrade.LayoutFeature;
@@ -49,23 +48,36 @@ public enum HDDSLayoutFeature implements LayoutFeature {
private int layoutVersion;
private String description;
- private EnumMap<UpgradeActionType, HDDSUpgradeAction> scmActions =
- new EnumMap<>(UpgradeActionType.class);
- private EnumMap<UpgradeActionType, HDDSUpgradeAction> datanodeActions =
- new EnumMap<>(UpgradeActionType.class);
+ private HDDSUpgradeAction scmAction;
+ private HDDSUpgradeAction datanodeAction;
HDDSLayoutFeature(final int layoutVersion, String description) {
this.layoutVersion = layoutVersion;
this.description = description;
}
- public void addScmAction(UpgradeActionType type, HDDSUpgradeAction action) {
- this.scmActions.put(type, action);
+ /**
+ * Associates an SCM upgrade action with this feature. Only the first
upgrade action registered will be used.
+ *
+ * @param action The upgrade action to associate with this feature.
+ */
+ public void addScmAction(HDDSUpgradeAction action) {
+ // Required by SpotBugs since this setter exists in an enum.
+ if (this.scmAction == null) {
+ this.scmAction = action;
+ }
}
- public void addDatanodeAction(UpgradeActionType type,
- HDDSUpgradeAction action) {
- this.datanodeActions.put(type, action);
+ /**
+ * Associates a Datanode upgrade action with this feature. Only the first
upgrade action registered will be used.
+ *
+ * @param action The upgrade action to associate with this feature.
+ */
+ public void addDatanodeAction(HDDSUpgradeAction action) {
+ // Required by SpotBugs since this setter exists in an enum.
+ if (this.datanodeAction == null) {
+ this.datanodeAction = action;
+ }
}
@Override
@@ -78,11 +90,11 @@ public String description() {
return description;
}
- public Optional<HDDSUpgradeAction> scmAction(UpgradeActionType type) {
- return Optional.ofNullable(scmActions.get(type));
+ public Optional<HDDSUpgradeAction> scmAction() {
+ return Optional.ofNullable(scmAction);
}
- public Optional<HDDSUpgradeAction> datanodeAction(UpgradeActionType type) {
- return Optional.ofNullable(datanodeActions.get(type));
+ public Optional<HDDSUpgradeAction> datanodeAction() {
+ return Optional.ofNullable(datanodeAction);
}
}
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutFeature.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutFeature.java
index 94c5b2f2fd1..07bf2cb6dcb 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutFeature.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/LayoutFeature.java
@@ -30,13 +30,13 @@ public interface LayoutFeature extends Versioned {
String description();
- default Optional<? extends UpgradeAction> action(UpgradeActionType p) {
+ default Optional<? extends UpgradeAction> action() {
return Optional.empty();
}
/**
- * Generic UpgradeAction interface. An operation that is run on specific
- * upgrade states like post finalize, pre-downgrade etc.
+ * Generic UpgradeAction interface. An upgrade action is an operation that
+ * is run at least once as a pre-requisite to finalizing a layout feature.
* @param <T>
*/
interface UpgradeAction<T> {
@@ -52,33 +52,4 @@ default String name() {
default int version() {
return this.layoutVersion();
}
-
- /**
- * Phase of execution for this action.
- */
- enum UpgradeActionType {
-
- // Run every time an un-finalized component is started up.
- VALIDATE_IN_PREFINALIZE,
-
- // Run once when an upgraded cluster is started with this new
- // layout version.
- // If the action fails, it will be run again when the component is
- // restarted.
- // If updating the VERSION file fails, the action may be run again when the
- // component is restarted, even if it finished successfully.
- // NOTE 1 : This will not be run in a NEW cluster!
- // NOTE 2 : This needs to be a backward compatible action until a DOWNGRADE
- // hook is provided!
- // Even if the action fails partway through, all on disk structures should
- // still be in a backwards compatible state.
- // NOTE 3 : These actions are not submitted through RATIS (TODO)
- ON_FIRST_UPGRADE_START,
-
- // Run once during finalization of the layout feature.
- // If the action fails, it will be run again when finalization is retried.
- // If updating the VERSION file fails, the action may be run again when
- // finalization is retried, even if it finished successfully.
- ON_FINALIZE
- }
}
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
index 558d6a28535..2f53178e9bf 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/DatanodeStateMachine.java
@@ -369,7 +369,6 @@ private void startStateMachineThread() throws IOException {
reportManager.init();
initCommandHandlerThread(conf);
- upgradeFinalizer.runPrefinalizeStateActions(layoutStorage, this);
LOG.info("Ozone container server started.");
while (context.getState() != DatanodeStates.SHUTDOWN) {
try {
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 ed037070d80..7739797953c 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.container.upgrade;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.WITNESSED_CONTAINER_DB_PROTO_VALUE;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static
org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE;
import org.apache.hadoop.hdds.scm.container.ContainerID;
@@ -40,7 +39,7 @@
/**
* Upgrade Action for DataNode for update the table schema data of
containerIds Table.
*/
-@UpgradeActionHdds(feature = WITNESSED_CONTAINER_DB_PROTO_VALUE, component =
DATANODE, type = ON_FINALIZE)
+@UpgradeActionHdds(feature = WITNESSED_CONTAINER_DB_PROTO_VALUE, component =
DATANODE)
public class ContainerTableSchemaFinalizeAction
implements HDDSUpgradeAction<DatanodeStateMachine> {
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DataNodeUpgradeFinalizer.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DataNodeUpgradeFinalizer.java
index 1c741ac76f6..5cb06e88e6c 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DataNodeUpgradeFinalizer.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/upgrade/DataNodeUpgradeFinalizer.java
@@ -25,7 +25,6 @@
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
-import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.container.common.interfaces.Container;
import
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
import org.apache.hadoop.ozone.upgrade.BasicUpgradeFinalizer;
@@ -83,7 +82,7 @@ public void finalizeLayoutFeature(LayoutFeature layoutFeature,
HDDSLayoutFeature hddslayoutFeature = (HDDSLayoutFeature)layoutFeature;
super.finalizeLayoutFeature(hddslayoutFeature,
hddslayoutFeature
- .datanodeAction(LayoutFeature.UpgradeActionType.ON_FINALIZE),
+ .datanodeAction(),
dsm.getLayoutStorage());
} else {
String msg = String.format("Failed to finalize datanode layout feature "
+
@@ -92,12 +91,4 @@ public void finalizeLayoutFeature(LayoutFeature
layoutFeature,
UpgradeException.ResultCodes.LAYOUT_FEATURE_FINALIZATION_FAILED);
}
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage,
- DatanodeStateMachine dsm)
- throws IOException {
- super.runPrefinalizeStateActions(
- lf -> ((HDDSLayoutFeature) lf)::datanodeAction, storage, dsm);
- }
}
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 34cdeca4a1a..bf3f5285e36 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.container.upgrade;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static
org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE;
import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction;
@@ -30,8 +29,7 @@
/**
* Upgrade Action for DataNode for the very first first Upgrade Version.
*/
-@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = DATANODE,
- type = ON_FINALIZE)
+@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = DATANODE)
public class DatanodeSchemaV2FinalizeAction
implements HDDSUpgradeAction<DatanodeStateMachine> {
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 c6a7564a5af..6c05a201c2a 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.container.upgrade;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V3;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static
org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE;
import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction;
@@ -36,8 +35,7 @@
/**
* Upgrade Action for DataNode for SCHEMA V3.
*/
-@UpgradeActionHdds(feature = DATANODE_SCHEMA_V3, component = DATANODE,
- type = ON_FINALIZE)
+@UpgradeActionHdds(feature = DATANODE_SCHEMA_V3, component = DATANODE)
public class DatanodeSchemaV3FinalizeAction
implements HDDSUpgradeAction<DatanodeStateMachine> {
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 fb9da4bd823..74ccdfb8798 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.container.upgrade;
import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.SCM_HA;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static
org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE;
import java.io.File;
@@ -38,8 +37,7 @@
/**
* Action to run upgrade flow for SCM HA exactly once.
*/
-@UpgradeActionHdds(feature = SCM_HA, component = DATANODE,
- type = ON_FINALIZE)
+@UpgradeActionHdds(feature = SCM_HA, component = DATANODE)
public class ScmHAFinalizeUpgradeActionDatanode
implements HDDSUpgradeAction<DatanodeStateMachine> {
private static final Logger LOG =
diff --git a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
index 1a47b2f729e..13f6f5a683d 100644
--- a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
+++ b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md
@@ -24,7 +24,7 @@ author: Aravindan Vijayan
A layout feature is any new Ozone feature that makes a backward incompatible
change to the on disk layout. Each layout feature is associated with a layout
version that it defines. A component has a list of monotonically increasing
layout features (versions) that it supports.
## Finalizing & Pre-Finalized State
-When upgrading a component from an older version to a newer version which has
a higher layout version, the component automatically goes into a pre-finalized
state after which an explicit ‘finalize’ action is required from the user to
finalize it. In the pre-finalized state, commands/APIs/on disk structures used
and created by newer layout features are meant to be unsupported or unused.
After finalizing, the newer layout feature APIs are supported.
+When upgrading a component from an older version to a newer version which has
a higher layout version, the component automatically goes into a pre-finalized
state after which an explicit 'finalize' action is required from the user to
finalize it. In the pre-finalized state, commands/APIs/on disk structures used
and created by newer layout features are meant to be unsupported or unused.
After finalizing, the newer layout feature APIs are supported.
## Downgrade
Downgrade to a lower version is allowed from the pre-finalized state. This
involves stopping the component, replacing the artifacts to the older version,
and then starting it up again.
@@ -51,30 +51,14 @@ Method level annotation used to "disallow" an API if
current layout version does
Annotation to mark an OM request class that it belongs to a specific Layout
Version. Until that version is available post finalize, this request will not
be supported. A newer version of an existing OM request can be created (by
inheritance or a fully new class) and marked with a newer layout version. Until
finalizing this layout version, the older request class is used. Post
finalizing, the newer version of the request class is used.
## Upgrade Action (UpgradeActionOm & UpgradeActionHdds)
-Annotation to specify upgrade action run during specific upgrade phases. Each
layout feature can optionally define an upgrade action for every supported
phase. These are the supported phases of action callbacks.
-
-#### VALIDATE_IN_PREFINALIZE
-A ‘validation’ action run every time a component is started up with this
layout feature being unfinalized.
-
-- Example: Stopping a component if a new configuration is used prior to it
being finalized.
-
-- Example: Cleaning up from a failed ON_FINALIZE action that may have left on
disk data in an inoperable state.
- - Note that because the ON_FINALIZE action failed, the feature remains
pre-finalized.
-
-#### ON_FIRST_UPGRADE_START
-A backward compatible action run once when an upgraded cluster is detected
with this new layout version. This differs from VALIDATE_IN_PREFINALIZE because
it will not be run again once it completes successfully.
-This action will be run again if it fails partway through, and may be run
again if another error occurs during the upgrade. The action must always leave
on disk data in a backwards compatible state, even if it fails partway through,
since it is being executed before finalization.
-
-- Example: The new version expects data in a different location even when it
is pre-finalized. The action creates a symlink in the new location pointing to
the old location.
-
-#### ON_FINALIZE
-An action run once during finalization of layout version (feature). This
action will be run again if it fails partway through, and may be run again if
another error occurs during the upgrade. This is the only action permitted to
make backwards incompatible changes to on disk structures, since finalization
has been initiated by the time it is run. If a failure partway through could
leave the component in an inoperable state, a cleanup action should be used in
VALIDATE_IN_PREFINALIZE, whic [...]
+Annotation to specify upgrade action run during finalization. Each layout
feature can optionally define a single upgrade action that will be executed
when the feature is finalized. This action should be idempotent and execute
quickly. The action must complete for the feature to finish
+finalizing, so if there is an error executing the action it will be retried.
This partial failure should not leave the component inoperable.
- Example: Adding a new RocksDB column family.
- Example: Logging a message saying a feature is being finalized.
-## ‘Prepare’ the Ozone Manager
+## 'Prepare' the Ozone Manager
Used to flush all transactions to disk, take a DB snapshot, and purge the
logs, leaving Ratis in a clean state without unapplied log entries. This
prepares the OM for upgrades/downgrades so that no request in the log is
applied to the database in the old version of the code in one OM, and the new
version of the code in another OM.
To prepare an OM quorum, run
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutVersionManager.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutVersionManager.java
index 0f74abf200c..cfc7fd34618 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutVersionManager.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutVersionManager.java
@@ -80,9 +80,9 @@ private void registerUpgradeActions(Set<Class<?>>
typesAnnotatedWith) {
if (feature.layoutVersion() > getMetadataLayoutVersion()) {
LOG.info("Registering Upgrade Action : {}", action.name());
if (annotation.component() == SCM) {
- feature.addScmAction(annotation.type(), action);
+ feature.addScmAction(action);
} else {
- feature.addDatanodeAction(annotation.type(), action);
+ feature.addDatanodeAction(action);
}
} else {
LOG.debug("Skipping Upgrade Action {} since it has been finalized"
+
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
index 4b280ff3cf1..2c5be227f85 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/BasicUpgradeFinalizer.java
@@ -17,12 +17,8 @@
package org.apache.hadoop.ozone.upgrade;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FIRST_UPGRADE_START;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.VALIDATE_IN_PREFINALIZE;
-import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.FIRST_UPGRADE_START_ACTION_FAILED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.INVALID_REQUEST;
import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.LAYOUT_FEATURE_FINALIZATION_FAILED;
-import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.PREFINALIZE_ACTION_VALIDATION_FAILED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.UPDATE_LAYOUT_VERSION_FAILED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_IN_PROGRESS_MSG;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.FINALIZATION_REQUIRED_MSG;
@@ -43,10 +39,8 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
-import java.util.function.Function;
import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeAction;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType;
import org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes;
import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status;
import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.StatusAndMessages;
@@ -262,7 +256,7 @@ protected void finalizeLayoutFeature(LayoutFeature lf,
Optional<?
}
protected void runFinalizationAction(LayoutFeature feature,
- Optional<?extends UpgradeAction> action) throws UpgradeException {
+ Optional<? extends UpgradeAction> action) throws UpgradeException {
if (!action.isPresent()) {
emitNOOPMsg(feature.name());
@@ -276,79 +270,6 @@ protected void runFinalizationAction(LayoutFeature feature,
}
}
- @VisibleForTesting
- protected void runPrefinalizeStateActions(Function<LayoutFeature,
- Function<UpgradeActionType, Optional<? extends UpgradeAction>>>
aFunction,
- Storage storage, T service) throws IOException {
-
- if (!versionManager.needsFinalization()) {
- return;
- }
- this.component = service;
- LOG.info("Running pre-finalized state validations for unfinalized " +
- "layout features.");
- for (Object obj : versionManager.unfinalizedFeatures()) {
- LayoutFeature lf = (LayoutFeature) obj;
- Function<UpgradeActionType, Optional<? extends UpgradeAction>> function =
- aFunction.apply(lf);
- Optional<? extends UpgradeAction> action =
- function.apply(VALIDATE_IN_PREFINALIZE);
- if (action.isPresent()) {
- runValidationAction(lf, action.get());
- }
- }
-
- LOG.info("Running first upgrade commands for unfinalized layout
features.");
- for (Object obj : versionManager.unfinalizedFeatures()) {
- LayoutFeature lf = (LayoutFeature) obj;
- Function<UpgradeActionType, Optional<? extends UpgradeAction>> function =
- aFunction.apply(lf);
- Optional<? extends UpgradeAction> action =
- function.apply(ON_FIRST_UPGRADE_START);
- if (action.isPresent()) {
- runFirstUpgradeAction(lf, action.get(), storage);
- }
- }
- }
-
- private void runValidationAction(LayoutFeature f, UpgradeAction action)
- throws UpgradeException {
- try {
- LOG.info("Executing pre finalize state validation {}", action.name());
- action.execute(component);
- } catch (Exception ex) {
- String msg = "Exception while running pre finalize state validation " +
- "for feature %s";
- LOG.error(String.format(msg, f.name()));
- throw new UpgradeException(
- String.format(msg, f.name()), ex,
- PREFINALIZE_ACTION_VALIDATION_FAILED);
- }
- }
-
- private void runFirstUpgradeAction(LayoutFeature f, UpgradeAction action,
- Storage storage) throws IOException {
- try {
- int versionOnDisk = storage.getFirstUpgradeActionLayoutVersion();
- if (f.layoutVersion() > versionOnDisk) {
- LOG.info("Executing first upgrade start action {}", action.name());
- action.execute(component);
-
- storage.setFirstUpgradeActionLayoutVersion(f.layoutVersion());
- persistStorage(storage);
- } else {
- LOG.info("Skipping action {} since it has already been run.",
- action.name());
- }
- } catch (Exception ex) {
- String msg = "Exception while running first upgrade run actions " +
- "for feature %s";
- LOG.error(String.format(msg, f.name()));
- throw new UpgradeException(
- String.format(msg, f.name()), ex, FIRST_UPGRADE_START_ACTION_FAILED);
- }
- }
-
protected void updateLayoutVersionInVersionFile(LayoutFeature feature,
Storage config)
throws UpgradeException {
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java
index f6e066b6bde..8809b751f24 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java
@@ -22,10 +22,9 @@
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType;
/**
- * Annotation to specify upgrade action run during specific phases.
+ * Annotation to specify upgrade action run during HDDS (SCM or Datanode)
finalization.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@@ -34,8 +33,6 @@
Component component();
- UpgradeActionType type();
-
/**
* Simple enum to denote if an action is for the SCM or the DN.
*/
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeFinalizer.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeFinalizer.java
index f144821c9ec..cdebb0183f2 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeFinalizer.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeFinalizer.java
@@ -20,7 +20,6 @@
import java.io.IOException;
import org.apache.hadoop.hdds.annotation.InterfaceAudience;
import org.apache.hadoop.hdds.annotation.InterfaceStability;
-import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status;
import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.StatusAndMessages;
import org.slf4j.Logger;
@@ -97,13 +96,4 @@ StatusAndMessages reportStatus(String upgradeClientId,
boolean takeover)
*/
Status getStatus();
- /**
- * Runs the set of pre finalized state validations and actions that need to
- * be run exactly once during an upgrade (which introduces a new layout
- * feature).
- * @throws IOException
- */
- void runPrefinalizeStateActions(Storage storage, T service)
- throws IOException;
-
}
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutVersionManager.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutVersionManager.java
index e40dd23eb2e..4792e1179de 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutVersionManager.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutVersionManager.java
@@ -20,8 +20,6 @@
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.INITIAL_VERSION;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FIRST_UPGRADE_START;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -54,9 +52,9 @@ public void testUpgradeActionsRegistered() throws Exception {
lvm.registerUpgradeActions(UPGRADE_ACTIONS_TEST_PACKAGES);
//Cluster is finalized, hence should not register.
- Optional<HDDSUpgradeAction> action =
INITIAL_VERSION.scmAction(ON_FINALIZE);
+ Optional<HDDSUpgradeAction> action = INITIAL_VERSION.scmAction();
assertFalse(action.isPresent());
- action = DATANODE_SCHEMA_V2.datanodeAction(ON_FIRST_UPGRADE_START);
+ action = DATANODE_SCHEMA_V2.datanodeAction();
assertFalse(action.isPresent());
// Start from an unfinalized version manager.
@@ -66,19 +64,19 @@ public void testUpgradeActionsRegistered() throws Exception
{
doCallRealMethod().when(lvm).registerUpgradeActions(any());
lvm.registerUpgradeActions(UPGRADE_ACTIONS_TEST_PACKAGES);
- action = INITIAL_VERSION.scmAction(ON_FINALIZE);
+ action = INITIAL_VERSION.scmAction();
assertTrue(action.isPresent());
assertEquals(MockScmUpgradeAction.class, action.get().getClass());
- assertFalse(INITIAL_VERSION.datanodeAction(ON_FINALIZE).isPresent());
+ assertFalse(INITIAL_VERSION.datanodeAction().isPresent());
MockComponent mockObj = mock(MockComponent.class);
action.get().execute(mockObj);
verify(mockObj, times(1)).mockMethodScm();
verify(mockObj, times(0)).mockMethodDn();
- action = DATANODE_SCHEMA_V2.datanodeAction(ON_FIRST_UPGRADE_START);
+ action = DATANODE_SCHEMA_V2.datanodeAction();
assertTrue(action.isPresent());
assertEquals(MockDnUpgradeAction.class, action.get().getClass());
-
assertFalse(DATANODE_SCHEMA_V2.scmAction(ON_FIRST_UPGRADE_START).isPresent());
+ assertFalse(DATANODE_SCHEMA_V2.scmAction().isPresent());
mockObj = mock(MockComponent.class);
action.get().execute(mockObj);
verify(mockObj, times(0)).mockMethodScm();
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/test/MockComponent.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/test/MockComponent.java
index c64e5fdf569..b16136c9da7 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/test/MockComponent.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/test/MockComponent.java
@@ -19,8 +19,6 @@
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.INITIAL_VERSION;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FIRST_UPGRADE_START;
import static
org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE;
import static org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.SCM;
@@ -40,7 +38,7 @@ public void mockMethodDn() {
/**
* Mock SCM Upgrade Action.
*/
- @UpgradeActionHdds(type = ON_FINALIZE, feature = INITIAL_VERSION,
+ @UpgradeActionHdds(feature = INITIAL_VERSION,
component = SCM)
public static class MockScmUpgradeAction implements
HDDSUpgradeAction<MockComponent> {
@@ -53,8 +51,7 @@ public void execute(MockComponent arg) {
/**
* Mock DN Upgrade Action.
*/
- @UpgradeActionHdds(type = ON_FIRST_UPGRADE_START,
- feature = DATANODE_SCHEMA_V2, component = DATANODE)
+ @UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = DATANODE)
public static class MockDnUpgradeAction implements
HDDSUpgradeAction<MockComponent> {
@Override
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestBasicUpgradeFinalizer.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestBasicUpgradeFinalizer.java
index 2be89cacfe4..00ac2411fe1 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestBasicUpgradeFinalizer.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestBasicUpgradeFinalizer.java
@@ -220,8 +220,7 @@ public void finalizeLayoutFeature(LayoutFeature lf, Object
service)
Storage mockStorage = mock(Storage.class);
InOrder inOrder = inOrder(mockStorage);
- super.finalizeLayoutFeature(lf,
- lf.action(LayoutFeature.UpgradeActionType.ON_FINALIZE), mockStorage);
+ super.finalizeLayoutFeature(lf, lf.action(), mockStorage);
inOrder.verify(mockStorage).setLayoutVersion(eq(lf.layoutVersion()));
try {
@@ -232,10 +231,5 @@ public void finalizeLayoutFeature(LayoutFeature lf, Object
service)
}
finalizeCalled = true;
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage, Object service) {
- // no-op for testing.
- }
}
}
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestDefaultUpgradeFinalizationExecutor.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestDefaultUpgradeFinalizationExecutor.java
index 4cba165e2b5..04460cfda84 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestDefaultUpgradeFinalizationExecutor.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestDefaultUpgradeFinalizationExecutor.java
@@ -23,7 +23,6 @@
import static org.mockito.Mockito.when;
import java.io.IOException;
-import org.apache.hadoop.ozone.common.Storage;
import org.junit.jupiter.api.Test;
/**
@@ -51,10 +50,6 @@ protected void postFinalizeUpgrade(Object service) {
public void finalizeLayoutFeature(LayoutFeature layoutFeatture,
Object service) {
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage, Object service) {
- }
};
DefaultUpgradeFinalizationExecutor executor =
@@ -85,11 +80,6 @@ protected void postFinalizeUpgrade(Object service)
@Override
public void finalizeLayoutFeature(LayoutFeature lf, Object service) {
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage,
- Object service) {
- }
};
DefaultUpgradeFinalizationExecutor executor =
diff --git
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestUpgradeFinalizerActions.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestUpgradeFinalizerActions.java
index 9ff33db914e..02589de7d71 100644
---
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestUpgradeFinalizerActions.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/ozone/upgrade/TestUpgradeFinalizerActions.java
@@ -17,100 +17,16 @@
package org.apache.hadoop.ozone.upgrade;
-import static org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType.SCM;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FIRST_UPGRADE_START;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.VALIDATE_IN_PREFINALIZE;
-import static
org.apache.hadoop.ozone.upgrade.TestUpgradeFinalizerActions.MockLayoutFeature.VERSION_2;
-import static
org.apache.hadoop.ozone.upgrade.TestUpgradeFinalizerActions.MockLayoutFeature.VERSION_3;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import java.io.File;
import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.EnumMap;
import java.util.Optional;
-import java.util.Properties;
import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction;
import org.apache.hadoop.hdds.upgrade.test.MockComponent;
-import org.apache.hadoop.hdds.upgrade.test.MockComponent.MockDnUpgradeAction;
-import org.apache.hadoop.hdds.upgrade.test.MockComponent.MockScmUpgradeAction;
-import org.apache.hadoop.ozone.common.Storage;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.io.TempDir;
/**
* Class to test upgrade related actions.
*/
public class TestUpgradeFinalizerActions {
- @Test
- public void testRunPrefinalizeStateActions(@TempDir File file)
- throws IOException {
-
- VERSION_2.addAction(VALIDATE_IN_PREFINALIZE,
- new MockScmUpgradeAction());
- VERSION_3.addAction(ON_FIRST_UPGRADE_START, new MockDnUpgradeAction());
- MockLayoutVersionManager lvm = new MockLayoutVersionManager(1);
- MockUpgradeFinalizer uF = new MockUpgradeFinalizer(lvm);
-
- MockComponent mockObj = mock(MockComponent.class);
-
- File scmCurrent = Paths.get(file.toString(), "scm", "current")
- .toFile();
- assertTrue(scmCurrent.mkdirs());
- Storage storage = newStorage(file);
- uF.runPrefinalizeStateActions(storage, mockObj);
-
- verify(mockObj, times(1)).mockMethodScm();
- verify(mockObj, times(1)).mockMethodDn();
-
- // Running again does not run the first upgrade start action again.
- uF.runPrefinalizeStateActions(storage, mockObj);
- verify(mockObj, times(2)).mockMethodScm();
- verify(mockObj, times(1)).mockMethodDn();
-
- // Finalization will make sure these actions don't run again.
- lvm.finalized(VERSION_2);
- lvm.finalized(VERSION_3);
- uF.runPrefinalizeStateActions(storage, mockObj);
- verify(mockObj, times(2)).mockMethodScm();
- verify(mockObj, times(1)).mockMethodDn();
- }
-
- @Test
- public void testValidationFailureWorks(@TempDir File file) throws Exception {
- VERSION_2.addAction(VALIDATE_IN_PREFINALIZE,
- new MockFailingUpgradeAction());
- MockLayoutVersionManager lvm = new MockLayoutVersionManager(1);
- MockUpgradeFinalizer uF = new MockUpgradeFinalizer(lvm);
-
- MockComponent mockObj = mock(MockComponent.class);
-
- File scmCurrent = Paths.get(file.toString(), "scm", "current")
- .toFile();
- assertTrue(scmCurrent.mkdirs());
- Storage storage = newStorage(file);
-
- UpgradeException upgradeException = assertThrows(UpgradeException.class,
- () -> uF.runPrefinalizeStateActions(storage, mockObj));
- assertThat(upgradeException)
- .hasMessageContaining("Exception while running pre finalize state
validation");
- }
-
- private Storage newStorage(File f) throws IOException {
- return new Storage(SCM, f, "scm", 1) {
- @Override
- protected Properties getNodeProperties() {
- return new Properties();
- }
- };
- }
-
/**
* Mock upgrade finalizer.
*/
@@ -135,14 +51,6 @@ public void finalizeLayoutFeature(LayoutFeature lf,
MockComponent c) {
public void preFinalizeUpgrade(MockComponent c) {
return;
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage,
- MockComponent mockComponent)
- throws IOException {
- super.runPrefinalizeStateActions(
- lf -> ((MockLayoutFeature) lf)::action, storage, mockComponent);
- }
}
static class MockLayoutVersionManager extends
@@ -162,8 +70,7 @@ enum MockLayoutFeature implements LayoutFeature {
VERSION_3(3);
private int layoutVersion;
- private EnumMap<UpgradeActionType, UpgradeAction> actions =
- new EnumMap<>(UpgradeActionType.class);
+ private UpgradeAction action;
MockLayoutFeature(final int layoutVersion) {
this.layoutVersion = layoutVersion;
@@ -179,13 +86,13 @@ public String description() {
return null;
}
- public void addAction(UpgradeActionType type, UpgradeAction action) {
- this.actions.put(type, action);
+ public void addAction(UpgradeAction upgradeAction) {
+ this.action = upgradeAction;
}
@Override
- public Optional<? extends UpgradeAction> action(UpgradeActionType phase) {
- return Optional.ofNullable(actions.get(phase));
+ public Optional<? extends UpgradeAction> action() {
+ return Optional.ofNullable(action);
}
}
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
index cdb5bdfbece..32673e87279 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java
@@ -1554,8 +1554,6 @@ public CertificateStore getCertificateStore() {
*/
@Override
public void start() throws IOException {
- finalizationManager.runPrefinalizeStateActions();
-
if (LOG.isInfoEnabled()) {
LOG.info(buildRpcServerStartMessage(
"StorageContainerLocationProtocol RPC server",
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
index b06f6c290e2..114063c5bce 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManager.java
@@ -43,8 +43,6 @@ UpgradeFinalization.StatusAndMessages
queryUpgradeFinalizationProgress(
BasicUpgradeFinalizer<SCMUpgradeFinalizationContext,
HDDSLayoutVersionManager>
getUpgradeFinalizer();
- void runPrefinalizeStateActions() throws IOException;
-
boolean crossedCheckpoint(FinalizationCheckpoint checkpoint);
FinalizationCheckpoint getCheckpoint();
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
index 8d717e225f4..5155aea425b 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationManagerImpl.java
@@ -132,11 +132,6 @@ HDDSLayoutVersionManager> getUpgradeFinalizer() {
return upgradeFinalizer;
}
- @Override
- public void runPrefinalizeStateActions() throws IOException {
- upgradeFinalizer.runPrefinalizeStateActions(storage, context);
- }
-
@Override
public boolean crossedCheckpoint(FinalizationCheckpoint checkpoint) {
return finalizationStateManager.crossedCheckpoint(checkpoint);
diff --git
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
index 891f2d38b90..6fb479592ad 100644
---
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
+++
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/SCMUpgradeFinalizer.java
@@ -27,7 +27,6 @@
import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager;
-import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.upgrade.BasicUpgradeFinalizer;
import org.apache.hadoop.ozone.upgrade.LayoutFeature;
import org.apache.hadoop.ozone.upgrade.UpgradeException;
@@ -102,7 +101,7 @@ void replicatedFinalizationSteps(HDDSLayoutFeature lf,
SCMUpgradeFinalizationContext context) throws UpgradeException {
// Run upgrade actions and update VERSION file.
super.finalizeLayoutFeature(lf,
- lf.scmAction(LayoutFeature.UpgradeActionType.ON_FINALIZE),
+ lf.scmAction(),
context.getStorage());
}
@@ -121,13 +120,6 @@ public void
postFinalizeUpgrade(SCMUpgradeFinalizationContext context)
}
}
- @Override
- public void runPrefinalizeStateActions(Storage storage,
- SCMUpgradeFinalizationContext context) throws IOException {
- super.runPrefinalizeStateActions(
- lf -> ((HDDSLayoutFeature) lf)::scmAction, storage, context);
- }
-
private void closePipelinesBeforeFinalization(PipelineManager
pipelineManager)
throws IOException {
/*
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 4d390d5eb18..fe921a5147e 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.hdds.scm.server.upgrade;
import static
org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.DATANODE_SCHEMA_V2;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.SCM;
import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction;
@@ -29,8 +28,7 @@
/**
* SCM Upgrade Action for the very first Upgrade Version.
*/
-@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = SCM, type =
- ON_FINALIZE)
+@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = SCM)
public class ScmOnFinalizeActionForDatanodeSchemaV2 implements
HDDSUpgradeAction<SCMUpgradeFinalizationContext> {
private static final Logger LOG =
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index b48d8fbe40f..7a9d66f86df 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -1825,7 +1825,6 @@ public void start() throws IOException {
omRatisServer.start();
}
- upgradeFinalizer.runPrefinalizeStateActions(omStorage, this);
Integer layoutVersionInDB = getLayoutVersionInDB();
if (layoutVersionInDB == null ||
versionManager.getMetadataLayoutVersion() != layoutVersionInDB) {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
index 057484c673e..ef99b453b7f 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutFeature.java
@@ -17,9 +17,7 @@
package org.apache.hadoop.ozone.om.upgrade;
-import java.util.EnumMap;
import java.util.Optional;
-import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.ozone.upgrade.LayoutFeature;
/**
@@ -49,33 +47,16 @@ public enum OMLayoutFeature implements LayoutFeature {
SNAPSHOT_DEFRAG(9, "Supporting defragmentation of snapshot");
/////////////////////////////// /////////////////////////////
- // Example OM Layout Feature with Actions
- // CREATE_EC(1, "",
- // new ImmutablePair<>(ON_FINALIZE, new OnFinalizeECAction()),
- // new ImmutablePair<>(FIRST_RUN_ON_UPGRADE,
- // new OnFirstUpgradeStartECAction());
- //
- ////////////////////////////// //////////////////////////////
private int layoutVersion;
private String description;
- private EnumMap<UpgradeActionType, OmUpgradeAction> actions =
- new EnumMap<>(UpgradeActionType.class);
+ private OmUpgradeAction action;
OMLayoutFeature(final int layoutVersion, String description) {
this.layoutVersion = layoutVersion;
this.description = description;
}
- OMLayoutFeature(final int layoutVersion, String description,
- Pair<UpgradeActionType, OmUpgradeAction>... actions) {
- this.layoutVersion = layoutVersion;
- this.description = description;
- for (Pair<UpgradeActionType, OmUpgradeAction> action : actions) {
- this.actions.put(action.getKey(), action.getValue());
- }
- }
-
@Override
public int layoutVersion() {
return layoutVersion;
@@ -86,12 +67,20 @@ public String description() {
return description;
}
- public void addAction(UpgradeActionType type, OmUpgradeAction action) {
- this.actions.put(type, action);
+ /**
+ * Associates a given upgrade action with this feature. Only the first
upgrade action registered will be used.
+ *
+ * @param upgradeAction The upgrade action to associate with this feature.
+ */
+ public void addAction(OmUpgradeAction upgradeAction) {
+ // Required by SpotBugs since this setter exists in an enum.
+ if (this.action == null) {
+ this.action = upgradeAction;
+ }
}
@Override
- public Optional<OmUpgradeAction> action(UpgradeActionType phase) {
- return Optional.ofNullable(actions.get(phase));
+ public Optional<OmUpgradeAction> action() {
+ return Optional.ofNullable(action);
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
index b1e680f7c18..5da5919af17 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMLayoutVersionManager.java
@@ -99,7 +99,7 @@ protected void registerUpgradeActions(String packageName) {
OMLayoutFeature feature = annotation.feature();
if (feature.layoutVersion() > getMetadataLayoutVersion()) {
LOG.info("Registering Upgrade Action : {}", action.name());
- feature.addAction(annotation.type(), action);
+ feature.addAction(action);
} else {
LOG.info("Skipping Upgrade Action {} since it has been finalized" +
".", action.name());
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizer.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizer.java
index 5fbf76feba3..20bf57d93f3 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizer.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/upgrade/OMUpgradeFinalizer.java
@@ -17,8 +17,6 @@
package org.apache.hadoop.ozone.om.upgrade;
-import java.io.IOException;
-import org.apache.hadoop.ozone.common.Storage;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.upgrade.BasicUpgradeFinalizer;
import org.apache.hadoop.ozone.upgrade.LayoutFeature;
@@ -38,14 +36,7 @@ public OMUpgradeFinalizer(OMLayoutVersionManager
versionManager) {
public void finalizeLayoutFeature(LayoutFeature layoutFeature,
OzoneManager om) throws UpgradeException {
super.finalizeLayoutFeature(layoutFeature,
- layoutFeature.action(LayoutFeature.UpgradeActionType.ON_FINALIZE),
+ layoutFeature.action(),
om.getOmStorage());
}
-
- @Override
- public void runPrefinalizeStateActions(Storage storage, OzoneManager om)
- throws IOException {
- super.runPrefinalizeStateActions(
- lf -> ((OMLayoutFeature) lf)::action, storage, om);
- }
}
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 8637713cb4b..eef1c710252 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.om.upgrade;
import static org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.QUOTA;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OzoneManager;
@@ -31,7 +30,7 @@
/**
* Quota repair for usages action to be triggered after upgrade.
*/
-@UpgradeActionOm(type = ON_FINALIZE, feature = QUOTA)
+@UpgradeActionOm(feature = QUOTA)
public class QuotaRepairUpgradeAction implements OmUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(QuotaRepairUpgradeAction.class);
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/UpgradeActionOm.java
index 97d09fe3c17..4d0d6b5c017 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/UpgradeActionOm.java
@@ -21,15 +21,12 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType;
/**
- * Annotation to specify upgrade action run during specific phases.
+ * Annotation to specify upgrade action run during Ozone Manager finalization.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface UpgradeActionOm {
OMLayoutFeature feature();
-
- UpgradeActionType type();
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizer.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizer.java
index 60b192d3923..6346f5c51ee 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizer.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/upgrade/TestOMUpgradeFinalizer.java
@@ -17,7 +17,6 @@
package org.apache.hadoop.ozone.om.upgrade;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.ON_FINALIZE;
import static
org.apache.hadoop.ozone.upgrade.UpgradeException.ResultCodes.LAYOUT_FEATURE_FINALIZATION_FAILED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.ALREADY_FINALIZED;
import static
org.apache.hadoop.ozone.upgrade.UpgradeFinalization.Status.FINALIZATION_DONE;
@@ -152,7 +151,7 @@ public void testFinalizationWithUpgradeAction() throws
Exception {
Optional<OmUpgradeAction> action = Optional.of(om -> om.getVersion());
OzoneManager om = mockOzoneManager(0);
Iterable<OMLayoutFeature> lfs = mockFeatures("feature-1", "feature-2");
- when(lfs.iterator().next().action(ON_FINALIZE)).thenReturn(action);
+ when(lfs.iterator().next().action()).thenReturn(action);
setupVersionManagerMockToFinalize(lfs);
OMUpgradeFinalizer finalizer = new OMUpgradeFinalizer(versionManager);
@@ -190,7 +189,7 @@ public void testFinalizationWithFailingUpgradeAction()
throws Exception {
OzoneManager om = mockOzoneManager(0);
Iterable<OMLayoutFeature> lfs = mockFeatures("feature-1", "feature-2");
- when(lfs.iterator().next().action(ON_FINALIZE)).thenReturn(action);
+ when(lfs.iterator().next().action()).thenReturn(action);
setupVersionManagerMockToFinalize(lfs);
OMUpgradeFinalizer finalizer = new OMUpgradeFinalizer(versionManager);
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 81f00ba9cbd..388b5134c41 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
@@ -20,7 +20,6 @@
import static
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_SUPPORTED_OPERATION;
import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutFeature.INITIAL_VERSION;
import static
org.apache.hadoop.ozone.om.upgrade.OMLayoutVersionManager.OM_UPGRADE_CLASS_PACKAGE;
-import static
org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType.VALIDATE_IN_PREFINALIZE;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -40,7 +39,6 @@
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.request.OMClientRequest;
-import org.apache.hadoop.ozone.upgrade.LayoutFeature.UpgradeActionType;
import org.junit.jupiter.api.Test;
/**
@@ -78,17 +76,13 @@ public void
testOMLayoutFeaturesHaveIncreasingLayoutVersion()
currVersion = lf.layoutVersion();
lastFeature = lf;
}
- for (UpgradeActionType type : UpgradeActionType.values()) {
- lastFeature.addAction(type, arg -> {
- String v = arg.getVersion();
- });
- }
+ lastFeature.addAction(arg -> {
+ String v = arg.getVersion();
+ });
OzoneManager omMock = mock(OzoneManager.class);
- for (UpgradeActionType type : UpgradeActionType.values()) {
- lastFeature.action(type).get().execute(omMock);
- }
- verify(omMock, times(UpgradeActionType.values().length)).getVersion();
+ lastFeature.action().get().execute(omMock);
+ verify(omMock, times(1)).getVersion();
}
@Test
@@ -119,7 +113,7 @@ public void testOmUpgradeActionsRegistered() throws
Exception {
// INITIAL_VERSION is finalized, hence should not register.
Optional<OmUpgradeAction> action =
- INITIAL_VERSION.action(VALIDATE_IN_PREFINALIZE);
+ INITIAL_VERSION.action();
assertFalse(action.isPresent());
lvm = mock(OMLayoutVersionManager.class);
@@ -127,7 +121,7 @@ public void testOmUpgradeActionsRegistered() throws
Exception {
doCallRealMethod().when(lvm).registerUpgradeActions(anyString());
lvm.registerUpgradeActions(OM_UPGRADE_CLASS_PACKAGE);
- action = INITIAL_VERSION.action(VALIDATE_IN_PREFINALIZE);
+ action = INITIAL_VERSION.action();
assertTrue(action.isPresent());
assertEquals(MockOmUpgradeAction.class, action.get().getClass());
OzoneManager omMock = mock(OzoneManager.class);
@@ -138,7 +132,7 @@ public void testOmUpgradeActionsRegistered() throws
Exception {
/**
* Mock OM upgrade action class.
*/
- @UpgradeActionOm(type = VALIDATE_IN_PREFINALIZE, feature =
+ @UpgradeActionOm(feature =
INITIAL_VERSION)
public static class MockOmUpgradeAction implements OmUpgradeAction {
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 21a8be5dc18..ea8af99d96e 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.recon.upgrade;
import static
org.apache.hadoop.ozone.recon.upgrade.ReconLayoutFeature.INITIAL_VERSION;
-import static
org.apache.hadoop.ozone.recon.upgrade.ReconUpgradeAction.UpgradeActionType.FINALIZE;
import static
org.apache.ozone.recon.schema.ContainerSchemaDefinition.UNHEALTHY_CONTAINERS_TABLE_NAME;
import static org.apache.ozone.recon.schema.SqlDbUtils.TABLE_EXISTS_CHECK;
import static org.jooq.impl.DSL.field;
@@ -39,7 +38,7 @@
* Upgrade action for the INITIAL schema version, which manages constraints
* for the UNHEALTHY_CONTAINERS table.
*/
-@UpgradeActionRecon(feature = INITIAL_VERSION, type = FINALIZE)
+@UpgradeActionRecon(feature = INITIAL_VERSION)
public class InitialConstraintUpgradeAction implements ReconUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(InitialConstraintUpgradeAction.class);
@@ -91,11 +90,6 @@ private void addUpdatedConstraint() {
Arrays.toString(enumStates));
}
- @Override
- public UpgradeActionType getType() {
- return FINALIZE;
- }
-
@VisibleForTesting
public void setDslContext(DSLContext dslContext) {
this.dslContext = dslContext;
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 af69ea8b88c..d4ee78c1a6a 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
@@ -17,8 +17,6 @@
package org.apache.hadoop.ozone.recon.upgrade;
-import static
org.apache.hadoop.ozone.recon.upgrade.ReconUpgradeAction.UpgradeActionType.FINALIZE;
-
import com.google.inject.Injector;
import javax.sql.DataSource;
import org.apache.hadoop.ozone.recon.ReconGuiceServletContextListener;
@@ -35,7 +33,7 @@
* Recon startup is not blocked. During rebuild, APIs that depend on
* the tree may return initializing responses as designed.
*/
-@UpgradeActionRecon(feature = ReconLayoutFeature.NSSUMMARY_AGGREGATED_TOTALS,
type = FINALIZE)
+@UpgradeActionRecon(feature = ReconLayoutFeature.NSSUMMARY_AGGREGATED_TOTALS)
public class NSSummaryAggregatedTotalsUpgrade implements ReconUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(NSSummaryAggregatedTotalsUpgrade.class);
@@ -60,9 +58,4 @@ public void execute(DataSource source) throws Exception {
"scheduler task.", result);
}
}
-
- @Override
- public UpgradeActionType getType() {
- return FINALIZE;
- }
}
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutFeature.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutFeature.java
index e55e6410557..76d5bdcb9a9 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutFeature.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutFeature.java
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.recon.upgrade;
import java.util.Arrays;
-import java.util.EnumMap;
import java.util.Optional;
import java.util.Set;
import org.reflections.Reflections;
@@ -39,8 +38,7 @@ public enum ReconLayoutFeature {
private final int version;
private final String description;
- private final EnumMap<ReconUpgradeAction.UpgradeActionType,
ReconUpgradeAction> actions =
- new EnumMap<>(ReconUpgradeAction.UpgradeActionType.class);
+ private ReconUpgradeAction action;
ReconLayoutFeature(final int version, String description) {
this.version = version;
@@ -56,28 +54,29 @@ public String getDescription() {
}
/**
- * Retrieves the upgrade action for the specified {@link
ReconUpgradeAction.UpgradeActionType}.
+ * Retrieves the upgrade action for this feature.
*
- * @param type The type of the upgrade action (e.g., FINALIZE).
* @return An {@link Optional} containing the upgrade action if present.
*/
- public Optional<ReconUpgradeAction>
getAction(ReconUpgradeAction.UpgradeActionType type) {
- return Optional.ofNullable(actions.get(type));
+ public Optional<ReconUpgradeAction> getAction() {
+ return Optional.ofNullable(action);
}
/**
- * Associates a given upgrade action with a specific upgrade phase for this
feature.
+ * Associates a given upgrade action with this feature. Only the first
upgrade action registered will be used.
*
- * @param type The phase/type of the upgrade action.
- * @param action The upgrade action to associate with this feature.
+ * @param upgradeAction The upgrade action to associate with this feature.
*/
- public void addAction(ReconUpgradeAction.UpgradeActionType type,
ReconUpgradeAction action) {
- actions.put(type, action);
+ public void addAction(ReconUpgradeAction upgradeAction) {
+ // Required by SpotBugs since this setter exists in an enum.
+ if (this.action == null) {
+ this.action = upgradeAction;
+ }
}
/**
* Scans the classpath for all classes annotated with {@link
UpgradeActionRecon}
- * and registers their upgrade actions for the corresponding feature and
phase.
+ * and registers their upgrade actions for the corresponding feature.
* This method dynamically loads and registers all upgrade actions based on
their
* annotations.
*/
@@ -89,7 +88,7 @@ public static void registerUpgradeActions() {
try {
ReconUpgradeAction action = (ReconUpgradeAction)
actionClass.getDeclaredConstructor().newInstance();
UpgradeActionRecon annotation =
actionClass.getAnnotation(UpgradeActionRecon.class);
- annotation.feature().addAction(annotation.type(), action);
+ annotation.feature().addAction(action);
} catch (Exception e) {
throw new RuntimeException("Failed to register upgrade action: " +
actionClass.getSimpleName(), e);
}
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutVersionManager.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutVersionManager.java
index cd160d7bbcc..cb12546771e 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutVersionManager.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconLayoutVersionManager.java
@@ -90,8 +90,8 @@ public void finalizeLayoutFeatures() {
for (ReconLayoutFeature feature : featuresToFinalize) {
LOG.debug("Processing feature version: {}", feature.getVersion());
try {
- // Fetch only the FINALIZE action for the feature
- Optional<ReconUpgradeAction> action =
feature.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE);
+ // Fetch the action for the feature
+ Optional<ReconUpgradeAction> action = feature.getAction();
if (action.isPresent()) {
LOG.debug("Finalize action found for feature version: {}",
feature.getVersion());
// Update the schema version in the database
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 9a9d9a1df98..17d64abb9c5 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
@@ -36,8 +36,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 = ReconLayoutFeature.TASK_STATUS_STATISTICS,
- type = ReconUpgradeAction.UpgradeActionType.FINALIZE)
+@UpgradeActionRecon(feature = ReconLayoutFeature.TASK_STATUS_STATISTICS)
public class ReconTaskStatusTableUpgradeAction implements ReconUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(ReconTaskStatusTableUpgradeAction.class);
@@ -93,8 +92,4 @@ public void execute(DataSource dataSource) throws
DataAccessException {
LOG.error("Error while upgrading RECON_TASK_STATUS table.", ex);
}
}
-
- @Override public UpgradeActionType getType() {
- return UpgradeActionType.FINALIZE;
- }
}
diff --git
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeAction.java
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeAction.java
index 9f48577c7a8..67aa0e9d569 100644
---
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeAction.java
+++
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/upgrade/ReconUpgradeAction.java
@@ -25,25 +25,7 @@
public interface ReconUpgradeAction {
/**
- * Defines the different phases during which upgrade actions can be executed.
- * Each action type corresponds to a specific point in the upgrade process:
- *
- * - FINALIZE: This action is executed automatically during the startup
- * of Recon when it finalizes the layout upgrade. It ensures that all
necessary
- * upgrades or schema changes are applied to bring the system in sync with
- * the latest version.
- */
- enum UpgradeActionType {
- FINALIZE
- }
-
- /**
- * Execute the upgrade action.
+ * Execute the upgrade action during finalization.
*/
void execute(DataSource source) throws Exception;
-
- /**
- * Provides the type of upgrade phase (e.g., FINALIZE).
- */
- UpgradeActionType getType();
}
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 e4eea25dad6..9d5a37cf7db 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
@@ -30,8 +30,7 @@
* The action triggers a full rebuild of the NSSummary ensuring that the new
field: replicatedSizeOfFiles is correctly
* populated for all objects.
*/
-@UpgradeActionRecon(feature = ReconLayoutFeature.REPLICATED_SIZE_OF_FILES,
- type = ReconUpgradeAction.UpgradeActionType.FINALIZE)
+@UpgradeActionRecon(feature = ReconLayoutFeature.REPLICATED_SIZE_OF_FILES)
public class ReplicatedSizeOfFilesUpgradeAction implements ReconUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(ReplicatedSizeOfFilesUpgradeAction.class);
@@ -58,9 +57,4 @@ public void execute(DataSource dataSource) {
}
LOG.info("Completed full rebuild of NSSummary for REPLICATED_SIZE_OF_FILES
upgrade.");
}
-
- @Override
- public UpgradeActionType getType() {
- return UpgradeActionType.FINALIZE;
- }
}
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 3002a5362a8..ebf8556f5c4 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
@@ -18,7 +18,6 @@
package org.apache.hadoop.ozone.recon.upgrade;
import static
org.apache.hadoop.ozone.recon.upgrade.ReconLayoutFeature.UNHEALTHY_CONTAINER_REPLICA_MISMATCH;
-import static
org.apache.hadoop.ozone.recon.upgrade.ReconUpgradeAction.UpgradeActionType.FINALIZE;
import static
org.apache.ozone.recon.schema.ContainerSchemaDefinition.UNHEALTHY_CONTAINERS_TABLE_NAME;
import static org.apache.ozone.recon.schema.SqlDbUtils.TABLE_EXISTS_CHECK;
import static org.jooq.impl.DSL.field;
@@ -38,7 +37,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, type =
FINALIZE)
+@UpgradeActionRecon(feature = UNHEALTHY_CONTAINER_REPLICA_MISMATCH)
public class UnhealthyContainerReplicaMismatchAction implements
ReconUpgradeAction {
private static final Logger LOG =
LoggerFactory.getLogger(UnhealthyContainerReplicaMismatchAction.class);
private DSLContext dslContext;
@@ -88,9 +87,4 @@ private void addUpdatedConstraint() {
LOG.info("Added the updated constraint to the UNHEALTHY_CONTAINERS table
for enum state values: {}",
Arrays.toString(enumStates));
}
-
- @Override
- public UpgradeActionType getType() {
- return FINALIZE;
- }
}
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
index 7dd55598e18..d4b59a09799 100644
---
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
@@ -24,14 +24,13 @@
/**
* The {@code UpgradeActionRecon} annotation is used to specify
- * upgrade actions that should be executed during particular phases
+ * 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 and upgrade phase. The
- * framework will dynamically discover these annotated upgrade
- * actions and execute them based on the feature's version and
- * the defined action type (e.g., {@link
ReconUpgradeAction.UpgradeActionType#FINALIZE}).
+ * 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,
@@ -40,11 +39,11 @@
* Example usage:
*
* <pre>
- * @UpgradeActionRecon(feature = FEATURE_NAME, type = FINALIZE)
+ * @UpgradeActionRecon(feature = FEATURE_NAME)
* public class FeatureNameUpgradeAction implements ReconUpgradeAction {
* @Override
- * public void execute() throws Exception {
- * // Custom upgrade logic for FEATURE_1
+ * public void execute(DataSource source) throws Exception {
+ * // Custom upgrade logic for FEATURE_NAME
* }
* }
* </pre>
@@ -57,9 +56,4 @@
* Defines the layout feature this upgrade action is associated with.
*/
ReconLayoutFeature feature();
-
- /**
- * Defines the type of upgrade phase during which the action should be
executed.
- */
- ReconUpgradeAction.UpgradeActionType type();
}
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestNSSummaryAggregatedTotalsUpgrade.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestNSSummaryAggregatedTotalsUpgrade.java
index 87b5d2b2f71..80b6d7cc576 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestNSSummaryAggregatedTotalsUpgrade.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestNSSummaryAggregatedTotalsUpgrade.java
@@ -152,9 +152,4 @@ public void testExecuteWithInjectorException() throws
Exception {
verify(mockInjector).getInstance(ReconTaskController.class);
}
}
-
- @Test
- public void testGetType() {
- assert upgradeAction.getType() ==
ReconUpgradeAction.UpgradeActionType.FINALIZE;
- }
}
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReconLayoutVersionManager.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReconLayoutVersionManager.java
index 50507acca76..5f2d451dd06 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReconLayoutVersionManager.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReconLayoutVersionManager.java
@@ -54,7 +54,6 @@ public class TestReconLayoutVersionManager {
private ReconSchemaVersionTableManager schemaVersionTableManager;
private ReconLayoutVersionManager layoutVersionManager;
private MockedStatic<ReconLayoutFeature> mockedEnum;
- private MockedStatic<ReconUpgradeAction.UpgradeActionType>
mockedEnumUpgradeActionType;
private DataSource mockDataSource;
private Connection mockConnection;
@@ -65,18 +64,17 @@ public void setUp() throws SQLException {
// Mocking ReconLayoutFeature.values() to return custom enum instances
mockedEnum = mockStatic(ReconLayoutFeature.class);
- mockedEnumUpgradeActionType =
mockStatic(ReconUpgradeAction.UpgradeActionType.class);
ReconLayoutFeature feature1 = mock(ReconLayoutFeature.class);
when(feature1.getVersion()).thenReturn(1);
ReconUpgradeAction action1 = mock(ReconUpgradeAction.class);
- when(feature1.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature1.getAction())
.thenReturn(Optional.of(action1));
ReconLayoutFeature feature2 = mock(ReconLayoutFeature.class);
when(feature2.getVersion()).thenReturn(2);
ReconUpgradeAction action2 = mock(ReconUpgradeAction.class);
- when(feature2.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature2.getAction())
.thenReturn(Optional.of(action2));
// Common mocks for all tests
@@ -102,9 +100,6 @@ public void setUp() throws SQLException {
public void tearDown() {
// Close the static mock after each test to deregister it
mockedEnum.close();
- if (mockedEnumUpgradeActionType != null) {
- mockedEnumUpgradeActionType.close();
- }
}
/**
@@ -182,7 +177,7 @@ public void testUpgradeActionFailure() throws Exception {
// Simulate an exception being thrown during the upgrade action execution
doThrow(new RuntimeException("Upgrade
failed")).when(action1).execute(mockDataSource);
- when(feature1.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature1.getAction())
.thenReturn(Optional.of(action1));
// Mock the static values method to return the custom feature
@@ -220,7 +215,7 @@ public void testUpdateSchemaFailure() throws Exception {
// Simulate an exception being thrown during the schema version update
doThrow(new RuntimeException("Schema update
failed")).when(schemaVersionTableManager).
updateSchemaVersion(1, mockConnection);
- when(feature1.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature1.getAction())
.thenReturn(Optional.of(action1));
// Mock the static values method to return the custom feature
@@ -253,19 +248,19 @@ public void testUpgradeActionExecutionOrder() throws
Exception {
ReconLayoutFeature feature1 = mock(ReconLayoutFeature.class);
when(feature1.getVersion()).thenReturn(1);
ReconUpgradeAction action1 = mock(ReconUpgradeAction.class);
- when(feature1.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature1.getAction())
.thenReturn(Optional.of(action1));
ReconLayoutFeature feature2 = mock(ReconLayoutFeature.class);
when(feature2.getVersion()).thenReturn(2);
ReconUpgradeAction action2 = mock(ReconUpgradeAction.class);
- when(feature2.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature2.getAction())
.thenReturn(Optional.of(action2));
ReconLayoutFeature feature3 = mock(ReconLayoutFeature.class);
when(feature3.getVersion()).thenReturn(3);
ReconUpgradeAction action3 = mock(ReconUpgradeAction.class);
- when(feature3.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature3.getAction())
.thenReturn(Optional.of(action3));
// Mock the static values method to return custom features in a jumbled
order
@@ -314,13 +309,13 @@ public void
testFinalizingNewFeatureWithoutReFinalizingPreviousFeatures() throws
ReconLayoutFeature feature1 = mock(ReconLayoutFeature.class);
when(feature1.getVersion()).thenReturn(1);
ReconUpgradeAction action1 = mock(ReconUpgradeAction.class);
- when(feature1.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature1.getAction())
.thenReturn(Optional.of(action1));
ReconLayoutFeature feature2 = mock(ReconLayoutFeature.class);
when(feature2.getVersion()).thenReturn(2);
ReconUpgradeAction action2 = mock(ReconUpgradeAction.class);
- when(feature2.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature2.getAction())
.thenReturn(Optional.of(action2));
mockedEnum.when(ReconLayoutFeature::values).thenReturn(new
ReconLayoutFeature[]{feature1, feature2});
@@ -336,7 +331,7 @@ public void
testFinalizingNewFeatureWithoutReFinalizingPreviousFeatures() throws
ReconLayoutFeature feature3 = mock(ReconLayoutFeature.class);
when(feature3.getVersion()).thenReturn(3);
ReconUpgradeAction action3 = mock(ReconUpgradeAction.class);
- when(feature3.getAction(ReconUpgradeAction.UpgradeActionType.FINALIZE))
+ when(feature3.getAction())
.thenReturn(Optional.of(action3));
mockedEnum.when(ReconLayoutFeature::values).thenReturn(new
ReconLayoutFeature[]{feature1, feature2, feature3});
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReplicatedSizeOfFilesUpgradeAction.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReplicatedSizeOfFilesUpgradeAction.java
index 8bc7863f073..2597b8877c6 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReplicatedSizeOfFilesUpgradeAction.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/upgrade/TestReplicatedSizeOfFilesUpgradeAction.java
@@ -88,9 +88,4 @@ public void
testExecuteThrowsRuntimeExceptionOnRebuildFailure() {
assertEquals("Failed to rebuild NSSummary during upgrade",
thrown.getMessage());
}
}
-
- @Test
- public void testGetTypeReturnsFinalize() {
- assertEquals(ReconUpgradeAction.UpgradeActionType.FINALIZE,
upgradeAction.getType());
- }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]