You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sa...@apache.org on 2022/05/09 09:26:52 UTC
[ozone] branch HDDS-3630 updated: HDDS-6543. [Merge rocksdb in datanode] BlockDeletingService adaptation for schema v3 containers. (#3385)
This is an automated email from the ASF dual-hosted git repository.
sammichen pushed a commit to branch HDDS-3630
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/HDDS-3630 by this push:
new 562a242095 HDDS-6543. [Merge rocksdb in datanode] BlockDeletingService adaptation for schema v3 containers. (#3385)
562a242095 is described below
commit 562a242095dae2556979bec2640649fd33b9a5dd
Author: Gui Hecheng <ma...@tencent.com>
AuthorDate: Mon May 9 17:26:46 2022 +0800
HDDS-6543. [Merge rocksdb in datanode] BlockDeletingService adaptation for schema v3 containers. (#3385)
---
.../commandhandler/DeleteBlocksCommandHandler.java | 61 +++++++++++---
.../container/keyvalue/helpers/BlockUtils.java | 2 +-
.../background/BlockDeletingService.java | 70 ++++++++++++----
.../metadata/DatanodeStoreSchemaThreeImpl.java | 6 +-
.../metadata/DatanodeStoreSchemaTwoImpl.java | 4 +-
.../container/metadata/DeleteTransactionStore.java | 29 +++++++
.../container/common/TestBlockDeletingService.java | 95 +++++++++++++---------
7 files changed, 194 insertions(+), 73 deletions(-)
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java
index 9c8a991f43..8e95017aaf 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/DeleteBlocksCommandHandler.java
@@ -43,8 +43,7 @@ import org.apache.hadoop.ozone.container.common.impl.ContainerSet;
import org.apache.hadoop.ozone.container.common.statemachine
.SCMConnectionManager;
import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
-import org.apache.hadoop.ozone.container.metadata.DatanodeStore;
-import org.apache.hadoop.ozone.container.metadata.DatanodeStoreSchemaTwoImpl;
+import org.apache.hadoop.ozone.container.metadata.DeleteTransactionStore;
import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
import org.apache.hadoop.ozone.protocol.commands.CommandStatus;
import org.apache.hadoop.ozone.protocol.commands.DeleteBlockCommandStatus;
@@ -71,6 +70,7 @@ import static org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos
.Result.CONTAINER_NOT_FOUND;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V1;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V2;
+import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V3;
/**
* Handle block deletion commands.
@@ -229,10 +229,12 @@ public class DeleteBlocksCommandHandler implements CommandHandler {
} else if (containerData.getSchemaVersion().equals(SCHEMA_V2)) {
markBlocksForDeletionSchemaV2(containerData, tx,
newDeletionBlocks, tx.getTxID());
+ } else if (containerData.getSchemaVersion().equals(SCHEMA_V3)) {
+ markBlocksForDeletionSchemaV3(containerData, tx,
+ newDeletionBlocks, tx.getTxID());
} else {
throw new UnsupportedOperationException(
- "Only schema version 1 and schema version 2 are "
- + "supported.");
+ "Only schema version 1,2,3 are supported.");
}
} finally {
cont.writeUnlock();
@@ -326,6 +328,34 @@ public class DeleteBlocksCommandHandler implements CommandHandler {
}
}
+ private void markBlocksForDeletionSchemaV3(
+ KeyValueContainerData containerData, DeletedBlocksTransaction delTX,
+ int newDeletionBlocks, long txnID)
+ throws IOException {
+ DeletionMarker schemaV3Marker = (table, batch, tid, txn) -> {
+ Table<String, DeletedBlocksTransaction> delTxTable =
+ (Table<String, DeletedBlocksTransaction>) table;
+ delTxTable.putWithBatch(batch, containerData.deleteTxnKey(tid), txn);
+ };
+
+ markBlocksForDeletionTransaction(containerData, delTX, newDeletionBlocks,
+ txnID, schemaV3Marker);
+ }
+
+ private void markBlocksForDeletionSchemaV2(
+ KeyValueContainerData containerData, DeletedBlocksTransaction delTX,
+ int newDeletionBlocks, long txnID)
+ throws IOException {
+ DeletionMarker schemaV2Marker = (table, batch, tid, txn) -> {
+ Table<Long, DeletedBlocksTransaction> delTxTable =
+ (Table<Long, DeletedBlocksTransaction>) table;
+ delTxTable.putWithBatch(batch, tid, txn);
+ };
+
+ markBlocksForDeletionTransaction(containerData, delTX, newDeletionBlocks,
+ txnID, schemaV2Marker);
+ }
+
/**
* Move a bunch of blocks from a container to deleting state. This is a meta
* update, the actual deletes happen in async mode.
@@ -334,23 +364,22 @@ public class DeleteBlocksCommandHandler implements CommandHandler {
* @param delTX a block deletion transaction.
* @throws IOException if I/O error occurs.
*/
-
- private void markBlocksForDeletionSchemaV2(
+ private void markBlocksForDeletionTransaction(
KeyValueContainerData containerData, DeletedBlocksTransaction delTX,
- int newDeletionBlocks, long txnID) throws IOException {
+ int newDeletionBlocks, long txnID, DeletionMarker marker)
+ throws IOException {
long containerId = delTX.getContainerID();
if (!isTxnIdValid(containerId, containerData, delTX)) {
return;
}
try (DBHandle containerDB = BlockUtils.getDB(containerData, conf)) {
- DatanodeStore ds = containerDB.getStore();
- DatanodeStoreSchemaTwoImpl dnStoreTwoImpl =
- (DatanodeStoreSchemaTwoImpl) ds;
- Table<Long, DeletedBlocksTransaction> delTxTable =
- dnStoreTwoImpl.getDeleteTransactionTable();
+ DeleteTransactionStore<?> store =
+ (DeleteTransactionStore<?>) containerDB.getStore();
+ Table<?, DeletedBlocksTransaction> delTxTable =
+ store.getDeleteTransactionTable();
try (BatchOperation batch = containerDB.getStore().getBatchHandler()
.initBatchOperation()) {
- delTxTable.putWithBatch(batch, txnID, delTX);
+ marker.apply(delTxTable, batch, txnID, delTX);
newDeletionBlocks += delTX.getLocalIDList().size();
updateMetaData(containerData, delTX, newDeletionBlocks, containerDB,
batch);
@@ -510,4 +539,10 @@ public class DeleteBlocksCommandHandler implements CommandHandler {
}
}
}
+
+ private interface DeletionMarker {
+ void apply(Table<?, DeletedBlocksTransaction> deleteTxnsTable,
+ BatchOperation batch, long txnID, DeletedBlocksTransaction delTX)
+ throws IOException;
+ }
}
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java
index fb5d5a72b2..7f908a8302 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/BlockUtils.java
@@ -245,7 +245,7 @@ public final class BlockUtils {
Preconditions.checkState(db.getStore()
instanceof DatanodeStoreSchemaThreeImpl);
- ((DatanodeStoreSchemaThreeImpl) db.getStore()).dropAllWithPrefix(
+ ((DatanodeStoreSchemaThreeImpl) db.getStore()).removeKVContainerData(
containerData.getContainerID());
}
}
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/statemachine/background/BlockDeletingService.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/statemachine/background/BlockDeletingService.java
index 2df22b1cac..85d6591e30 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/statemachine/background/BlockDeletingService.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/statemachine/background/BlockDeletingService.java
@@ -53,8 +53,7 @@ import org.apache.hadoop.ozone.container.common.transport.server.ratis.XceiverSe
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
import org.apache.hadoop.ozone.container.keyvalue.helpers.BlockUtils;
import org.apache.hadoop.ozone.container.keyvalue.helpers.KeyValueContainerUtil;
-import org.apache.hadoop.ozone.container.metadata.DatanodeStore;
-import org.apache.hadoop.ozone.container.metadata.DatanodeStoreSchemaTwoImpl;
+import org.apache.hadoop.ozone.container.metadata.DeleteTransactionStore;
import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
import org.apache.hadoop.util.Time;
import org.apache.hadoop.hdds.protocol.proto
@@ -65,6 +64,7 @@ import com.google.common.collect.Lists;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V1;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V2;
+import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V3;
import org.apache.ratis.thirdparty.com.google.protobuf.InvalidProtocolBufferException;
import org.slf4j.Logger;
@@ -282,9 +282,11 @@ public class BlockDeletingService extends BackgroundService {
crr = deleteViaSchema1(meta, container, dataDir, startTime);
} else if (containerData.getSchemaVersion().equals(SCHEMA_V2)) {
crr = deleteViaSchema2(meta, container, dataDir, startTime);
+ } else if (containerData.getSchemaVersion().equals(SCHEMA_V3)) {
+ crr = deleteViaSchema3(meta, container, dataDir, startTime);
} else {
throw new UnsupportedOperationException(
- "Only schema version 1 and schema version 2 are supported.");
+ "Only schema version 1,2,3 are supported.");
}
return crr;
} finally {
@@ -397,6 +399,39 @@ public class BlockDeletingService extends BackgroundService {
public ContainerBackgroundTaskResult deleteViaSchema2(
DBHandle meta, Container container, File dataDir,
long startTime) throws IOException {
+ Deleter schema2Deleter = (table, batch, tid) -> {
+ Table<Long, DeletedBlocksTransaction> delTxTable =
+ (Table<Long, DeletedBlocksTransaction>) table;
+ delTxTable.deleteWithBatch(batch, tid);
+ };
+ Table<Long, DeletedBlocksTransaction> deleteTxns =
+ ((DeleteTransactionStore<Long>) meta.getStore())
+ .getDeleteTransactionTable();
+ return deleteViaTransactionStore(
+ deleteTxns.iterator(), meta,
+ container, dataDir, startTime, schema2Deleter);
+ }
+
+ public ContainerBackgroundTaskResult deleteViaSchema3(
+ DBHandle meta, Container container, File dataDir,
+ long startTime) throws IOException {
+ Deleter schema3Deleter = (table, batch, tid) -> {
+ Table<String, DeletedBlocksTransaction> delTxTable =
+ (Table<String, DeletedBlocksTransaction>) table;
+ delTxTable.deleteWithBatch(batch, containerData.deleteTxnKey(tid));
+ };
+ Table<String, DeletedBlocksTransaction> deleteTxns =
+ ((DeleteTransactionStore<String>) meta.getStore())
+ .getDeleteTransactionTable();
+ return deleteViaTransactionStore(
+ deleteTxns.iterator(containerData.containerPrefix()), meta,
+ container, dataDir, startTime, schema3Deleter);
+ }
+
+ public ContainerBackgroundTaskResult deleteViaTransactionStore(
+ TableIterator<?, ? extends Table.KeyValue<?, DeletedBlocksTransaction>>
+ iter, DBHandle meta, Container container, File dataDir,
+ long startTime, Deleter deleter) throws IOException {
ContainerBackgroundTaskResult crr = new ContainerBackgroundTaskResult();
if (!checkDataDir(dataDir)) {
return crr;
@@ -404,22 +439,18 @@ public class BlockDeletingService extends BackgroundService {
try {
Table<String, BlockData> blockDataTable =
meta.getStore().getBlockDataTable();
- DatanodeStore ds = meta.getStore();
- DatanodeStoreSchemaTwoImpl dnStoreTwoImpl =
- (DatanodeStoreSchemaTwoImpl) ds;
- Table<Long, DeletedBlocksTransaction>
- deleteTxns = dnStoreTwoImpl.getDeleteTransactionTable();
+ DeleteTransactionStore<?> txnStore =
+ (DeleteTransactionStore<?>) meta.getStore();
+ Table<?, DeletedBlocksTransaction> deleteTxns =
+ txnStore.getDeleteTransactionTable();
List<DeletedBlocksTransaction> delBlocks = new ArrayList<>();
int numBlocks = 0;
- try (TableIterator<Long,
- ? extends Table.KeyValue<Long, DeletedBlocksTransaction>> iter =
- dnStoreTwoImpl.getDeleteTransactionTable().iterator()) {
- while (iter.hasNext() && (numBlocks < blocksToDelete)) {
- DeletedBlocksTransaction delTx = iter.next().getValue();
- numBlocks += delTx.getLocalIDList().size();
- delBlocks.add(delTx);
- }
+ while (iter.hasNext() && (numBlocks < blocksToDelete)) {
+ DeletedBlocksTransaction delTx = iter.next().getValue();
+ numBlocks += delTx.getLocalIDList().size();
+ delBlocks.add(delTx);
}
+ iter.close();
if (delBlocks.isEmpty()) {
LOG.debug("No transaction found in container : {}",
containerData.getContainerID());
@@ -442,7 +473,7 @@ public class BlockDeletingService extends BackgroundService {
try (BatchOperation batch = meta.getStore().getBatchHandler()
.initBatchOperation()) {
for (DeletedBlocksTransaction delTx : delBlocks) {
- deleteTxns.deleteWithBatch(batch, delTx.getTxID());
+ deleter.apply(deleteTxns, batch, delTx.getTxID());
for (Long blk : delTx.getLocalIDList()) {
String bID = blk.toString();
meta.getStore().getBlockDataTable().deleteWithBatch(batch, bID);
@@ -516,4 +547,9 @@ public class BlockDeletingService extends BackgroundService {
return priority;
}
}
+
+ private interface Deleter {
+ void apply(Table<?, DeletedBlocksTransaction> deleteTxnsTable,
+ BatchOperation batch, long txnID) throws IOException;
+ }
}
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaThreeImpl.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaThreeImpl.java
index 5178d9b0ff..8b1e9e0b20 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaThreeImpl.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaThreeImpl.java
@@ -40,7 +40,8 @@ import static org.apache.hadoop.ozone.container.metadata.DatanodeSchemaThreeDBDe
* - All keys have containerID as prefix.
* - The table 3 has String as key instead of Long since we want to use prefix.
*/
-public class DatanodeStoreSchemaThreeImpl extends AbstractDatanodeStore {
+public class DatanodeStoreSchemaThreeImpl extends AbstractDatanodeStore
+ implements DeleteTransactionStore<String> {
private final Table<String, DeletedBlocksTransaction> deleteTransactionTable;
@@ -52,6 +53,7 @@ public class DatanodeStoreSchemaThreeImpl extends AbstractDatanodeStore {
.getDeleteTransactionsColumnFamily().getTable(getStore());
}
+ @Override
public Table<String, DeletedBlocksTransaction> getDeleteTransactionTable() {
return this.deleteTransactionTable;
}
@@ -76,7 +78,7 @@ public class DatanodeStoreSchemaThreeImpl extends AbstractDatanodeStore {
.iterator(getContainerKeyPrefix(containerID)), filter);
}
- public void dropAllWithPrefix(long containerID) throws IOException {
+ public void removeKVContainerData(long containerID) throws IOException {
String prefix = getContainerKeyPrefix(containerID);
try (BatchOperation batch = getBatchHandler().initBatchOperation()) {
getMetadataTable().deleteBatchWithPrefix(batch, prefix);
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaTwoImpl.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaTwoImpl.java
index 7e42fabec2..f09d30e45a 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaTwoImpl.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DatanodeStoreSchemaTwoImpl.java
@@ -31,7 +31,8 @@ import java.io.IOException;
* 2. A metadata table.
* 3. A Delete Transaction Table.
*/
-public class DatanodeStoreSchemaTwoImpl extends AbstractDatanodeStore {
+public class DatanodeStoreSchemaTwoImpl extends AbstractDatanodeStore
+ implements DeleteTransactionStore<Long> {
private final Table<Long, DeletedBlocksTransaction>
deleteTransactionTable;
@@ -50,6 +51,7 @@ public class DatanodeStoreSchemaTwoImpl extends AbstractDatanodeStore {
.getDeleteTransactionsColumnFamily().getTable(getStore());
}
+ @Override
public Table<Long, DeletedBlocksTransaction> getDeleteTransactionTable() {
return deleteTransactionTable;
}
diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DeleteTransactionStore.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DeleteTransactionStore.java
new file mode 100644
index 0000000000..40ae1abaa3
--- /dev/null
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/metadata/DeleteTransactionStore.java
@@ -0,0 +1,29 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.hadoop.ozone.container.metadata;
+
+import org.apache.hadoop.hdds.protocol.proto.StorageContainerDatanodeProtocolProtos.DeletedBlocksTransaction;
+import org.apache.hadoop.hdds.utils.db.Table;
+
+/**
+ * Store interface for DeleteTransaction table.
+ * @param <TXN_KEY>
+ */
+public interface DeleteTransactionStore<TXN_KEY> {
+
+ Table<TXN_KEY, DeletedBlocksTransaction> getDeleteTransactionTable();
+}
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
index 08b5b3369e..91d06f4aa4 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/TestBlockDeletingService.java
@@ -41,7 +41,6 @@ import org.apache.hadoop.hdds.utils.BackgroundService;
import org.apache.hadoop.hdds.utils.db.BatchOperation;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.TableIterator;
-import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.common.Checksum;
import org.apache.hadoop.ozone.common.ChunkBuffer;
import org.apache.hadoop.ozone.container.ContainerTestHelper;
@@ -59,7 +58,6 @@ import org.apache.hadoop.ozone.container.common.transport.server.ratis.Dispatche
import org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
import org.apache.hadoop.ozone.container.common.volume.RoundRobinVolumeChoosingPolicy;
import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
-import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
import org.apache.hadoop.ozone.container.keyvalue.ContainerTestVersionInfo;
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainer;
import org.apache.hadoop.ozone.container.keyvalue.KeyValueContainerData;
@@ -70,6 +68,7 @@ import org.apache.hadoop.ozone.container.keyvalue.impl.FilePerChunkStrategy;
import org.apache.hadoop.ozone.container.keyvalue.interfaces.ChunkManager;
import org.apache.hadoop.ozone.container.keyvalue.statemachine.background.BlockDeletingService;
import org.apache.hadoop.ozone.container.metadata.DatanodeStore;
+import org.apache.hadoop.ozone.container.metadata.DatanodeStoreSchemaThreeImpl;
import org.apache.hadoop.ozone.container.metadata.DatanodeStoreSchemaTwoImpl;
import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
import org.apache.hadoop.ozone.container.testutils.BlockDeletingServiceTestImpl;
@@ -79,9 +78,9 @@ import org.apache.hadoop.ozone.container.common.statemachine.DatanodeConfigurati
import static org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric;
-import org.junit.AfterClass;
+import org.junit.After;
import org.junit.Assert;
-import org.junit.BeforeClass;
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -91,9 +90,10 @@ import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_LIMIT
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVICE_INTERVAL;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V1;
import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V2;
+import static org.apache.hadoop.ozone.OzoneConsts.SCHEMA_V3;
+import static org.apache.hadoop.ozone.container.common.ContainerTestUtils.createDbInstancesForTestIfNeeded;
import static org.apache.hadoop.ozone.container.common.impl.ContainerLayoutVersion.FILE_PER_BLOCK;
import static org.apache.hadoop.ozone.container.common.states.endpoint.VersionEndpointTask.LOG;
-import static org.junit.Assume.assumeFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -105,20 +105,21 @@ import static java.nio.charset.StandardCharsets.UTF_8;
@RunWith(Parameterized.class)
public class TestBlockDeletingService {
- private static File testRoot;
- private static String scmId;
- private static String clusterID;
- private static String datanodeUuid;
- private static OzoneConfiguration conf;
+ private File testRoot;
+ private String scmId;
+ private String clusterID;
+ private String datanodeUuid;
+ private OzoneConfiguration conf;
private final ContainerLayoutVersion layout;
private final String schemaVersion;
private int blockLimitPerInterval;
- private static VolumeSet volumeSet;
+ private MutableVolumeSet volumeSet;
public TestBlockDeletingService(ContainerTestVersionInfo versionInfo) {
this.layout = versionInfo.getLayout();
this.schemaVersion = versionInfo.getSchemaVersion();
+ conf = new OzoneConfiguration();
ContainerTestVersionInfo.setTestSchemaVersion(schemaVersion, conf);
}
@@ -127,8 +128,8 @@ public class TestBlockDeletingService {
return ContainerTestVersionInfo.versionParameters();
}
- @BeforeClass
- public static void init() throws IOException {
+ @Before
+ public void init() throws IOException {
testRoot = GenericTestUtils
.getTestDir(TestBlockDeletingService.class.getSimpleName());
if (testRoot.exists()) {
@@ -136,16 +137,17 @@ public class TestBlockDeletingService {
}
scmId = UUID.randomUUID().toString();
clusterID = UUID.randomUUID().toString();
- conf = new OzoneConfiguration();
conf.set(ScmConfigKeys.HDDS_DATANODE_DIR_KEY, testRoot.getAbsolutePath());
conf.set(HddsConfigKeys.OZONE_METADATA_DIRS, testRoot.getAbsolutePath());
datanodeUuid = UUID.randomUUID().toString();
- volumeSet = new MutableVolumeSet(datanodeUuid, conf, null,
+ volumeSet = new MutableVolumeSet(datanodeUuid, scmId, conf, null,
StorageVolume.VolumeType.DATA_VOLUME, null);
+ createDbInstancesForTestIfNeeded(volumeSet, scmId, scmId, conf);
}
- @AfterClass
- public static void cleanup() throws IOException {
+ @After
+ public void cleanup() throws IOException {
+ BlockUtils.shutdownCache(conf);
FileUtils.deleteDirectory(testRoot);
}
@@ -193,14 +195,14 @@ public class TestBlockDeletingService {
if (schemaVersion.equals(SCHEMA_V1)) {
createPendingDeleteBlocksSchema1(numOfBlocksPerContainer, data,
containerID, numOfChunksPerBlock, buffer, chunkManager, container);
- } else if (schemaVersion.equals(SCHEMA_V2)) {
- createPendingDeleteBlocksSchema2(numOfBlocksPerContainer, txnID,
- containerID, numOfChunksPerBlock, buffer, chunkManager, container,
- data);
+ } else if (schemaVersion.equals(SCHEMA_V2)
+ || schemaVersion.equals(SCHEMA_V3)) {
+ createPendingDeleteBlocksViaTxn(numOfBlocksPerContainer, txnID,
+ containerID, numOfChunksPerBlock, buffer, chunkManager,
+ container, data);
} else {
throw new UnsupportedOperationException(
- "Only schema version 1 and schema version 2 are "
- + "supported.");
+ "Only schema version 1,2,3 are supported.");
}
}
}
@@ -232,7 +234,7 @@ public class TestBlockDeletingService {
}
@SuppressWarnings("checkstyle:parameternumber")
- private void createPendingDeleteBlocksSchema2(int numOfBlocksPerContainer,
+ private void createPendingDeleteBlocksViaTxn(int numOfBlocksPerContainer,
int txnID, long containerID, int numOfChunksPerBlock, ChunkBuffer buffer,
ChunkManager chunkManager, KeyValueContainer container,
KeyValueContainerData data) {
@@ -276,10 +278,18 @@ public class TestBlockDeletingService {
try (BatchOperation batch = metadata.getStore().getBatchHandler()
.initBatchOperation()) {
DatanodeStore ds = metadata.getStore();
- DatanodeStoreSchemaTwoImpl dnStoreTwoImpl =
- (DatanodeStoreSchemaTwoImpl) ds;
- dnStoreTwoImpl.getDeleteTransactionTable()
- .putWithBatch(batch, (long) txnID, dtx);
+
+ if (schemaVersion.equals(SCHEMA_V3)) {
+ DatanodeStoreSchemaThreeImpl dnStoreThreeImpl =
+ (DatanodeStoreSchemaThreeImpl) ds;
+ dnStoreThreeImpl.getDeleteTransactionTable()
+ .putWithBatch(batch, data.deleteTxnKey(txnID), dtx);
+ } else {
+ DatanodeStoreSchemaTwoImpl dnStoreTwoImpl =
+ (DatanodeStoreSchemaTwoImpl) ds;
+ dnStoreTwoImpl.getDeleteTransactionTable()
+ .putWithBatch(batch, (long) txnID, dtx);
+ }
metadata.getStore().getBatchHandler().commitBatchOperation(batch);
}
} catch (IOException exception) {
@@ -372,17 +382,32 @@ public class TestBlockDeletingService {
}
}
return pendingBlocks;
+ } else if (data.getSchemaVersion().equals(SCHEMA_V3)) {
+ int pendingBlocks = 0;
+ DatanodeStore ds = meta.getStore();
+ DatanodeStoreSchemaThreeImpl dnStoreThreeImpl =
+ (DatanodeStoreSchemaThreeImpl) ds;
+ try (
+ TableIterator<String, ? extends Table.KeyValue<String,
+ StorageContainerDatanodeProtocolProtos.DeletedBlocksTransaction>>
+ iter = dnStoreThreeImpl.getDeleteTransactionTable()
+ .iterator(data.containerPrefix())) {
+ while (iter.hasNext()) {
+ StorageContainerDatanodeProtocolProtos.DeletedBlocksTransaction
+ delTx = iter.next().getValue();
+ pendingBlocks += delTx.getLocalIDList().size();
+ }
+ }
+ return pendingBlocks;
} else {
throw new UnsupportedOperationException(
- "Only schema version 1 and schema version 2 are supported.");
+ "Only schema version 1,2,3 are supported.");
}
}
@Test
public void testBlockDeletion() throws Exception {
- assumeFalse(schemaVersion.equals(OzoneConsts.SCHEMA_V3));
-
DatanodeConfiguration dnConf = conf.getObject(DatanodeConfiguration.class);
dnConf.setBlockDeletionLimit(2);
this.blockLimitPerInterval = dnConf.getBlockDeletionLimit();
@@ -462,8 +487,6 @@ public class TestBlockDeletingService {
@Test
@SuppressWarnings("java:S2699") // waitFor => assertion with timeout
public void testShutdownService() throws Exception {
- assumeFalse(schemaVersion.equals(OzoneConsts.SCHEMA_V3));
-
conf.setTimeDuration(OZONE_BLOCK_DELETING_SERVICE_INTERVAL, 500,
TimeUnit.MILLISECONDS);
conf.setInt(OZONE_BLOCK_DELETING_CONTAINER_LIMIT_PER_INTERVAL, 10);
@@ -492,8 +515,6 @@ public class TestBlockDeletingService {
@Test
public void testBlockDeletionTimeout() throws Exception {
- assumeFalse(schemaVersion.equals(OzoneConsts.SCHEMA_V3));
-
DatanodeConfiguration dnConf = conf.getObject(DatanodeConfiguration.class);
dnConf.setBlockDeletionLimit(3);
blockLimitPerInterval = dnConf.getBlockDeletionLimit();
@@ -581,8 +602,6 @@ public class TestBlockDeletingService {
@Test(timeout = 30000)
@org.junit.Ignore
public void testContainerThrottle() throws Exception {
- assumeFalse(schemaVersion.equals(OzoneConsts.SCHEMA_V3));
-
// Properties :
// - Number of containers : 2
// - Number of blocks per container : 1
@@ -657,8 +676,6 @@ public class TestBlockDeletingService {
@Test(timeout = 30000)
public void testBlockThrottle() throws Exception {
- assumeFalse(schemaVersion.equals(OzoneConsts.SCHEMA_V3));
-
// Properties :
// - Number of containers : 5
// - Number of blocks per container : 3
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org