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