szetszwo commented on code in PR #8848:
URL: https://github.com/apache/ozone/pull/8848#discussion_r2249391364


##########
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java:
##########
@@ -220,16 +224,45 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
 
       omBucketInfo = getBucketInfo(omMetadataManager, volumeName, bucketName);
 
+      // This map should contain maximum of two entries
+      // 1. Overwritten part
+      // 2. Uncommitted pseudo part key
+      Map<String, RepeatedOmKeyInfo> keyVersionsToDeleteMap = null;
+
       long correctedSpace = omKeyInfo.getReplicatedSize();
       if (null != oldPartKeyInfo) {
         OmKeyInfo partKeyToBeDeleted =
             OmKeyInfo.getFromProtobuf(oldPartKeyInfo.getPartKeyInfo());
         correctedSpace -= partKeyToBeDeleted.getReplicatedSize();
+        RepeatedOmKeyInfo oldVerKeyInfo = 
getOldVersionsToCleanUp(partKeyToBeDeleted, trxnLogIndex);
+        // Unlike normal key commit, we can reuse the objectID for MPU part 
key because MPU part key
+        // always use a new object ID regardless whether there is an existing 
key.
+        String delKeyName = omMetadataManager.getOzoneDeletePathKey(
+            partKeyToBeDeleted.getObjectID(), multipartKey);
+
+        if (!oldVerKeyInfo.getOmKeyInfoList().isEmpty()) {
+          keyVersionsToDeleteMap = new HashMap<>();
+          keyVersionsToDeleteMap.put(delKeyName, oldVerKeyInfo);
+        }
       }
       checkBucketQuotaInBytes(omMetadataManager, omBucketInfo,
           correctedSpace);
       omBucketInfo.incrUsedBytes(correctedSpace);
 
+      // let the uncommitted blocks pretend as key's old version blocks
+      // which will be deleted as RepeatedOmKeyInfo
+      final OmKeyInfo pseudoKeyInfo = 
wrapUncommittedBlocksAsPseudoKey(uncommitted, omKeyInfo);
+      if (pseudoKeyInfo != null) {
+        long pseudoObjId = ozoneManager.getObjectIdFromTxId(trxnLogIndex);
+        String delKeyName = omMetadataManager.getOzoneDeletePathKey(
+            pseudoObjId, ozoneKey);
+        if (null == keyVersionsToDeleteMap) {
+          keyVersionsToDeleteMap = new HashMap<>();
+        }
+        keyVersionsToDeleteMap.computeIfAbsent(delKeyName,
+            key -> new RepeatedOmKeyInfo()).addOmKeyInfo(pseudoKeyInfo);
+      }

Review Comment:
   Let's add a utility method so that it can be used here and also 
OMKeyCommitRequest.
   ```diff
   +++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
   @@ -1174,6 +1175,21 @@ protected OmKeyInfo wrapUncommittedBlocksAsPseudoKey(
        return pseudoKeyInfo;
      }
    
   +  protected static Map<String, RepeatedOmKeyInfo> 
addKeyInfoToDeleteMap(OzoneManager om,
   +      long trxnLogIndex, String ozoneKey, OmKeyInfo keyInfo, Map<String, 
RepeatedOmKeyInfo> deleteMap) {
   +    if (keyInfo == null) {
   +      return deleteMap;
   +    }
   +    final long pseudoObjId = om.getObjectIdFromTxId(trxnLogIndex);
   +    final String delKeyName = 
om.getMetadataManager().getOzoneDeletePathKey(pseudoObjId, ozoneKey);
   +    if (deleteMap == null) {
   +      deleteMap = new HashMap<>();
   +    }
   +    deleteMap.computeIfAbsent(delKeyName, key -> new RepeatedOmKeyInfo())
   +        .addOmKeyInfo(keyInfo);
   +    return deleteMap;
   +  }
   +
      /**
       * Remove blocks in-place from keysToBeFiltered that exist in 
referenceKey.
       * <p>
   ```
   ```diff
   +++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
   @@ -351,16 +351,7 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
          // which will be deleted as RepeatedOmKeyInfo
          final OmKeyInfo pseudoKeyInfo = isHSync ? null
              : wrapUncommittedBlocksAsPseudoKey(uncommitted, omKeyInfo);
   -      if (pseudoKeyInfo != null) {
   -        long pseudoObjId = ozoneManager.getObjectIdFromTxId(trxnLogIndex);
   -        String delKeyName = omMetadataManager.getOzoneDeletePathKey(
   -            pseudoObjId, dbOzoneKey);
   -        if (null == oldKeyVersionsToDeleteMap) {
   -          oldKeyVersionsToDeleteMap = new HashMap<>();
   -        }
   -        oldKeyVersionsToDeleteMap.computeIfAbsent(delKeyName,
   -            key -> new RepeatedOmKeyInfo()).addOmKeyInfo(pseudoKeyInfo);
   -      }
   +      oldKeyVersionsToDeleteMap = addKeyInfoToDeleteMap(ozoneManager, 
trxnLogIndex, dbOzoneKey, pseudoKeyInfo, oldKeyVersionsToDeleteMap);
    
          // Add to cache of open key table and key table.
          if (!isHSync) {
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to