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]