From 999dd9d8e601945c0e4f4d0a5a5d5106a7a60327 Mon Sep 17 00:00:00 2001 From: Russole <850905junior@gmail.com> Date: Sun, 5 Apr 2026 16:51:57 +0800 Subject: [PATCH] HDDS-14919. Add a base class for all the SCM handler interfaces --- .../apache/hadoop/hdds/scm/ha/SCMHandler.java | 32 +++++++++++++++++++ .../security/symmetric/SecretKeyState.java | 3 +- .../symmetric/SecretKeyStateImpl.java | 6 ++++ .../authority/CertificateStore.java | 3 +- .../certificate/authority/MockCAStore.java | 6 ++++ .../block/DeletedBlockLogStateManager.java | 3 +- .../DeletedBlockLogStateManagerImpl.java | 6 ++++ .../scm/container/ContainerStateManager.java | 3 +- .../container/ContainerStateManagerImpl.java | 8 +++-- .../hadoop/hdds/scm/ha/SCMRatisServer.java | 6 ++-- .../hdds/scm/ha/SequenceIdGenerator.java | 11 +++++-- .../scm/ha/StatefulServiceStateManager.java | 2 +- .../ha/StatefulServiceStateManagerImpl.java | 8 +++-- .../DeletedBlockLogStateManagerInvoker.java | 7 +++- .../hdds/scm/ha/invoker/ScmInvoker.java | 3 +- .../scm/pipeline/PipelineStateManager.java | 3 +- .../pipeline/PipelineStateManagerImpl.java | 8 +++-- .../scm/security/RootCARotationHandler.java | 3 +- .../security/RootCARotationHandlerImpl.java | 10 ++++-- .../security/ScmSecretKeyStateBuilder.java | 4 +-- .../hadoop/hdds/scm/server/SCMCertStore.java | 10 ++++-- .../upgrade/FinalizationStateManager.java | 3 +- .../upgrade/FinalizationStateManagerImpl.java | 10 ++++-- .../scm/ha/TestReplicationAnnotation.java | 7 ++-- .../hdds/scm/server/TestSCMCertStore.java | 3 +- 25 files changed, 130 insertions(+), 38 deletions(-) create mode 100644 hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHandler.java diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHandler.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHandler.java new file mode 100644 index 000000000000..ec90cca748e2 --- /dev/null +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMHandler.java @@ -0,0 +1,32 @@ +/* + * 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.scm.ha; + +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; + +/** + * Base interface for SCM handlers participating in Ratis-based HA. + * Each handler is associated with a fixed {@link RequestType}. + */ +public interface SCMHandler { + + /** + * Returns the {@link RequestType} of this handler. + */ + RequestType getType(); +} diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyState.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyState.java index bb11f9700287..82d45d378757 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyState.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyState.java @@ -20,13 +20,14 @@ import java.util.List; import java.util.UUID; import org.apache.hadoop.hdds.scm.exceptions.SCMException; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; /** * This component holds the state of managed SecretKeys, including the * current key and all active keys. */ -public interface SecretKeyState { +public interface SecretKeyState extends SCMHandler { /** * Get the current active key, which is used for signing tokens. This is * also the latest key managed by this state. diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyStateImpl.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyStateImpl.java index f7e592cc6e2a..6940a51662ed 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyStateImpl.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/symmetric/SecretKeyStateImpl.java @@ -29,6 +29,7 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Function; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -134,4 +135,9 @@ private void updateKeysInternal(List newKeys) { public void reinitialize(List secretKeys) { updateKeysInternal(secretKeys); } + + @Override + public RequestType getType() { + return RequestType.SECRET_KEY; + } } diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/CertificateStore.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/CertificateStore.java index 33f2e9ddd565..91367ebc3fa9 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/CertificateStore.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/authority/CertificateStore.java @@ -22,6 +22,7 @@ import java.security.cert.X509Certificate; import java.util.List; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStore; @@ -34,7 +35,7 @@ * With this interface, DefaultCA server read and write DB or persistence * layer and we can write to SCM's Metadata DB. */ -public interface CertificateStore { +public interface CertificateStore extends SCMHandler { /** * Writes a new certificate that was issued to the persistent store. diff --git a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/MockCAStore.java b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/MockCAStore.java index c8cb5f731552..112754feb52a 100644 --- a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/MockCAStore.java +++ b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/x509/certificate/authority/MockCAStore.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.List; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStore; /** @@ -67,4 +68,9 @@ public List listCertificate(NodeType role, @Override public void reinitialize(SCMMetadataStore metadataStore) { } + + @Override + public RequestType getType() { + return RequestType.CERT_STORE; + } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManager.java index adaa88e864f7..fceb0c717828 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManager.java @@ -23,6 +23,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DeletedBlocksTransactionSummary; import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DeletedBlocksTransaction; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.ha.ScmInvokerCodeGenerator; import org.apache.hadoop.hdds.scm.metadata.Replicate; import org.apache.hadoop.hdds.utils.db.Table; @@ -31,7 +32,7 @@ * DeletedBlockLogStateManager interface to * manage deleted blocks and record them in the underlying persist store. */ -public interface DeletedBlockLogStateManager { +public interface DeletedBlockLogStateManager extends SCMHandler { @Replicate void addTransactionsToDB(ArrayList txs, DeletedBlocksTransactionSummary summary) throws IOException; diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java index 7f45f5cb2d19..129452b0f952 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogStateManagerImpl.java @@ -28,6 +28,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DeletedBlocksTransactionSummary; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DeletedBlocksTransaction; import org.apache.hadoop.hdds.scm.container.ContainerID; import org.apache.hadoop.hdds.scm.container.ContainerManager; @@ -198,6 +199,11 @@ public static Builder newBuilder() { return new Builder(); } + @Override + public RequestType getType() { + return RequestType.BLOCK; + } + /** * Builder for ContainerStateManager. */ diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java index 0d66027480d2..e345feeaeea8 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManager.java @@ -26,6 +26,7 @@ import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ContainerInfoProto; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.LifeCycleState; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; import org.apache.hadoop.hdds.scm.pipeline.PipelineID; import org.apache.hadoop.hdds.utils.db.Table; @@ -49,7 +50,7 @@ * 4. The declaration should throw RaftException * */ -public interface ContainerStateManager { +public interface ContainerStateManager extends SCMHandler { /* ********************************************************************** * Container Life Cycle * diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java index 5c95aff5c190..687b9cc6c09a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerStateManagerImpl.java @@ -266,6 +266,11 @@ private void initialize() throws IOException { return actions; } + @Override + public RequestType getType() { + return RequestType.CONTAINER; + } + @Override public List getContainerIDs(LifeCycleState state, ContainerID start, int count) { try (AutoCloseableLock ignored = readLock()) { @@ -636,8 +641,7 @@ public ContainerStateManager build() throws IOException { conf, pipelineMgr, table, transactionBuffer, containerReplicaPendingOps); - return scmRatisServer.getProxyHandler(RequestType.CONTAINER, - ContainerStateManager.class, csm); + return scmRatisServer.getProxyHandler(ContainerStateManager.class, csm); } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServer.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServer.java index 169ee9e3fafa..140b6de24609 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServer.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SCMRatisServer.java @@ -72,14 +72,14 @@ SCMRatisResponse submitRequest(SCMRatisRequest request) RaftPeerId getLeaderId(); - default T getProxyHandler(ScmInvoker invoker) { + default T getProxyHandler(ScmInvoker invoker) { registerStateMachineHandler(invoker.getType(), invoker.getImpl()); return invoker.getProxy(); } - default T getProxyHandler(RequestType type, Class intf, T impl) { + default T getProxyHandler(Class intf, T impl) { final SCMHAInvocationHandler invocationHandler = - new SCMHAInvocationHandler(type, impl, this); + new SCMHAInvocationHandler(impl.getType(), impl, this); return intf.cast(Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {intf}, invocationHandler)); } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdGenerator.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdGenerator.java index bd11907829b5..c3a89a926145 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdGenerator.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdGenerator.java @@ -17,7 +17,7 @@ package org.apache.hadoop.hdds.scm.ha; -import static org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType.SEQUENCE_ID; +import static org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SEQUENCE_ID_BATCH_SIZE; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SEQUENCE_ID_BATCH_SIZE_DEFAULT; @@ -187,7 +187,7 @@ public void reinitialize(Table sequenceIdTable) /** * Maintain SequenceIdTable in RocksDB. */ - interface StateManager { + interface StateManager extends SCMHandler { /** * Compare And Swap lastId saved in db from expectedLastId to newLastId. * If based on Ratis, it will submit a raft client request. @@ -291,6 +291,11 @@ private void initialize() throws IOException { } } + @Override + public RequestType getType() { + return RequestType.SEQUENCE_ID; + } + /** * Builder for Ratis based StateManager. */ @@ -321,7 +326,7 @@ public StateManager build() { final StateManager impl = new StateManagerImpl(table, buffer); - return ratisServer.getProxyHandler(SEQUENCE_ID, StateManager.class, impl); + return ratisServer.getProxyHandler(StateManager.class, impl); } } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManager.java index 84d94cd38f05..66662f4fa6ba 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManager.java @@ -26,7 +26,7 @@ * This interface defines an API for saving and reading configurations of a * {@link StatefulService}. */ -public interface StatefulServiceStateManager { +public interface StatefulServiceStateManager extends SCMHandler { /** * Persists the specified configurations bytes to RocksDB and replicates diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManagerImpl.java index 151ac784c5b7..aaf8ac3d4c05 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/StatefulServiceStateManagerImpl.java @@ -47,6 +47,11 @@ private StatefulServiceStateManagerImpl( this.transactionBuffer = scmDBTransactionBuffer; } + @Override + public RequestType getType() { + return RequestType.STATEFUL_SERVICE_CONFIG; + } + /** * {@inheritDoc} */ @@ -134,8 +139,7 @@ public StatefulServiceStateManager build() { new StatefulServiceStateManagerImpl(statefulServiceConfig, transactionBuffer); - return scmRatisServer.getProxyHandler(RequestType.STATEFUL_SERVICE_CONFIG, - StatefulServiceStateManager.class, stateManager); + return scmRatisServer.getProxyHandler(StatefulServiceStateManager.class, stateManager); } } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/DeletedBlockLogStateManagerInvoker.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/DeletedBlockLogStateManagerInvoker.java index ba1317b079b8..55b9a325f7f3 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/DeletedBlockLogStateManagerInvoker.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/DeletedBlockLogStateManagerInvoker.java @@ -66,7 +66,7 @@ public DeletedBlockLogStateManagerInvoker(DeletedBlockLogStateManager impl, SCMR @Override public RequestType getType() { - return RequestType.BLOCK; + return impl.getType(); } @Override @@ -82,6 +82,11 @@ public DeletedBlockLogStateManager getImpl() { @Override public DeletedBlockLogStateManager getProxy() { return new DeletedBlockLogStateManager() { + @Override + public RequestType getType() { + return impl.getType(); + } + @Override public void addTransactionsToDB(ArrayList txs) throws IOException { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/ScmInvoker.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/ScmInvoker.java index 322cf177ad61..f5a448bf2e88 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/ScmInvoker.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/invoker/ScmInvoker.java @@ -21,6 +21,7 @@ import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.exceptions.SCMException; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.ha.SCMRatisRequest; import org.apache.hadoop.hdds.scm.ha.SCMRatisResponse; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; @@ -28,7 +29,7 @@ /** * Invokes methods without using reflection. */ -public abstract class ScmInvoker { +public abstract class ScmInvoker { private final SCMRatisServer ratisHandler; ScmInvoker(SCMRatisServer ratisHandler) { diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManager.java index 9fc2400ef5b7..9a1d6de1b5f0 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManager.java @@ -25,6 +25,7 @@ import org.apache.hadoop.hdds.protocol.DatanodeDetails; import org.apache.hadoop.hdds.protocol.proto.HddsProtos; import org.apache.hadoop.hdds.scm.container.ContainerID; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; import org.apache.hadoop.hdds.utils.db.CodecException; import org.apache.hadoop.hdds.utils.db.RocksDatabaseException; @@ -33,7 +34,7 @@ /** * Manages the state of pipelines in SCM. */ -public interface PipelineStateManager { +public interface PipelineStateManager extends SCMHandler { /** * Adding pipeline would be replicated to Ratis. diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManagerImpl.java index 97831a4fd311..912f3ecdb158 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineStateManagerImpl.java @@ -327,6 +327,11 @@ public static Builder newBuilder() { return new Builder(); } + @Override + public RequestType getType() { + return RequestType.PIPELINE; + } + /** * Builder for PipelineStateManagerImpl. */ @@ -364,8 +369,7 @@ public PipelineStateManager build() throws RocksDatabaseException, DuplicatedPip pipelineStore, nodeManager, transactionBuffer); pipelineStateManager.initialize(); - return scmRatisServer.getProxyHandler(RequestType.PIPELINE, - PipelineStateManager.class, pipelineStateManager); + return scmRatisServer.getProxyHandler(PipelineStateManager.class, pipelineStateManager); } } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandler.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandler.java index 9a0fcfbcbd60..a266b4dde008 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandler.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandler.java @@ -18,12 +18,13 @@ package org.apache.hadoop.hdds.scm.security; import java.io.IOException; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; /** * This interface defines APIs for sub-ca rotation instructions. */ -public interface RootCARotationHandler { +public interface RootCARotationHandler extends SCMHandler { /** * Notify SCM peers to do sub-ca rotation preparation and replicate diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandlerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandlerImpl.java index 9d1a6a6d0bec..bf310ae66042 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandlerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationHandlerImpl.java @@ -19,7 +19,6 @@ import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BACKUP_KEY_CERT_DIR_NAME_SUFFIX; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NEW_KEY_CERT_DIR_NAME_SUFFIX; -import static org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType.CERT_ROTATE; import java.io.File; import java.io.IOException; @@ -29,6 +28,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import org.apache.commons.io.FileUtils; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.scm.server.StorageContainerManager; import org.apache.hadoop.hdds.security.SecurityConfig; @@ -198,6 +198,11 @@ public void setSubCACertId(String subCACertId) { LOG.info("Scm sub CA new certificate is {}", subCACertId); } + @Override + public RequestType getType() { + return RequestType.CERT_ROTATE; + } + /** * Builder for RootCARotationHandlerImpl. */ @@ -228,8 +233,7 @@ public RootCARotationHandler build() { final RootCARotationHandler impl = new RootCARotationHandlerImpl(scm, rootCARotationManager); - return ratisServer.getProxyHandler(CERT_ROTATE, - RootCARotationHandler.class, impl); + return ratisServer.getProxyHandler(RootCARotationHandler.class, impl); } } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/ScmSecretKeyStateBuilder.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/ScmSecretKeyStateBuilder.java index 1f643fbc9f6a..cfd546ab5980 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/ScmSecretKeyStateBuilder.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/ScmSecretKeyStateBuilder.java @@ -17,7 +17,6 @@ package org.apache.hadoop.hdds.scm.security; -import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.security.symmetric.SecretKeyState; import org.apache.hadoop.hdds.security.symmetric.SecretKeyStateImpl; @@ -45,7 +44,6 @@ public ScmSecretKeyStateBuilder setRatisServer( public SecretKeyState build() { final SecretKeyState impl = new SecretKeyStateImpl(secretKeyStore); - return scmRatisServer.getProxyHandler(SCMRatisProtocol.RequestType.SECRET_KEY, - SecretKeyState.class, impl); + return scmRatisServer.getProxyHandler(SecretKeyState.class, impl); } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMCertStore.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMCertStore.java index e597e19a4cc6..5f590ce6eae3 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMCertStore.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMCertStore.java @@ -30,7 +30,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType; -import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStore; import org.apache.hadoop.hdds.security.exception.SCMSecurityException; @@ -195,6 +195,11 @@ public void reinitialize(SCMMetadataStore metadataStore) { this.scmMetadataStore = metadataStore; } + @Override + public RequestType getType() { + return RequestType.CERT_STORE; + } + /** * Builder for SCMCertStore. */ @@ -215,8 +220,7 @@ public Builder setRatisServer(final SCMRatisServer ratisServer) { public CertificateStore build() { final SCMCertStore scmCertStore = new SCMCertStore(metadataStore); - return scmRatisServer.getProxyHandler(SCMRatisProtocol.RequestType.CERT_STORE, - CertificateStore.class, scmCertStore); + return scmRatisServer.getProxyHandler(CertificateStore.class, scmCertStore); } } } diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java index 6d9a61eb9b4d..2349e4c4659b 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManager.java @@ -18,13 +18,14 @@ package org.apache.hadoop.hdds.scm.server.upgrade; import java.io.IOException; +import org.apache.hadoop.hdds.scm.ha.SCMHandler; import org.apache.hadoop.hdds.scm.metadata.Replicate; import org.apache.hadoop.hdds.utils.db.Table; /** * Manages the state of finalization in SCM. */ -public interface FinalizationStateManager { +public interface FinalizationStateManager extends SCMHandler { @Replicate void addFinalizingMark() throws IOException; diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java index 77bc3499d9aa..ff56c5a6164a 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/upgrade/FinalizationStateManagerImpl.java @@ -21,7 +21,7 @@ import java.util.Objects; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol; +import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol.RequestType; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.scm.metadata.DBTransactionBuffer; import org.apache.hadoop.hdds.scm.metadata.Replicate; @@ -289,6 +289,11 @@ private int getDBLayoutVersion() throws IOException { } } + @Override + public RequestType getType() { + return RequestType.FINALIZE; + } + /** * Builds a {@link FinalizationManagerImpl}. */ @@ -327,8 +332,7 @@ public FinalizationStateManager build() throws IOException { Objects.requireNonNull(transactionBuffer, "transactionBuffer == null"); Objects.requireNonNull(upgradeFinalizer, "upgradeFinalizer == null"); - return scmRatisServer.getProxyHandler(SCMRatisProtocol.RequestType.FINALIZE, - FinalizationStateManager.class, new FinalizationStateManagerImpl(this)); + return scmRatisServer.getProxyHandler(FinalizationStateManager.class, new FinalizationStateManagerImpl(this)); } } } diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestReplicationAnnotation.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestReplicationAnnotation.java index ec113eb1c71b..b2f2c30c41ec 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestReplicationAnnotation.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestReplicationAnnotation.java @@ -20,6 +20,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.IOException; import java.util.List; @@ -122,9 +124,10 @@ public RaftPeerId getLeaderId() { @Test public void testReplicateAnnotationBasic() throws Throwable { + ContainerStateManager impl = mock(ContainerStateManager.class); + when(impl.getType()).thenReturn(RequestType.CONTAINER); - ContainerStateManager proxy = scmRatisServer.getProxyHandler(RequestType.CONTAINER, - ContainerStateManager.class, null); + ContainerStateManager proxy = scmRatisServer.getProxyHandler(ContainerStateManager.class, impl); IOException e = assertThrows(IOException.class, diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMCertStore.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMCertStore.java index 2ed5990d46d9..451dcb7eb697 100644 --- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMCertStore.java +++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMCertStore.java @@ -37,7 +37,6 @@ import org.apache.hadoop.hdds.HddsConfigKeys; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeType; -import org.apache.hadoop.hdds.protocol.proto.SCMRatisProtocol; import org.apache.hadoop.hdds.scm.ha.SCMRatisServer; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStore; import org.apache.hadoop.hdds.scm.metadata.SCMMetadataStoreImpl; @@ -72,7 +71,7 @@ public void setUp(@TempDir Path tempDir) throws Exception { keyPair = KeyStoreTestUtil.generateKeyPair("RSA"); final SCMRatisServer ratisServer = mock(SCMRatisServer.class); - when(ratisServer.getProxyHandler(eq(SCMRatisProtocol.RequestType.CERT_STORE), + when(ratisServer.getProxyHandler( eq(CertificateStore.class), any(CertificateStore.class))) .then(returnsLastArg()); scmMetadataStore = new SCMMetadataStoreImpl(config);