This is an automated email from the ASF dual-hosted git repository.

szetszwo 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 f0e592563a5 HDDS-15145. Use enum for the ID type in 
SequenceIdGenerator (#10211)
f0e592563a5 is described below

commit f0e592563a5ac52c33e26c879a261d0a01645a7c
Author: Navink <[email protected]>
AuthorDate: Fri May 15 23:37:25 2026 +0530

    HDDS-15145. Use enum for the ID type in SequenceIdGenerator (#10211)
---
 .../hadoop/hdds/scm/block/BlockManagerImpl.java    |  4 +-
 .../hadoop/hdds/scm/block/DeletedBlockLogImpl.java |  4 +-
 .../hdds/scm/container/ContainerManagerImpl.java   |  5 +-
 .../hadoop/hdds/scm/ha/SequenceIdGenerator.java    | 75 +++++++++----------
 .../apache/hadoop/hdds/scm/ha/SequenceIdType.java  | 41 +++++++++++
 .../hdds/scm/security/RootCARotationManager.java   |  4 +-
 .../hdds/scm/server/SCMSecurityProtocolServer.java |  4 +-
 .../hdds/scm/ha/TestSequenceIDGenerator.java       | 86 +++++++++++-----------
 .../hadoop/hdds/scm/ha/TestSequenceIdType.java     | 70 ++++++++++++++++++
 .../scm/security/TestRootCARotationManager.java    |  3 +-
 10 files changed, 201 insertions(+), 95 deletions(-)

diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
index 6b0136abf66..108cf6786a9 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/BlockManagerImpl.java
@@ -18,7 +18,6 @@
 package org.apache.hadoop.hdds.scm.block;
 
 import static 
org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes.INVALID_BLOCK_SIZE;
-import static org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator.LOCAL_ID;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -39,6 +38,7 @@
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineNotFoundException;
@@ -185,7 +185,7 @@ private AllocatedBlock newBlock(ContainerInfo containerInfo)
     try {
       final Pipeline pipeline = pipelineManager
           .getPipeline(containerInfo.getPipelineID());
-      long localID = sequenceIdGen.getNextId(LOCAL_ID);
+      long localID = sequenceIdGen.getNextId(SequenceIdType.localId);
       long containerID = containerInfo.getContainerID();
       AllocatedBlock.Builder abb =  new AllocatedBlock.Builder()
           .setContainerBlockID(new ContainerBlockID(containerID, localID))
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java
index 652e59aead7..c16e6ec2c5f 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/block/DeletedBlockLogImpl.java
@@ -20,7 +20,6 @@
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_BLOCK_DELETION_PER_DN_DISTRIBUTION_FACTOR;
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_BLOCK_DELETION_PER_DN_DISTRIBUTION_FACTOR_DEFAULT;
 import static 
org.apache.hadoop.hdds.scm.block.SCMDeletedBlockTransactionStatusManager.SCMDeleteBlocksCommandStatusManager.CmdStatus;
-import static org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator.DEL_TXN_ID;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.protobuf.ByteString;
@@ -53,6 +52,7 @@
 import org.apache.hadoop.hdds.scm.ha.SCMContext;
 import org.apache.hadoop.hdds.scm.ha.SCMHADBTransactionBuffer;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.hdds.server.events.EventHandler;
 import org.apache.hadoop.hdds.server.events.EventPublisher;
@@ -240,7 +240,7 @@ public void addTransactions(Map<Long, List<DeletedBlock>> 
containerBlocksMap)
       long currentBatchSizeBytes = 0;
       for (Map.Entry<Long, List<DeletedBlock>> entry :
           containerBlocksMap.entrySet()) {
-        long nextTXID = sequenceIdGen.getNextId(DEL_TXN_ID);
+        long nextTXID = sequenceIdGen.getNextId(SequenceIdType.delTxnId);
         DeletedBlocksTransaction tx = constructNewTransaction(nextTXID,
             entry.getKey(), entry.getValue());
         txsToBeAdded.add(tx);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
index 15a566f6421..8340480f1a4 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/ContainerManagerImpl.java
@@ -17,8 +17,6 @@
 
 package org.apache.hadoop.hdds.scm.container;
 
-import static org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator.CONTAINER_ID;
-
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import java.io.IOException;
@@ -42,6 +40,7 @@
 import 
org.apache.hadoop.hdds.scm.container.replication.ContainerReplicaPendingOps;
 import org.apache.hadoop.hdds.scm.ha.SCMHAManager;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineManager;
 import org.apache.hadoop.hdds.utils.db.Table;
@@ -243,7 +242,7 @@ private ContainerInfo allocateContainer(final Pipeline 
pipeline,
       return null;
     }
 
-    final long uniqueId = sequenceIdGen.getNextId(CONTAINER_ID);
+    final long uniqueId = sequenceIdGen.getNextId(SequenceIdType.containerId);
     Preconditions.checkState(uniqueId > 0,
         "Cannot allocate container, negative container id" +
             " generated. %s.", uniqueId);
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 591cf0b2991..928032642fd 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
@@ -26,7 +26,8 @@
 import java.math.BigInteger;
 import java.security.cert.X509Certificate;
 import java.time.LocalDate;
-import java.util.HashMap;
+import java.util.Collections;
+import java.util.EnumMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
@@ -61,22 +62,9 @@ public class SequenceIdGenerator {
   private static final Logger LOG =
       LoggerFactory.getLogger(SequenceIdGenerator.class);
 
-  /**
-   * Ids supported.
-   */
-  public static final String LOCAL_ID = "localId";
-  public static final String DEL_TXN_ID = "delTxnId";
-  public static final String CONTAINER_ID = "containerId";
-
-  // Certificate ID for all services, including root certificates, whose ID
-  // were using "rootCertificateId" before.
-  public static final String CERTIFICATE_ID = "CertificateId";
-  @Deprecated
-  public static final String ROOT_CERTIFICATE_ID = "rootCertificateId";
-
   private static final long INVALID_SEQUENCE_ID = 0;
 
-  private final Map<String, Batch> sequenceIdToBatchMap;
+  private final Map<SequenceIdType, Batch> sequenceIdToBatchMap;
 
   private final Lock lock;
   private final long batchSize;
@@ -89,7 +77,7 @@ public class SequenceIdGenerator {
    */
   public SequenceIdGenerator(ConfigurationSource conf,
       SCMHAManager scmhaManager, Table<String, Long> sequenceIdTable) {
-    this.sequenceIdToBatchMap = new HashMap<>();
+    this.sequenceIdToBatchMap = newSequenceIdToBatchMap();
     this.lock = new ReentrantLock();
     this.batchSize = conf.getInt(OZONE_SCM_SEQUENCE_ID_BATCH_SIZE,
         OZONE_SCM_SEQUENCE_ID_BATCH_SIZE_DEFAULT);
@@ -98,6 +86,14 @@ public SequenceIdGenerator(ConfigurationSource conf,
     this.stateManager = createStateManager(scmhaManager, sequenceIdTable);
   }
 
+  static Map<SequenceIdType, Batch> newSequenceIdToBatchMap() {
+    final EnumMap<SequenceIdType, Batch> map = new 
EnumMap<>(SequenceIdType.class);
+    for (SequenceIdType type : SequenceIdType.values()) {
+      map.put(type, new Batch());
+    }
+    return Collections.unmodifiableMap(map);
+  }
+
   public StateManager createStateManager(SCMHAManager scmhaManager,
       Table<String, Long> sequenceIdTable) {
     Objects.requireNonNull(scmhaManager, "scmhaManager == null");
@@ -108,14 +104,13 @@ public StateManager createStateManager(SCMHAManager 
scmhaManager,
   }
 
   /**
-   * @param sequenceIdName : name of the sequenceId
-   * @return : next id of this sequenceId.
+   * @param idType : supported sequence ID type
+   * @return next id of this sequence ID.
    */
-  public long getNextId(String sequenceIdName) throws SCMException {
+  public long getNextId(SequenceIdType idType) throws SCMException {
     lock.lock();
     try {
-      Batch batch = sequenceIdToBatchMap.computeIfAbsent(
-          sequenceIdName, key -> new Batch());
+      Batch batch = sequenceIdToBatchMap.get(idType);
 
       if (batch.nextId <= batch.lastId) {
         return batch.nextId++;
@@ -128,18 +123,18 @@ public long getNextId(String sequenceIdName) throws 
SCMException {
 
         Preconditions.checkArgument(Long.MAX_VALUE - batch.lastId >= 
batchSize);
         long nextLastId = batch.lastId +
-            ((sequenceIdName.equals(CERTIFICATE_ID)) ? 1 : batchSize);
+            (idType == SequenceIdType.CertificateId ? 1 : batchSize);
 
-        if (stateManager.allocateBatch(sequenceIdName,
+        if (stateManager.allocateBatch(idType.name(),
             prevLastId, nextLastId)) {
           batch.lastId = nextLastId;
           LOG.info("Allocate a batch for {}, change lastId from {} to {}.",
-              sequenceIdName, prevLastId, batch.lastId);
+              idType, prevLastId, batch.lastId);
           break;
         }
 
         // reload lastId from RocksDB.
-        batch.lastId = stateManager.getLastId(sequenceIdName);
+        batch.lastId = stateManager.getLastId(idType.name());
       }
 
       Preconditions.checkArgument(batch.nextId <= batch.lastId);
@@ -348,29 +343,29 @@ public static void upgradeToSequenceId(SCMMetadataStore 
scmMetadataStore)
     // Long-term solution: the bootstrapped SCM will explicitly download
     // scm.db from leader SCM, and drop its own scm.db. Thus the upgrade
     // operations can take effect exactly once in a SCM HA cluster.
-    if (sequenceIdTable.get(LOCAL_ID) == null) {
+    if (sequenceIdTable.get(SequenceIdType.localId.name()) == null) {
       long millisSinceEpoch = TimeUnit.DAYS.toMillis(
           LocalDate.of(LocalDate.now().getYear() + 1, 1, 1).toEpochDay());
 
       long localId = millisSinceEpoch << Short.SIZE;
       Preconditions.checkArgument(localId > UniqueId.next());
 
-      sequenceIdTable.put(LOCAL_ID, localId);
-      LOG.info("upgrade {} to {}", LOCAL_ID, sequenceIdTable.get(LOCAL_ID));
+      sequenceIdTable.put(SequenceIdType.localId.name(), localId);
+      LOG.info("upgrade {} to {}", SequenceIdType.localId, 
sequenceIdTable.get(SequenceIdType.localId.name()));
     }
 
     // upgrade delTxnId
-    if (sequenceIdTable.get(DEL_TXN_ID) == null) {
+    if (sequenceIdTable.get(SequenceIdType.delTxnId.name()) == null) {
       // fetch delTxnId from DeletedBlocksTXTable
       // check HDDS-4477 for details.
       DeletedBlocksTransaction txn
           = scmMetadataStore.getDeletedBlocksTXTable().get(0L);
-      sequenceIdTable.put(DEL_TXN_ID, txn != null ? txn.getTxID() : 0L);
-      LOG.info("upgrade {} to {}", DEL_TXN_ID, 
sequenceIdTable.get(DEL_TXN_ID));
+      sequenceIdTable.put(SequenceIdType.delTxnId.name(), txn != null ? 
txn.getTxID() : 0L);
+      LOG.info("upgrade {} to {}", SequenceIdType.delTxnId, 
sequenceIdTable.get(SequenceIdType.delTxnId.name()));
     }
 
     // upgrade containerId
-    if (sequenceIdTable.get(CONTAINER_ID) == null) {
+    if (sequenceIdTable.get(SequenceIdType.containerId.name()) == null) {
       long largestContainerId = 0;
       try (TableIterator<ContainerID, ContainerInfo> iterator
           = scmMetadataStore.getContainerTable().valueIterator()) {
@@ -381,9 +376,9 @@ public static void upgradeToSequenceId(SCMMetadataStore 
scmMetadataStore)
         }
       }
 
-      sequenceIdTable.put(CONTAINER_ID, largestContainerId);
+      sequenceIdTable.put(SequenceIdType.containerId.name(), 
largestContainerId);
       LOG.info("upgrade {} to {}",
-          CONTAINER_ID, sequenceIdTable.get(CONTAINER_ID));
+          SequenceIdType.containerId, 
sequenceIdTable.get(SequenceIdType.containerId.name()));
     }
 
     upgradeToCertificateSequenceId(scmMetadataStore, false);
@@ -394,7 +389,7 @@ public static void upgradeToCertificateSequenceId(
     Table<String, Long> sequenceIdTable = 
scmMetadataStore.getSequenceIdTable();
 
     // upgrade certificate ID table
-    if (sequenceIdTable.get(CERTIFICATE_ID) == null || force) {
+    if (sequenceIdTable.get(SequenceIdType.CertificateId.name()) == null || 
force) {
       // Start from ID 2.
       // ID 1 - root certificate, ID 2 - first SCM certificate.
       long largestCertId = BigInteger.ONE.add(BigInteger.ONE).longValueExact();
@@ -416,15 +411,15 @@ public static void upgradeToCertificateSequenceId(
         }
       }
 
-      sequenceIdTable.put(CERTIFICATE_ID, largestCertId);
-      LOG.info("upgrade {} to {}", CERTIFICATE_ID,
-          sequenceIdTable.get(CERTIFICATE_ID));
+      sequenceIdTable.put(SequenceIdType.CertificateId.name(), largestCertId);
+      LOG.info("upgrade {} to {}", SequenceIdType.CertificateId,
+          sequenceIdTable.get(SequenceIdType.CertificateId.name()));
     }
 
     // delete the ROOT_CERTIFICATE_ID record if exists
     // ROOT_CERTIFICATE_ID is replaced with CERTIFICATE_ID now
-    if (sequenceIdTable.get(ROOT_CERTIFICATE_ID) != null) {
-      sequenceIdTable.delete(ROOT_CERTIFICATE_ID);
+    if (sequenceIdTable.get(SequenceIdType.rootCertificateId.name()) != null) {
+      sequenceIdTable.delete(SequenceIdType.rootCertificateId.name());
     }
   }
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdType.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdType.java
new file mode 100644
index 00000000000..4b80e3feef4
--- /dev/null
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/ha/SequenceIdType.java
@@ -0,0 +1,41 @@
+/*
+ * 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;
+
+/**
+ * Represents the sequence ID types managed by {@link SequenceIdGenerator}
+ * The enum constant names are kept exactly as their persisted RocksDB keys.
+ */
+public enum SequenceIdType {
+
+  localId,
+  delTxnId,
+  containerId,
+
+  /**
+   * Certificate ID for all services, including root certificates.
+   */
+  CertificateId,
+
+  /**
+   * @deprecated Use {@link #CertificateId} instead.
+   */
+  @Deprecated
+  rootCertificateId;
+
+}
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationManager.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationManager.java
index 1b0caadcfbe..169bd39c59d 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationManager.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/security/RootCARotationManager.java
@@ -20,7 +20,6 @@
 import static 
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NEW_KEY_CERT_DIR_NAME_PROGRESS_SUFFIX;
 import static 
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_NEW_KEY_CERT_DIR_NAME_SUFFIX;
 import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_X509_DIR_NAME_DEFAULT;
-import static org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator.CERTIFICATE_ID;
 import static org.apache.hadoop.ozone.OzoneConsts.SCM_ROOT_CA_COMPONENT_NAME;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -55,6 +54,7 @@
 import org.apache.hadoop.hdds.scm.ha.SCMContext;
 import org.apache.hadoop.hdds.scm.ha.SCMServiceException;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import org.apache.hadoop.hdds.scm.ha.StatefulService;
 import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
@@ -378,7 +378,7 @@ public void run() {
           CertificateServer newRootCAServer = null;
           BigInteger newId = BigInteger.ONE;
           try {
-            newId = 
BigInteger.valueOf(sequenceIdGen.getNextId(CERTIFICATE_ID));
+            newId = 
BigInteger.valueOf(sequenceIdGen.getNextId(SequenceIdType.CertificateId));
             newRootCAServer =
                 HASecurityUtils.initializeRootCertificateServer(secConf,
                     scm.getCertificateStore(), scmStorageConfig, newId,
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMSecurityProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMSecurityProtocolServer.java
index 00e67f63439..87df4930df6 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMSecurityProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMSecurityProtocolServer.java
@@ -18,7 +18,6 @@
 package org.apache.hadoop.hdds.scm.server;
 
 import static 
org.apache.hadoop.hdds.scm.ScmUtils.checkIfCertSignRequestAllowed;
-import static org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator.CERTIFICATE_ID;
 import static 
org.apache.hadoop.hdds.security.exception.SCMSecretKeyException.ErrorCode.SECRET_KEY_NOT_ENABLED;
 import static 
org.apache.hadoop.hdds.security.exception.SCMSecretKeyException.ErrorCode.SECRET_KEY_NOT_INITIALIZED;
 import static 
org.apache.hadoop.hdds.security.exception.SCMSecurityException.ErrorCode.CERTIFICATE_NOT_FOUND;
@@ -63,6 +62,7 @@
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdds.scm.exceptions.SCMException;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import 
org.apache.hadoop.hdds.scm.protocol.SCMSecurityProtocolServerSideTranslatorPB;
 import 
org.apache.hadoop.hdds.scm.protocol.SecretKeyProtocolServerSideTranslatorPB;
 import org.apache.hadoop.hdds.security.exception.SCMSecretKeyException;
@@ -481,7 +481,7 @@ public List<String> removeExpiredCertificates() throws 
IOException {
   }
 
   private String getNextCertificateId() throws IOException {
-    return String.valueOf(sequenceIdGen.getNextId(CERTIFICATE_ID));
+    return 
String.valueOf(sequenceIdGen.getNextId(SequenceIdType.CertificateId));
   }
 
   @VisibleForTesting
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIDGenerator.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIDGenerator.java
index a42d660a5f3..3c3418c1114 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIDGenerator.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIDGenerator.java
@@ -20,10 +20,10 @@
 import static 
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_SEQUENCE_ID_BATCH_SIZE;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
-import static org.mockito.Mockito.anyLong;
-import static org.mockito.Mockito.anyString;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
 
 import java.io.File;
 import java.util.Objects;
@@ -58,33 +58,33 @@ public void testSequenceIDGenUponNonRatis() throws 
Exception {
         conf, scmHAManager, scmMetadataStore.getSequenceIdTable());
 
     // the first batch is [1, 1000]
-    assertEquals(1L, sequenceIdGen.getNextId("someKey"));
-    assertEquals(2L, sequenceIdGen.getNextId("someKey"));
-    assertEquals(3L, sequenceIdGen.getNextId("someKey"));
+    assertEquals(1L, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(2L, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(3L, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(1L, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(2L, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(3L, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(1L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(2L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(3L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
 
     // default batchSize is 1000, the next batch is [1001, 2000]
     sequenceIdGen.invalidateBatch();
-    assertEquals(1001, sequenceIdGen.getNextId("someKey"));
-    assertEquals(1002, sequenceIdGen.getNextId("someKey"));
-    assertEquals(1003, sequenceIdGen.getNextId("someKey"));
+    assertEquals(1001, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(1002, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(1003, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(1001, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(1002, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(1003, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(1001, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(1002, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(1003, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
 
     // default batchSize is 1000, the next batch is [2001, 3000]
     sequenceIdGen.invalidateBatch();
-    assertEquals(2001, sequenceIdGen.getNextId("someKey"));
-    assertEquals(2002, sequenceIdGen.getNextId("someKey"));
-    assertEquals(2003, sequenceIdGen.getNextId("someKey"));
+    assertEquals(2001, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(2002, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(2003, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(2001, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(2002, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(2003, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(2001, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(2002, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(2003, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
   }
 
   @Test
@@ -103,33 +103,33 @@ public void testSequenceIDGenUponRatis() throws Exception 
{
         conf, scmHAManager, scmMetadataStore.getSequenceIdTable());
 
     // the first batch is [1, 100]
-    assertEquals(1L, sequenceIdGen.getNextId("someKey"));
-    assertEquals(2L, sequenceIdGen.getNextId("someKey"));
-    assertEquals(3L, sequenceIdGen.getNextId("someKey"));
+    assertEquals(1L, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(2L, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(3L, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(1L, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(2L, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(3L, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(1L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(2L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(3L, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
 
     // the next batch is [101, 200]
     sequenceIdGen.invalidateBatch();
-    assertEquals(101, sequenceIdGen.getNextId("someKey"));
-    assertEquals(102, sequenceIdGen.getNextId("someKey"));
-    assertEquals(103, sequenceIdGen.getNextId("someKey"));
+    assertEquals(101, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(102, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(103, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(101, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(102, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(103, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(101, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(102, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(103, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
 
     // the next batch is [201, 300]
     sequenceIdGen.invalidateBatch();
-    assertEquals(201, sequenceIdGen.getNextId("someKey"));
-    assertEquals(202, sequenceIdGen.getNextId("someKey"));
-    assertEquals(203, sequenceIdGen.getNextId("someKey"));
+    assertEquals(201, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(202, sequenceIdGen.getNextId(SequenceIdType.localId));
+    assertEquals(203, sequenceIdGen.getNextId(SequenceIdType.localId));
 
-    assertEquals(201, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(202, sequenceIdGen.getNextId("otherKey"));
-    assertEquals(203, sequenceIdGen.getNextId("otherKey"));
+    assertEquals(201, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(202, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
+    assertEquals(203, sequenceIdGen.getNextId(SequenceIdType.delTxnId));
   }
 
   @Test
@@ -159,18 +159,18 @@ public StateManager createStateManager(
       }
     };
 
-    assertEquals(1L, sequenceIdGen.getNextId("someKey"));
+    assertEquals(1L, sequenceIdGen.getNextId(SequenceIdType.localId));
 
     // Simulation currently this SCM is not a leader node,
     // So this SCM can only allocate IDs within the current batch
     // ([1, batchSize]), does not allow the allocation of IDs for the next 
batch
     // ([batchSize + 1, batchSize * 2])
-    when(stateManager.allocateBatch(anyString(), anyLong(), anyLong()))
-        .thenThrow(new SCMException(SCMException.ResultCodes.SCM_NOT_LEADER));
+    doThrow(new SCMException(SCMException.ResultCodes.SCM_NOT_LEADER))
+        .when(stateManager).allocateBatch(anyString(), anyLong(), anyLong());
 
     for (int i = 0; i < batchSize * 3; i++) {
       try {
-        long nextID = sequenceIdGen.getNextId("someKey");
+        long nextID = sequenceIdGen.getNextId(SequenceIdType.localId);
         if (nextID > batchSize) {
           fail("Should not allocate a blockID: " + nextID +
               " that exceeds the current Batch: " + batchSize);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIdType.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIdType.java
new file mode 100644
index 00000000000..5bab6c80401
--- /dev/null
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/ha/TestSequenceIdType.java
@@ -0,0 +1,70 @@
+/*
+ * 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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests for {@link SequenceIdType}.
+ */
+public class TestSequenceIdType {
+
+  @Test
+  @SuppressWarnings("deprecation")
+  public void testStringSyncWithEnumConstants() {
+    // Ensure enum names exactly match the persisted keys in RocksDB.
+    // These strings are persisted RocksDB keys, do not change them.
+    assertEquals("localId", SequenceIdType.localId.name());
+    assertEquals("delTxnId", SequenceIdType.delTxnId.name());
+    assertEquals("containerId", SequenceIdType.containerId.name());
+    assertEquals("CertificateId", SequenceIdType.CertificateId.name());
+    assertEquals("rootCertificateId", SequenceIdType.rootCertificateId.name());
+  }
+
+  @Test
+  public void testIfNewEnumConstantGetsAdded() {
+    Set<String> expectedNames = new HashSet<>(Arrays.asList(
+        "localId", "delTxnId", "containerId",
+        "CertificateId", "rootCertificateId"));
+
+    Set<String> actualNames = new HashSet<>();
+    for (SequenceIdType type : SequenceIdType.values()) {
+      actualNames.add(type.name());
+    }
+
+    // Filter exactly what changed to make the failure message extremely clear
+    Set<String> added = new HashSet<>(actualNames);
+    added.removeAll(expectedNames);
+
+    Set<String> removed = new HashSet<>(expectedNames);
+    removed.removeAll(actualNames);
+    // Fails the test if any sequenceId types are added or removed.
+    assertTrue(added.isEmpty() && removed.isEmpty(),
+        () -> "SequenceIdType constants changed!\n" +
+            "Unexpectedly Added: " + added + "\n" +
+            "Unexpectedly Removed: " + removed + "\n" +
+            "ACTION REQUIRED: If this change is intentional, you MUST verify " 
+
+            "RocksDB backward compatibility and update this test's 
expectedNames.");
+  }
+}
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/security/TestRootCARotationManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/security/TestRootCARotationManager.java
index d23bf0d06d2..6cb5ed60c7d 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/security/TestRootCARotationManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/security/TestRootCARotationManager.java
@@ -58,6 +58,7 @@
 import org.apache.hadoop.hdds.scm.ha.SCMRatisServerImpl;
 import org.apache.hadoop.hdds.scm.ha.SCMServiceManager;
 import org.apache.hadoop.hdds.scm.ha.SequenceIdGenerator;
+import org.apache.hadoop.hdds.scm.ha.SequenceIdType;
 import org.apache.hadoop.hdds.scm.ha.StatefulServiceStateManager;
 import org.apache.hadoop.hdds.scm.server.SCMSecurityProtocolServer;
 import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
@@ -125,7 +126,7 @@ public void init() throws IOException, TimeoutException,
     when(scm.getScmHAManager()).thenReturn(scmhaManager);
     
when(scmhaManager.getRatisServer()).thenReturn(mock(SCMRatisServerImpl.class));
     when(scm.getSequenceIdGen()).thenReturn(sequenceIdGenerator);
-    when(sequenceIdGenerator.getNextId(anyString())).thenReturn(2L);
+    
when(sequenceIdGenerator.getNextId(any(SequenceIdType.class))).thenReturn(2L);
     when(scm.getScmStorageConfig()).thenReturn(scmStorageConfig);
     
when(scm.getSecurityProtocolServer()).thenReturn(scmSecurityProtocolServer);
     
doNothing().when(scmSecurityProtocolServer).setRootCertificateServer(any());


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

Reply via email to