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

sammichen 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 67a68262c84 HDDS-14417. Skip wrapping allocated but unused blocks for 
empty file as pseudo file and save in deletedTable (#9639)
67a68262c84 is described below

commit 67a68262c846a51c0592a7f33f2c6bf4bc2cc7cd
Author: Sammi Chen <[email protected]>
AuthorDate: Tue Jan 20 13:36:09 2026 +0800

    HDDS-14417. Skip wrapping allocated but unused blocks for empty file as 
pseudo file and save in deletedTable (#9639)
---
 .../hadoop/ozone/om/request/key/OMKeyRequest.java  |  2 +-
 .../om/request/key/TestOMKeyCommitRequest.java     | 35 +++++++++++++
 .../TestS3MultipartUploadCommitPartRequest.java    | 59 ++++++++++++++++++++++
 3 files changed, 95 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
index 630cd8ff35f..7df2619e9e4 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
@@ -1155,7 +1155,7 @@ protected OzoneLockStrategy 
getOzoneLockStrategy(OzoneManager ozoneManager) {
    */
   protected OmKeyInfo wrapUncommittedBlocksAsPseudoKey(
       List<OmKeyLocationInfo> uncommitted, OmKeyInfo omKeyInfo) {
-    if (uncommitted.isEmpty()) {
+    if (uncommitted.isEmpty() || omKeyInfo.getDataSize() == 0) {
       return null;
     }
     LOG.debug("Detect allocated but uncommitted blocks {} in key {}.",
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
index 533ecbeff3d..02d913160bc 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCommitRequest.java
@@ -814,6 +814,41 @@ public void 
testValidateAndUpdateCacheOnOverwriteWithUncommittedBlocks() throws
     
assertThat(key).doesNotEndWith(String.valueOf(omKeyInfoList.get(0).getObjectID()));
   }
 
+  @Test
+  public void testPreAllocatedUncommittedBlockForEmptyFile() throws Exception {
+    dataSize = 0;
+    List<KeyLocation> emptyKeyLocations = new ArrayList<>();
+    List<KeyLocation> oneKeyLocations = getKeyLocation(1);
+    OMRequest omRequest = createCommitKeyRequest(emptyKeyLocations, false);
+    OMRequest modifiedOmRequest = doPreExecute(omRequest);
+    OMKeyCommitRequest omKeyCommitRequest = 
getOmKeyCommitRequest(modifiedOmRequest);
+
+    OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
+        omMetadataManager, omKeyCommitRequest.getBucketLayout());
+
+    List<OmKeyLocationInfo> allocatedLocationList =
+        
oneKeyLocations.stream().map(OmKeyLocationInfo::getFromProtobuf).collect(Collectors.toList());
+    String openKey = addKeyToOpenKeyTable(allocatedLocationList);
+    OmKeyInfo omKeyInfo = 
omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
+    assertNotNull(omKeyInfo);
+
+    String ozoneKey = getOzonePathKey();
+    omKeyInfo = 
omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
+    assertNull(omKeyInfo);
+
+    OMClientResponse omClientResponse = 
omKeyCommitRequest.validateAndUpdateCache(ozoneManager, 100L);
+    assertEquals(OK, omClientResponse.getOMResponse().getStatus());
+
+    Map<String, RepeatedOmKeyInfo> toDeleteKeyList = ((OMKeyCommitResponse) 
omClientResponse).getKeysToDelete();
+    assertNull(toDeleteKeyList);
+
+    omKeyInfo = 
omMetadataManager.getOpenKeyTable(omKeyCommitRequest.getBucketLayout()).get(openKey);
+    assertNull(omKeyInfo);
+
+    omKeyInfo = 
omMetadataManager.getKeyTable(omKeyCommitRequest.getBucketLayout()).get(ozoneKey);
+    assertNotNull(omKeyInfo);
+  }
+
   /**
    * This method calls preExecute and verify the modified request.
    * @param originalOMRequest
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartUploadCommitPartRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartUploadCommitPartRequest.java
index 4e147418e6e..b5d78662507 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartUploadCommitPartRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/s3/multipart/TestS3MultipartUploadCommitPartRequest.java
@@ -556,6 +556,65 @@ public void 
testValidateAndUpdateCacheOnOverWriteWithUncommittedBlocks() throws
     assertEquals(2, toDeleteKeyMap.size());
   }
 
+  @Test
+  public void testValidateAndUpdateCacheWithUncommittedBlockForEmptyPart() 
throws Exception {
+    String volumeName = UUID.randomUUID().toString();
+    String bucketName = UUID.randomUUID().toString();
+    String keyName = getKeyName();
+
+    OMRequestTestUtils.addVolumeAndBucketToDB(volumeName, bucketName,
+        omMetadataManager, getBucketLayout());
+
+    createParentPath(volumeName, bucketName);
+
+    // Create key to be overwritten
+    OMRequest initiateMPURequest = doPreExecuteInitiateMPU(volumeName,
+        bucketName, keyName);
+
+    S3InitiateMultipartUploadRequest s3InitiateMultipartUploadRequest =
+        getS3InitiateMultipartUploadReq(initiateMPURequest);
+
+    OMClientResponse omClientResponse =
+        s3InitiateMultipartUploadRequest.validateAndUpdateCache(ozoneManager, 
1L);
+
+    long clientID = Time.now();
+    String multipartUploadID = omClientResponse.getOMResponse()
+        .getInitiateMultiPartUploadResponse().getMultipartUploadID();
+
+    List<KeyLocation> emptyKeyLocationInfos = new ArrayList<>();
+    List<KeyLocation> originalKeyLocationList = getKeyLocation(1);
+    List<OmKeyLocationInfo> originalKeyLocationInfos = originalKeyLocationList
+        .stream().map(OmKeyLocationInfo::getFromProtobuf)
+        .collect(Collectors.toList());
+
+    OMRequest commitMultipartRequest = doPreExecuteCommitMPU(volumeName,
+        bucketName, keyName, clientID, multipartUploadID, 1, 
emptyKeyLocationInfos);
+
+    S3MultipartUploadCommitPartRequest s3MultipartUploadCommitPartRequest =
+        getS3MultipartUploadCommitReq(commitMultipartRequest);
+
+    addKeyToOpenKeyTable(volumeName, bucketName, keyName, clientID, 
originalKeyLocationInfos);
+
+    omClientResponse =
+        
s3MultipartUploadCommitPartRequest.validateAndUpdateCache(ozoneManager, 2L);
+
+    assertSame(OzoneManagerProtocolProtos.Status.OK,
+        omClientResponse.getOMResponse().getStatus());
+
+    String multipartKey = omMetadataManager.getMultipartKey(volumeName,
+        bucketName, keyName, multipartUploadID);
+
+    OmMultipartKeyInfo multipartKeyInfo = 
omMetadataManager.getMultipartInfoTable().get(multipartKey);
+    assertNotNull(multipartKeyInfo);
+    assertEquals(1, multipartKeyInfo.getPartKeyInfoMap().size());
+    PartKeyInfo partKeyInfo = multipartKeyInfo.getPartKeyInfo(1);
+    assertNotNull(partKeyInfo);
+
+    Map<String, RepeatedOmKeyInfo> toDeleteKeyMap =
+        ((S3MultipartUploadCommitPartResponse) 
omClientResponse).getKeyToDelete();
+    assertNull(toDeleteKeyMap);
+  }
+
   protected void addKeyToOpenKeyTable(String volumeName, String bucketName,
       String keyName, long clientID) throws Exception {
     OMRequestTestUtils.addKeyToTable(true, true, volumeName, bucketName,


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

Reply via email to