diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentUpgradeActionProvider.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentUpgradeActionProvider.java index bf2a8543d165..48bee3a68681 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentUpgradeActionProvider.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/upgrade/ComponentUpgradeActionProvider.java @@ -27,7 +27,7 @@ * @param concrete upgrade action type (for example OM-specific or HDDS-specific) */ @FunctionalInterface -public interface ComponentUpgradeActionProvider { +public interface ComponentUpgradeActionProvider> { /** * Returns all upgrade actions from this provider, keyed by component version. diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeAction.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeAction.java new file mode 100644 index 000000000000..f014c50b2fbc --- /dev/null +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeAction.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.upgrade; + +import org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine; +import org.apache.hadoop.ozone.upgrade.UpgradeAction; + +/** + * Datanode Upgrade Action interface. An upgrade action is an operation that + * needs to be executed during finalization. + */ +public interface DatanodeUpgradeAction extends UpgradeAction { +} 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 new file mode 100644 index 000000000000..a2e9ca8a925b --- /dev/null +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/DatanodeUpgradeActionProvider.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.upgrade; + +import org.apache.hadoop.hdds.ComponentVersion; +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 { + + 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/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSUpgradeAction.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java similarity index 83% rename from hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSUpgradeAction.java rename to hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java index 81e1ade37003..170699609580 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSUpgradeAction.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java @@ -15,12 +15,7 @@ * limitations under the License. */ -package org.apache.hadoop.hdds.upgrade; - -import org.apache.hadoop.ozone.upgrade.UpgradeAction; - /** - * Upgrade Action for SCM and DataNodes. + * Provides Datanode upgrade actions and providers. */ -public interface HDDSUpgradeAction extends UpgradeAction { -} +package org.apache.hadoop.hdds.upgrade; 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 5263b7b87a66..977df48a5527 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 @@ -43,6 +43,7 @@ import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.SCMCommandProto; import org.apache.hadoop.hdds.security.symmetric.SecretKeyClient; import org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient; +import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeActionProvider; import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager; import org.apache.hadoop.hdds.utils.HddsServerUtil; import org.apache.hadoop.hdds.utils.IOUtils; @@ -168,7 +169,7 @@ public DatanodeStateMachine(HddsDatanodeService hddsDatanodeService, datanodeDetails.getUuidString()); layoutVersionManager = new HDDSLayoutVersionManager( - layoutStorage.getApparentVersion()); + layoutStorage.getApparentVersion(), null, new DatanodeUpgradeActionProvider()); upgradeFinalizer = new DataNodeUpgradeFinalizer(layoutVersionManager); VersionedDatanodeFeatures.initialize(layoutVersionManager); 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 7739797953ca..281c68e66417 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,10 +18,9 @@ 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.UpgradeActionHdds.Component.DATANODE; import org.apache.hadoop.hdds.scm.container.ContainerID; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; +import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction; import org.apache.hadoop.hdds.utils.db.BatchOperation; import org.apache.hadoop.hdds.utils.db.CodecException; import org.apache.hadoop.hdds.utils.db.RocksDatabaseException; @@ -32,16 +31,16 @@ 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.UpgradeActionHdds; +import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Upgrade Action for DataNode for update the table schema data of containerIds Table. */ -@UpgradeActionHdds(feature = WITNESSED_CONTAINER_DB_PROTO_VALUE, component = DATANODE) +@UpgradeActionDatanode(feature = WITNESSED_CONTAINER_DB_PROTO_VALUE) public class ContainerTableSchemaFinalizeAction - implements HDDSUpgradeAction { + implements DatanodeUpgradeAction { private static final Logger LOG = LoggerFactory.getLogger(ContainerTableSchemaFinalizeAction.class); 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 bf3f5285e36a..20005ff9c481 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,20 +18,19 @@ 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.UpgradeActionHdds.Component.DATANODE; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; +import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction; import org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine; -import org.apache.hadoop.ozone.upgrade.UpgradeActionHdds; +import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Upgrade Action for DataNode for the very first first Upgrade Version. */ -@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = DATANODE) +@UpgradeActionDatanode(feature = DATANODE_SCHEMA_V2) public class DatanodeSchemaV2FinalizeAction - implements HDDSUpgradeAction { + implements DatanodeUpgradeAction { private static final Logger LOG = LoggerFactory.getLogger(DatanodeSchemaV2FinalizeAction.class); 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 6c05a201c2af..e4d97ad5ae42 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,16 +18,15 @@ 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.UpgradeActionHdds.Component.DATANODE; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; +import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction; import org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfiguration; import org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine; import org.apache.hadoop.ozone.container.common.utils.HddsVolumeUtil; 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.UpgradeActionHdds; +import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode; import org.apache.ratis.util.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,9 +34,9 @@ /** * Upgrade Action for DataNode for SCHEMA V3. */ -@UpgradeActionHdds(feature = DATANODE_SCHEMA_V3, component = DATANODE) +@UpgradeActionDatanode(feature = DATANODE_SCHEMA_V3) public class DatanodeSchemaV3FinalizeAction - implements HDDSUpgradeAction { + implements DatanodeUpgradeAction { private static final Logger LOG = LoggerFactory.getLogger(DatanodeSchemaV3FinalizeAction.class); 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 37d3b241f0d3..c8c7ca6d1da1 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,28 +18,27 @@ package org.apache.hadoop.ozone.container.upgrade; import static org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature.SCM_HA; -import static org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.DATANODE; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; +import org.apache.hadoop.hdds.upgrade.DatanodeUpgradeAction; import org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine; 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.UpgradeActionHdds; +import org.apache.hadoop.ozone.upgrade.UpgradeActionDatanode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Action to run upgrade flow for SCM HA exactly once. */ -@UpgradeActionHdds(feature = SCM_HA, component = DATANODE) +@UpgradeActionDatanode(feature = SCM_HA) public class ScmHAFinalizeUpgradeActionDatanode - implements HDDSUpgradeAction { + implements DatanodeUpgradeAction { private static final Logger LOG = LoggerFactory.getLogger(ScmHAFinalizeUpgradeActionDatanode.class); diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java similarity index 80% rename from hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java rename to hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java index 8809b751f24e..f6419085f3b5 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionHdds.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionDatanode.java @@ -24,23 +24,10 @@ import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature; /** - * Annotation to specify upgrade action run during HDDS (SCM or Datanode) finalization. + * Annotation to specify a Datanode upgrade action. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface UpgradeActionHdds { +public @interface UpgradeActionDatanode { HDDSLayoutFeature feature(); - - Component component(); - - /** - * Simple enum to denote if an action is for the SCM or the DN. - */ - enum Component { - SCM, - DATANODE; - } } - - - diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java new file mode 100644 index 000000000000..52970af920d6 --- /dev/null +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ + +/** + * Provides Datanode upgrade annotations. + */ +package org.apache.hadoop.ozone.upgrade; diff --git a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md index 8934e412f8a5..f693c8484c8a 100644 --- a/hadoop-hdds/docs/content/design/upgrade-dev-primer.md +++ b/hadoop-hdds/docs/content/design/upgrade-dev-primer.md @@ -48,7 +48,7 @@ Method level annotation used to "disallow" an API if current layout version does ## @BelongsToLayoutVersion Annotation 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) +## Upgrade Action (UpgradeActionOm, UpgradeActionScm & UpgradeActionDatanode) 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. diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java similarity index 93% rename from hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java rename to hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java index 4e753c5cab32..8cb957aeac17 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/upgrade/HDDSLayoutFeature.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hdds.ComponentVersion; import org.apache.hadoop.hdds.HDDSVersion; import org.apache.hadoop.ozone.upgrade.LayoutFeature; +import org.apache.hadoop.ozone.upgrade.UpgradeAction; /** * List of HDDS Layout Features. All version management has been migrated to {@link HDDSVersion} and no new additions @@ -64,8 +65,8 @@ public enum HDDSLayoutFeature implements LayoutFeature { private final int layoutVersion; private final String description; - private HDDSUpgradeAction scmAction; - private HDDSUpgradeAction datanodeAction; + private UpgradeAction scmAction; + private UpgradeAction datanodeAction; HDDSLayoutFeature(final int layoutVersion, String description) { this.layoutVersion = layoutVersion; @@ -77,7 +78,7 @@ public enum HDDSLayoutFeature implements LayoutFeature { * * @param action The upgrade action to associate with this feature. */ - public void addScmAction(HDDSUpgradeAction action) { + public void addScmAction(UpgradeAction action) { // Required by SpotBugs since this setter exists in an enum. if (this.scmAction == null) { this.scmAction = action; @@ -89,7 +90,7 @@ public void addScmAction(HDDSUpgradeAction action) { * * @param action The upgrade action to associate with this feature. */ - public void addDatanodeAction(HDDSUpgradeAction action) { + public void addDatanodeAction(UpgradeAction action) { // Required by SpotBugs since this setter exists in an enum. if (this.datanodeAction == null) { this.datanodeAction = action; @@ -135,11 +136,11 @@ public String toString() { return name() + " (" + serialize() + ")"; } - public Optional scmAction() { + public Optional> scmAction() { return Optional.ofNullable(scmAction); } - public Optional datanodeAction() { + public Optional> datanodeAction() { return Optional.ofNullable(datanodeAction); } } 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 cfc7fd34618d..b890a7c6bf6a 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 @@ -17,14 +17,10 @@ package org.apache.hadoop.hdds.upgrade; -import static org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.SCM; - import com.google.common.annotations.VisibleForTesting; import java.io.IOException; -import java.util.Set; import org.apache.hadoop.ozone.upgrade.AbstractLayoutVersionManager; -import org.apache.hadoop.ozone.upgrade.UpgradeActionHdds; -import org.reflections.Reflections; +import org.apache.hadoop.ozone.upgrade.ComponentUpgradeActionProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,17 +34,12 @@ public class HDDSLayoutVersionManager extends private static final Logger LOG = LoggerFactory.getLogger(HDDSLayoutVersionManager.class); - private static final Object[] HDDS_CLASS_UPGRADE_PACKAGES = new Object[] { - "org.apache.hadoop.hdds.scm.server", - "org.apache.hadoop.ozone.container", - }; - - private static final Reflections HDDS_UPGRADE_REFLECTIONS = - new Reflections(HDDS_CLASS_UPGRADE_PACKAGES); - public HDDSLayoutVersionManager(int layoutVersion) throws IOException { + public HDDSLayoutVersionManager(int layoutVersion, + ComponentUpgradeActionProvider scmProvider, + ComponentUpgradeActionProvider dnProvider) throws IOException { init(layoutVersion, HDDSLayoutFeature.values()); - registerUpgradeActions(getAnnotatedTypes(HDDS_UPGRADE_REFLECTIONS)); + registerUpgradeActions(scmProvider, dnProvider); } public static int maxLayoutVersion() { @@ -57,46 +48,28 @@ public static int maxLayoutVersion() { } @VisibleForTesting - void registerUpgradeActions(Object... classNames) { - registerUpgradeActions(getAnnotatedTypes(new Reflections(classNames))); - } - - private static Set> getAnnotatedTypes(Reflections reflections) { - return reflections.getTypesAnnotatedWith(UpgradeActionHdds.class); - } + void registerUpgradeActions(ComponentUpgradeActionProvider scmProvider, + ComponentUpgradeActionProvider dnProvider) { + if (scmProvider != null) { + scmProvider.load().forEach((feature, action) -> { + HDDSLayoutFeature hddsFeature = (HDDSLayoutFeature) feature; + if (hddsFeature.layoutVersion() > getMetadataLayoutVersion()) { + hddsFeature.addScmAction(action); + } else { + LOG.debug("Skipping SCM Upgrade Action {} since it has been finalized.", action.name()); + } + }); + } - /** - * Scan classpath and register all actions to layout features. - */ - private void registerUpgradeActions(Set> typesAnnotatedWith) { - typesAnnotatedWith.forEach(actionClass -> { - if (HDDSUpgradeAction.class.isAssignableFrom(actionClass)) { - try { - HDDSUpgradeAction action = - (HDDSUpgradeAction) actionClass.newInstance(); - UpgradeActionHdds annotation = - actionClass.getAnnotation(UpgradeActionHdds.class); - HDDSLayoutFeature feature = annotation.feature(); - if (feature.layoutVersion() > getMetadataLayoutVersion()) { - LOG.info("Registering Upgrade Action : {}", action.name()); - if (annotation.component() == SCM) { - feature.addScmAction(action); - } else { - feature.addDatanodeAction(action); - } - } else { - LOG.debug("Skipping Upgrade Action {} since it has been finalized" + - ".", action.name()); - } - } catch (Exception e) { - LOG.error("Cannot instantiate Upgrade Action class {}", - actionClass.getSimpleName(), e); + if (dnProvider != null) { + dnProvider.load().forEach((feature, action) -> { + HDDSLayoutFeature hddsFeature = (HDDSLayoutFeature) feature; + if (hddsFeature.layoutVersion() > getMetadataLayoutVersion()) { + hddsFeature.addDatanodeAction(action); + } else { + LOG.debug("Skipping Datanode Upgrade Action {} since it has been finalized.", action.name()); } - } else { - LOG.warn("Found upgrade action class not of type " + - "org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction : {}", - actionClass.getName()); - } - }); + }); + } } } 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 new file mode 100644 index 000000000000..8932422f0f3a --- /dev/null +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/ozone/upgrade/AbstractUpgradeActionProvider.java @@ -0,0 +1,95 @@ +/* + * 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.upgrade; + +import java.lang.annotation.Annotation; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import org.apache.hadoop.hdds.ComponentVersion; +import org.reflections.Reflections; +import org.reflections.scanners.SubTypesScanner; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Common abstract provider for loading {@link UpgradeAction} implementations via reflection. + * + * @param the concrete upgrade action type + */ +public abstract class AbstractUpgradeActionProvider> + implements ComponentUpgradeActionProvider { + + private static final Logger LOG = LoggerFactory.getLogger(AbstractUpgradeActionProvider.class); + + private final Class annotationClass; + private final Class actionClass; + private final String[] packagesToScan; + + protected AbstractUpgradeActionProvider(Class annotationClass, + Class actionClass, + String... packagesToScan) { + this.annotationClass = annotationClass; + this.actionClass = actionClass; + this.packagesToScan = packagesToScan; + } + + @Override + public Map load() { + Map upgradeActions = new HashMap<>(); + + Reflections reflections = new Reflections(new ConfigurationBuilder() + .forPackages(packagesToScan) + .setScanners(new TypeAnnotationsScanner(), new SubTypesScanner()) + .setExpandSuperTypes(false) + .setParallel(true)); + Set> typesAnnotatedWith = reflections.getTypesAnnotatedWith(annotationClass); + + typesAnnotatedWith.forEach(clazz -> { + if (actionClass.isAssignableFrom(clazz)) { + try { + @SuppressWarnings("unchecked") + T action = (T) clazz.getDeclaredConstructor().newInstance(); + ComponentVersion feature = extractVersion(clazz); + LOG.info("Registering Upgrade Action : {}", action.name()); + upgradeActions.put(feature, action); + } catch (Exception e) { + LOG.error("Cannot instantiate Upgrade Action class {}", + clazz.getSimpleName(), e); + } + } else { + LOG.warn("Found upgrade action class not of type {} : {}", + actionClass.getName(), clazz.getName()); + } + }); + + return upgradeActions; + } + + /** + * Subclasses must implement this to extract the version from the class's annotation. + * Annotation interfaces cannot extend other interfaces, so there is no common way to extract the version from all + * upgrade action annotations for different components. + * + * @param clazz class annotated with the action annotation + * @return ComponentVersion the layout feature associated with the action + */ + protected abstract ComponentVersion extractVersion(Class clazz); +} diff --git a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutFeature.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutFeature.java similarity index 100% rename from hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutFeature.java rename to hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/TestHDDSLayoutFeature.java 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 4792e1179dea..08b4d96c9089 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 @@ -19,7 +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.hdds.upgrade.HDDSLayoutVersionManager.maxLayoutVersion; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -30,10 +29,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; -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.hdds.ComponentVersion; +import org.apache.hadoop.ozone.upgrade.ComponentUpgradeActionProvider; +import org.apache.hadoop.ozone.upgrade.UpgradeAction; import org.junit.jupiter.api.Test; /** @@ -41,44 +42,80 @@ */ public class TestHDDSLayoutVersionManager { - private static final String[] UPGRADE_ACTIONS_TEST_PACKAGES = new String[] { - "org.apache.hadoop.hdds.upgrade.test"}; + /** + * Mock component for testing upgrade actions. + */ + public static class MockComponent { + public void mockMethodScm() { + } + + public void mockMethodDn() { + } + } + + /** + * Mock SCM upgrade action for testing. + */ + public static class MockScmUpgradeAction implements UpgradeAction { + @Override + public void execute(MockComponent arg) { + arg.mockMethodScm(); + } + } + + /** + * Mock Datanode upgrade action for testing. + */ + public static class MockDnUpgradeAction implements UpgradeAction { + @Override + public void execute(MockComponent arg) { + arg.mockMethodDn(); + } + } @Test + @SuppressWarnings("unchecked") public void testUpgradeActionsRegistered() throws Exception { - - HDDSLayoutVersionManager lvm = - new HDDSLayoutVersionManager(maxLayoutVersion()); - lvm.registerUpgradeActions(UPGRADE_ACTIONS_TEST_PACKAGES); + ComponentUpgradeActionProvider> scmProvider = () -> { + Map> map = new HashMap<>(); + map.put(INITIAL_VERSION, new MockScmUpgradeAction()); + return map; + }; + + ComponentUpgradeActionProvider> dnProvider = () -> { + Map> map = new HashMap<>(); + map.put(DATANODE_SCHEMA_V2, new MockDnUpgradeAction()); + return map; + }; //Cluster is finalized, hence should not register. - Optional action = INITIAL_VERSION.scmAction(); - assertFalse(action.isPresent()); - action = DATANODE_SCHEMA_V2.datanodeAction(); + Optional> action = INITIAL_VERSION.scmAction(); assertFalse(action.isPresent()); + Optional> dnAction = DATANODE_SCHEMA_V2.datanodeAction(); + assertFalse(dnAction.isPresent()); // Start from an unfinalized version manager. - lvm = mock(HDDSLayoutVersionManager.class); + HDDSLayoutVersionManager lvm = mock(HDDSLayoutVersionManager.class); when(lvm.getMetadataLayoutVersion()).thenReturn(-1); - doCallRealMethod().when(lvm).registerUpgradeActions(any()); - lvm.registerUpgradeActions(UPGRADE_ACTIONS_TEST_PACKAGES); + doCallRealMethod().when(lvm).registerUpgradeActions(any(), any()); + lvm.registerUpgradeActions(scmProvider, dnProvider); action = INITIAL_VERSION.scmAction(); assertTrue(action.isPresent()); assertEquals(MockScmUpgradeAction.class, action.get().getClass()); assertFalse(INITIAL_VERSION.datanodeAction().isPresent()); MockComponent mockObj = mock(MockComponent.class); - action.get().execute(mockObj); + ((UpgradeAction) action.get()).execute(mockObj); verify(mockObj, times(1)).mockMethodScm(); verify(mockObj, times(0)).mockMethodDn(); - action = DATANODE_SCHEMA_V2.datanodeAction(); - assertTrue(action.isPresent()); - assertEquals(MockDnUpgradeAction.class, action.get().getClass()); + dnAction = DATANODE_SCHEMA_V2.datanodeAction(); + assertTrue(dnAction.isPresent()); + assertEquals(MockDnUpgradeAction.class, dnAction.get().getClass()); assertFalse(DATANODE_SCHEMA_V2.scmAction().isPresent()); mockObj = mock(MockComponent.class); - action.get().execute(mockObj); + ((UpgradeAction) dnAction.get()).execute(mockObj); verify(mockObj, times(0)).mockMethodScm(); verify(mockObj, times(1)).mockMethodDn(); } 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 deleted file mode 100644 index b16136c9da7e..000000000000 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/upgrade/test/MockComponent.java +++ /dev/null @@ -1,63 +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.hdds.upgrade.test; - -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.UpgradeActionHdds.Component.DATANODE; -import static org.apache.hadoop.ozone.upgrade.UpgradeActionHdds.Component.SCM; - -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; -import org.apache.hadoop.ozone.upgrade.UpgradeActionHdds; - -/** - * Mock classes to test upgrade action registration. - */ -public class MockComponent { - public void mockMethodScm() { - } - - public void mockMethodDn() { - } - - /** - * Mock SCM Upgrade Action. - */ - @UpgradeActionHdds(feature = INITIAL_VERSION, - component = SCM) - public static class MockScmUpgradeAction implements - HDDSUpgradeAction { - @Override - public void execute(MockComponent arg) { - arg.mockMethodScm(); - } - } - - /** - * Mock DN Upgrade Action. - */ - @UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = DATANODE) - public static class MockDnUpgradeAction implements - HDDSUpgradeAction { - @Override - public void execute(MockComponent arg) { - arg.mockMethodDn(); - } - } - -} 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 89a52b7c31d4..205d8c3c87d5 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 @@ -18,38 +18,17 @@ package org.apache.hadoop.ozone.upgrade; import java.io.IOException; -import java.util.Optional; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; -import org.apache.hadoop.hdds.upgrade.test.MockComponent; /** * Class to test upgrade related actions. */ public class TestUpgradeFinalizerActions { - /** - * Mock upgrade finalizer. - */ - static class MockUpgradeFinalizer extends - BasicUpgradeFinalizer { - - MockUpgradeFinalizer(MockLayoutVersionManager versionManager) { - super(versionManager); + static class MockComponent { + public void mockMethodScm() { } - @Override - public void postFinalizeUpgrade(MockComponent c) { - return; - } - - @Override - public void finalizeLayoutFeature(LayoutFeature lf, MockComponent c) { - return; - } - - @Override - public void preFinalizeUpgrade(MockComponent c) { - return; + public void mockMethodDn() { } } @@ -70,7 +49,6 @@ enum MockLayoutFeature implements LayoutFeature { VERSION_3(3); private int layoutVersion; - private UpgradeAction action; MockLayoutFeature(final int layoutVersion) { this.layoutVersion = layoutVersion; @@ -97,25 +75,5 @@ public MockLayoutFeature nextVersion() { public String toString() { return name() + " (" + serialize() + ")"; } - - public void addAction(UpgradeAction upgradeAction) { - this.action = upgradeAction; - } - - @Override - public Optional action() { - return Optional.ofNullable(action); - } - } - - /** - * Mock DN Upgrade Action that fails. - */ - public static class MockFailingUpgradeAction implements - HDDSUpgradeAction { - @Override - public void execute(MockComponent arg) throws Exception { - throw new IllegalStateException("Failed 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 db3b7c8eaf0c..6acb59eecf0d 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 @@ -170,6 +170,7 @@ import org.apache.hadoop.hdds.server.http.RatisDropwizardExports; import org.apache.hadoop.hdds.tracing.TracingConfig; import org.apache.hadoop.hdds.upgrade.HDDSLayoutVersionManager; +import org.apache.hadoop.hdds.upgrade.ScmUpgradeActionProvider; import org.apache.hadoop.hdds.utils.HAUtils; import org.apache.hadoop.hdds.utils.HddsServerUtil; import org.apache.hadoop.hdds.utils.HddsVersionInfo; @@ -703,7 +704,7 @@ private void initializeSystemManagers(OzoneConfiguration conf, } scmLayoutVersionManager = new HDDSLayoutVersionManager( - scmStorageConfig.getApparentVersion()); + scmStorageConfig.getApparentVersion(), new ScmUpgradeActionProvider(), null); VersionedDatanodeFeatures.initialize(scmLayoutVersionManager); UpgradeFinalizationExecutor 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 fe921a5147e1..bd62e87def75 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,19 +18,18 @@ 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.UpgradeActionHdds.Component.SCM; -import org.apache.hadoop.hdds.upgrade.HDDSUpgradeAction; -import org.apache.hadoop.ozone.upgrade.UpgradeActionHdds; +import org.apache.hadoop.hdds.upgrade.ScmUpgradeAction; +import org.apache.hadoop.ozone.upgrade.UpgradeActionScm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * SCM Upgrade Action for the very first Upgrade Version. */ -@UpgradeActionHdds(feature = DATANODE_SCHEMA_V2, component = SCM) +@UpgradeActionScm(feature = DATANODE_SCHEMA_V2) public class ScmOnFinalizeActionForDatanodeSchemaV2 implements - HDDSUpgradeAction { + 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/ScmUpgradeAction.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeAction.java new file mode 100644 index 000000000000..25fa5d3e9dbc --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeAction.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.upgrade; + +import org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext; +import org.apache.hadoop.ozone.upgrade.UpgradeAction; + +/** + * Storage Container Manager Upgrade Action interface. An upgrade action is an operation that + * needs to be executed during finalization. + */ +public interface ScmUpgradeAction extends UpgradeAction { +} 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 new file mode 100644 index 000000000000..63d8dec0b15d --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/ScmUpgradeActionProvider.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hdds.upgrade; + +import org.apache.hadoop.hdds.ComponentVersion; +import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider; +import org.apache.hadoop.ozone.upgrade.UpgradeActionScm; + +/** + * Loads {@link ScmUpgradeAction} implementations annotated with {@link UpgradeActionScm}. + */ +public final class ScmUpgradeActionProvider extends AbstractUpgradeActionProvider { + + 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); + } + + @Override + protected ComponentVersion extractVersion(Class clazz) { + UpgradeActionScm annotation = clazz.getAnnotation(UpgradeActionScm.class); + return annotation.feature(); + } +} diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java new file mode 100644 index 000000000000..4af61f6c47b7 --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/upgrade/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ + +/** + * Provides SCM upgrade interfaces and implementations. + */ +package org.apache.hadoop.hdds.upgrade; 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/UpgradeActionScm.java new file mode 100644 index 000000000000..4cbbcd4e9879 --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/UpgradeActionScm.java @@ -0,0 +1,33 @@ +/* + * 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.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. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface UpgradeActionScm { + HDDSLayoutFeature feature(); +} diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java new file mode 100644 index 000000000000..e39b1ff28c6d --- /dev/null +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/ozone/upgrade/package-info.java @@ -0,0 +1,21 @@ +/* + * 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. + */ + +/** + * Provides SCM upgrade actions. + */ +package org.apache.hadoop.ozone.upgrade; diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java index 7250db7db9e4..04b6751b8c4d 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestSCMNodeManager.java @@ -893,7 +893,7 @@ public void testProcessLayoutVersionReportHigherMlv() when(scmStorageConfig.getClusterID()).thenReturn("xyz111"); EventPublisher eventPublisher = mock(EventPublisher.class); HDDSLayoutVersionManager lvm = - new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion()); + new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(), null, null); SCMContext nodeManagerContext = SCMContext.emptyContext(); SCMNodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf), @@ -928,7 +928,7 @@ public void testProcessLayoutVersionLowerMlv(boolean mvlLessThanSlv) throws IOEx if (mvlLessThanSlv) { currentVersion -= 1; } - HDDSLayoutVersionManager lvm = new HDDSLayoutVersionManager(currentVersion); + HDDSLayoutVersionManager lvm = new HDDSLayoutVersionManager(currentVersion, null, null); SCMContext nodeManagerContext = SCMContext.emptyContext(); SCMNodeManager nodeManager = new SCMNodeManager(conf, @@ -972,7 +972,7 @@ public void testProcessCommandQueueReport() when(scmStorageConfig.getClusterID()).thenReturn("xyz111"); EventPublisher eventPublisher = mock(EventPublisher.class); HDDSLayoutVersionManager lvm = - new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion()); + new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(), null, null); createNodeManager(getConf()); SCMNodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf), @@ -2164,7 +2164,7 @@ public void testNodeOperationalStateChange( SCMStorageConfig scmStorageConfig = mock(SCMStorageConfig.class); when(scmStorageConfig.getClusterID()).thenReturn("xyz111"); EventPublisher eventPublisher = mock(EventPublisher.class); - HDDSLayoutVersionManager lvm = new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion()); + HDDSLayoutVersionManager lvm = new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(), null, null); createNodeManager(getConf()); SCMNodeManager nodeManager = new SCMNodeManager(conf, scmStorageConfig, eventPublisher, new NetworkTopologyImpl(conf), diff --git a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/UpgradeUtils.java b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/UpgradeUtils.java index b609aa0a00e8..9ec6852b3e4c 100644 --- a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/UpgradeUtils.java +++ b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/datanode/schemaupgrade/UpgradeUtils.java @@ -98,7 +98,7 @@ public static Pair getLayoutFeature( DatanodeLayoutStorage layoutStorage = new DatanodeLayoutStorage(conf, dnDetail.getUuidString()); HDDSLayoutVersionManager layoutVersionManager = - new HDDSLayoutVersionManager(layoutStorage.getApparentVersion()); + new HDDSLayoutVersionManager(layoutStorage.getApparentVersion(), null, null); final int metadataLayoutVersion = layoutVersionManager.getMetadataLayoutVersion(); 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 26516a172364..68b0362d1f51 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,25 +17,14 @@ package org.apache.hadoop.ozone.om.upgrade; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; import org.apache.hadoop.hdds.ComponentVersion; -import org.apache.hadoop.ozone.upgrade.ComponentUpgradeActionProvider; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; -import org.reflections.util.ConfigurationBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.hadoop.ozone.upgrade.AbstractUpgradeActionProvider; /** * Loads {@link OmUpgradeAction} implementations annotated with {@link UpgradeActionOm} from * {@link #OM_UPGRADE_CLASS_PACKAGE} only. */ -public final class OMUpgradeActionProvider implements ComponentUpgradeActionProvider { - - private static final Logger LOG = LoggerFactory.getLogger(OMUpgradeActionProvider.class); +public final class OMUpgradeActionProvider extends AbstractUpgradeActionProvider { /** * Package scanned for {@link UpgradeActionOm}-annotated classes (production OM upgrade actions). @@ -43,38 +32,12 @@ public final class OMUpgradeActionProvider implements ComponentUpgradeActionProv 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); } @Override - public Map load() { - Map upgradeActions = new HashMap<>(); - - Reflections reflections = new Reflections(new ConfigurationBuilder() - .forPackages(OM_UPGRADE_CLASS_PACKAGE) - .setScanners(new TypeAnnotationsScanner(), new SubTypesScanner()) - .setExpandSuperTypes(false) - .setParallel(true)); - Set> typesAnnotatedWith = reflections.getTypesAnnotatedWith(UpgradeActionOm.class); - - typesAnnotatedWith.forEach(actionClass -> { - if (OmUpgradeAction.class.isAssignableFrom(actionClass)) { - try { - OmUpgradeAction action = (OmUpgradeAction) actionClass.getDeclaredConstructor().newInstance(); - UpgradeActionOm annotation = actionClass.getAnnotation(UpgradeActionOm.class); - OMLayoutFeature feature = annotation.feature(); - LOG.info("Registering Upgrade Action : {}", action.name()); - upgradeActions.put(feature, action); - } catch (Exception e) { - LOG.error("Cannot instantiate Upgrade Action class {}", - actionClass.getSimpleName(), e); - } - } else { - LOG.warn("Found upgrade action class not of type " + - "org.apache.hadoop.ozone.om.upgrade.OmUpgradeAction : {}", - actionClass.getName()); - } - }); - - return upgradeActions; + protected ComponentVersion extractVersion(Class clazz) { + UpgradeActionOm annotation = clazz.getAnnotation(UpgradeActionOm.class); + return annotation.feature(); } } diff --git a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java index 5d519ef04102..f44d4e57a1a1 100644 --- a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java +++ b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconStorageContainerManagerFacade.java @@ -216,7 +216,7 @@ public ReconStorageContainerManagerFacade(OzoneConfiguration conf, this.dbStore = DBStoreBuilder.createDBStore(ozoneConfiguration, ReconSCMDBDefinition.get()); HDDSLayoutVersionManager scmLayoutVersionManager = - new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion()); + new HDDSLayoutVersionManager(scmStorageConfig.getApparentVersion(), null, null); this.scmhaManager = SCMHAManagerStub.getInstance( true, new SCMDBTransactionBufferImpl()); this.sequenceIdGen = new SequenceIdGenerator( diff --git a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java index 8aa49a991741..adb09e4ad90a 100644 --- a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java +++ b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconNodeManager.java @@ -82,7 +82,7 @@ public void setUp() throws Exception { ReconUtils reconUtils = new ReconUtils(); ReconStorageConfig reconStorageConfig = new ReconStorageConfig(conf, reconUtils); versionManager = new HDDSLayoutVersionManager( - reconStorageConfig.getApparentVersion()); + reconStorageConfig.getApparentVersion(), null, null); store = DBStoreBuilder.createDBStore(conf, ReconSCMDBDefinition.get()); reconContext = new ReconContext(conf, reconUtils); } diff --git a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/DatanodeSimulator.java b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/DatanodeSimulator.java index f3efef5a5a0d..797177090a17 100644 --- a/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/DatanodeSimulator.java +++ b/hadoop-ozone/vapor/src/main/java/org/apache/hadoop/ozone/freon/DatanodeSimulator.java @@ -445,7 +445,7 @@ private LayoutVersionProto createLayoutInfo() throws IOException { UUID.randomUUID().toString()); HDDSLayoutVersionManager layoutVersionManager = - new HDDSLayoutVersionManager(layoutStorage.getApparentVersion()); + new HDDSLayoutVersionManager(layoutStorage.getApparentVersion(), null, null); return LayoutVersionProto.newBuilder() .setMetadataLayoutVersion(