You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by sz...@apache.org on 2026/10/09 17:53:52 UTC

(ozone) branch master updated: HDDS-16730. [hsync] FinalizeBlock does not persist the last chunk merge (#11414)

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 84f5594a6a2 HDDS-16730. [hsync] FinalizeBlock does not persist the last chunk merge (#11414)
84f5594a6a2 is described below

commit 84f5594a6a2dd378d6adef2f4576080978c969da
Author: Peter Lee <pe...@gmail.com>
AuthorDate: Sat Oct 10 01:53:46 2026 +0800

    HDDS-16730. [hsync] FinalizeBlock does not persist the last chunk merge (#11414)
---
 .../container/keyvalue/impl/BlockManagerImpl.java  |  3 +--
 .../keyvalue/impl/TestBlockManagerImpl.java        | 29 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/BlockManagerImpl.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/BlockManagerImpl.java
index 6e69ed0480f..d10ad6f2f0d 100644
--- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/BlockManagerImpl.java
+++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/BlockManagerImpl.java
@@ -336,9 +336,8 @@ public void finalizeBlock(Container container, BlockID blockId)
           .initBatchOperation()) {
         db.getStore().getFinalizeBlocksTable().putWithBatch(batch,
             kvContainer.getContainerData().getBlockKey(localID), localID);
-        db.getStore().getBatchHandler().commitBatchOperation(batch);
-
         mergeLastChunkForBlockFinalization(blockId, db, kvContainer, batch, localID);
+        db.getStore().getBatchHandler().commitBatchOperation(batch);
       }
     }
   }
diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
index eb58ac3ce84..bd56751486f 100644
--- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
+++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/keyvalue/impl/TestBlockManagerImpl.java
@@ -23,6 +23,7 @@
 import static org.apache.hadoop.ozone.container.keyvalue.impl.BlockManagerImpl.FULL_CHUNK;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.anyList;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -468,4 +469,32 @@ public void testFlush3(ContainerTestVersionInfo versionInfo)
       assertEquals(chunkLimit * i, chunkInfos.get(i).getOffset());
     }
   }
+
+  @ContainerTestVersionInfo.ContainerTest
+  public void testFinalizeBlockMergesLastChunk(ContainerTestVersionInfo versionInfo) throws Exception {
+    initTest(versionInfo);
+    Assumptions.assumeFalse(isSameSchemaVersion(schemaVersion, OzoneConsts.SCHEMA_V1));
+    // simulates writing a full chunk + 1024 bytes, hsync, write another 1024 bytes, hsync, then finalize
+    long containerID = 1;
+    long blockNo = 2;
+    long chunkLimit = 4 * 1024 * 1024;
+    blockData1 = createBlockDataWithOneFullChunk(containerID, blockNo, 2, chunkLimit, 1024, 1);
+    blockManager.putBlock(keyValueContainer, blockData1, false);
+    BlockData blockData2 = createBlockData(containerID, blockNo, 2, chunkLimit, 2048, 2);
+    blockManager.putBlock(keyValueContainer, blockData2, false);
+
+    blockManager.finalizeBlock(keyValueContainer, new BlockID(containerID, blockNo));
+
+    // the last chunk should be moved from the last chunk info table to the block data table
+    KeyValueContainerData containerData = keyValueContainer.getContainerData();
+    String blockKey = containerData.getBlockKey(blockNo);
+    try (DBHandle db = BlockUtils.getDB(containerData, config)) {
+      assertEquals(blockNo, db.getStore().getFinalizeBlocksTable().get(blockKey));
+      assertNull(db.getStore().getLastChunkInfoTable().get(blockKey));
+      BlockData persisted = db.getStore().getBlockDataTable().get(blockKey);
+      assertEquals(chunkLimit + 2048, persisted.getSize());
+      assertEquals(2, persisted.getChunks().size());
+      assertEquals(2, persisted.getBlockCommitSequenceId());
+    }
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org