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

adoroszlai 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 f4660a254a1 HDDS-10388. Make WithMetadata immutable (#9293)
f4660a254a1 is described below

commit f4660a254a1bc89d78dda55c5543e4f93f1f5ac4
Author: Eric C. Ho <[email protected]>
AuthorDate: Sun Nov 16 15:30:31 2025 +0800

    HDDS-10388. Make WithMetadata immutable (#9293)
---
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |   2 +-
 .../main/java/org/apache/hadoop/ozone/OmUtils.java |  18 ++--
 .../apache/hadoop/ozone/om/helpers/OmKeyInfo.java  | 104 +++++++++++++--------
 .../hadoop/ozone/om/helpers/WithMetadata.java      |  20 ++--
 .../hadoop/ozone/om/helpers/TestOmKeyInfo.java     |   3 +-
 .../ozone/client/rpc/OzoneRpcClientTests.java      |   3 +-
 .../hadoop/ozone/om/helpers/TestOmPrefixInfo.java  |   4 +-
 .../om/request/file/OMRecoverLeaseRequest.java     |   4 +-
 .../key/OMDirectoriesPurgeRequestWithFSO.java      |   3 +-
 .../ozone/om/request/key/OMKeyCommitRequest.java   |  31 +++---
 .../om/request/key/OMKeyCommitRequestWithFSO.java  |  27 ++++--
 .../ozone/om/request/key/OMKeyDeleteRequest.java   |   3 +-
 .../om/request/key/OMKeyDeleteRequestWithFSO.java  |   3 +-
 .../hadoop/ozone/om/request/key/OMKeyRequest.java  |   9 +-
 .../ozone/om/request/key/OMKeysDeleteRequest.java  |   3 +-
 .../om/request/key/OmKeysDeleteRequestWithFSO.java |   3 +-
 .../S3MultipartUploadCommitPartRequest.java        |   6 +-
 .../S3MultipartUploadCompleteRequest.java          |   9 +-
 .../response/key/AbstractOMKeyDeleteResponse.java  |  12 +--
 .../key/OMDirectoriesPurgeResponseWithFSO.java     |   4 +-
 .../om/request/file/TestOMRecoverLeaseRequest.java |  20 ++--
 .../om/request/key/TestOMKeyCreateRequest.java     |   3 +-
 .../request/key/TestOMKeyRenameRequestWithFSO.java |   4 +-
 .../ozone/om/snapshot/TestSnapshotUtils.java       |   9 +-
 24 files changed, 184 insertions(+), 123 deletions(-)

diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index d4ebf0be1b3..4f6ddd76baf 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -1625,8 +1625,8 @@ public OzoneInputStream getKey(
             .setParentObjectID(keyInfo.getParentObjectID())
             .setFileChecksum(keyInfo.getFileChecksum())
             .setOwnerName(keyInfo.getOwnerName())
+            .addAllMetadata(keyInfo.getMetadata())
             .build();
-        dnKeyInfo.setMetadata(keyInfo.getMetadata());
         dnKeyInfo.setKeyLocationVersions(keyLocationInfoGroups);
 
         blocks.put(dn, createInputStream(dnKeyInfo, Function.identity()));
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
index 4c20b380865..7c3e1b12b33 100644
--- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
+++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OmUtils.java
@@ -541,23 +541,29 @@ public static File createOMDir(String dirPath) {
    */
   public static RepeatedOmKeyInfo prepareKeyForDelete(long bucketId, OmKeyInfo 
keyInfo,
       long trxnLogIndex) {
+    OmKeyInfo sanitizedKeyInfo = keyInfo;
     // If this key is in a GDPR enforced bucket, then before moving
     // KeyInfo to deletedTable, remove the GDPR related metadata and
     // FileEncryptionInfo from KeyInfo.
     if (Boolean.parseBoolean(
             keyInfo.getMetadata().get(OzoneConsts.GDPR_FLAG))
     ) {
-      keyInfo.getMetadata().remove(OzoneConsts.GDPR_FLAG);
-      keyInfo.getMetadata().remove(OzoneConsts.GDPR_ALGORITHM);
-      keyInfo.getMetadata().remove(OzoneConsts.GDPR_SECRET);
-      keyInfo.clearFileEncryptionInfo();
+      sanitizedKeyInfo = sanitizedKeyInfo.withMetadataMutations(metadata -> {
+        metadata.remove(OzoneConsts.GDPR_FLAG);
+        metadata.remove(OzoneConsts.GDPR_ALGORITHM);
+        metadata.remove(OzoneConsts.GDPR_SECRET);
+      });
+      sanitizedKeyInfo.clearFileEncryptionInfo();
     }
 
     // Set the updateID
-    keyInfo.setUpdateID(trxnLogIndex);
+    sanitizedKeyInfo.setUpdateID(trxnLogIndex);
+    if (sanitizedKeyInfo != keyInfo) {
+      keyInfo.setUpdateID(trxnLogIndex);
+    }
 
     //The key doesn't exist in deletedTable, so create a new instance.
-    return new RepeatedOmKeyInfo(keyInfo, bucketId);
+    return new RepeatedOmKeyInfo(sanitizedKeyInfo, bucketId);
   }
 
   /**
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
index 29c25778ed7..0cc2a8ff4b9 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
@@ -25,6 +25,7 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.fs.FileChecksum;
@@ -193,12 +194,38 @@ public String getOwnerName() {
     return ownerName;
   }
 
-  public void setCommittedKeyDeletedFlag(boolean val) {
+  public OmKeyInfo withCommittedKeyDeletedFlag(boolean val) {
     if (val) {
-      this.getMetadata().put(COMMITTED_KEY_DELETED_FLAG, "true");
-    } else {
-      this.getMetadata().remove(COMMITTED_KEY_DELETED_FLAG);
+      return withMetadataMutations(
+          metadata -> metadata.put(COMMITTED_KEY_DELETED_FLAG, "true"));
     }
+    return withMetadataMutations(
+        metadata -> metadata.remove(COMMITTED_KEY_DELETED_FLAG));
+  }
+
+  /**
+   * Returns a new {@link OmKeyInfo} instance with metadata updated by the
+   * provided mutator.
+   *
+   * @param metadataUpdater a function that applies mutations to a copy of the 
metadata
+   * @return a new {@link OmKeyInfo} instance with updated metadata
+   */
+  public OmKeyInfo withMetadataMutations(
+      Consumer<Map<String, String>> metadataUpdater) {
+    Objects.requireNonNull(metadataUpdater, "metadataUpdater == null");
+    Map<String, String> metadataCopy = new HashMap<>(getMetadata());
+    metadataUpdater.accept(metadataCopy);
+    return toBuilder().setMetadata(metadataCopy).build();
+  }
+
+  /**
+   * Returns a new {@link OmKeyInfo} with metadata replaced by the provided
+   * map.
+   * @param metadata the metadata to set
+   * @return a new {@link OmKeyInfo}
+   */
+  public OmKeyInfo withMetadata(Map<String, String> metadata) {
+    return toBuilder().setMetadata(metadata).build();
   }
 
   public boolean isDeletedKeyCommitted() {
@@ -499,6 +526,28 @@ public Builder() {
 
     public Builder(OmKeyInfo obj) {
       super(obj);
+      this.volumeName = obj.volumeName;
+      this.bucketName = obj.bucketName;
+      this.keyName = obj.keyName;
+      this.ownerName = obj.ownerName;
+      this.dataSize = obj.dataSize;
+      this.creationTime = obj.creationTime;
+      this.modificationTime = obj.modificationTime;
+      this.replicationConfig = obj.replicationConfig;
+      this.encInfo = obj.encInfo;
+      this.fileName = obj.fileName;
+      this.fileChecksum = obj.fileChecksum;
+      this.isFile = obj.isFile;
+      this.expectedDataGeneration = obj.expectedDataGeneration;
+      if (obj.getTags() != null) {
+        this.tags.putAll(obj.getTags());
+      }
+      this.acls.addAll(obj.getAcls());
+      obj.keyLocationVersions.forEach(keyLocationVersion ->
+          this.omKeyLocationInfoGroups.add(
+              new OmKeyLocationInfoGroup(keyLocationVersion.getVersion(),
+                  keyLocationVersion.getLocationList(),
+                  keyLocationVersion.isMultipartKey())));
     }
 
     public Builder setVolumeName(String volume) {
@@ -569,6 +618,12 @@ public Builder addAllMetadata(Map<String, String> 
newMetadata) {
       return this;
     }
 
+    @Override
+    public Builder setMetadata(Map<String, String> map) {
+      super.setMetadata(map);
+      return this;
+    }
+
     public Builder setFileEncryptionInfo(FileEncryptionInfo feInfo) {
       this.encInfo = feInfo;
       return this;
@@ -882,44 +937,13 @@ public int hashCode() {
   /**
    * Return a new copy of the object.
    */
+  public Builder toBuilder() {
+    return new Builder(this);
+  }
+
   @Override
   public OmKeyInfo copyObject() {
-    OmKeyInfo.Builder builder = new OmKeyInfo.Builder(this)
-        .setVolumeName(volumeName)
-        .setBucketName(bucketName)
-        .setKeyName(keyName)
-        .setOwnerName(ownerName)
-        .setCreationTime(creationTime)
-        .setModificationTime(modificationTime)
-        .setDataSize(dataSize)
-        .setReplicationConfig(replicationConfig)
-        .setFileEncryptionInfo(encInfo)
-        .setAcls(acls)
-        .setFileName(fileName)
-        .setFile(isFile);
-
-    keyLocationVersions.forEach(keyLocationVersion ->
-        builder.addOmKeyLocationInfoGroup(
-            new OmKeyLocationInfoGroup(keyLocationVersion.getVersion(),
-                keyLocationVersion.getLocationList(),
-                keyLocationVersion.isMultipartKey())));
-
-    if (getMetadata() != null) {
-      getMetadata().forEach(builder::addMetadata);
-    }
-
-    if (getTags() != null) {
-      getTags().forEach(builder::addTag);
-    }
-
-    if (fileChecksum != null) {
-      builder.setFileChecksum(fileChecksum);
-    }
-    if (expectedDataGeneration != null) {
-      builder.setExpectedDataGeneration(expectedDataGeneration);
-    }
-
-    return builder.build();
+    return new Builder(this).build();
   }
 
   /**
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/WithMetadata.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/WithMetadata.java
index 85a102c9cc9..956fa5753a9 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/WithMetadata.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/WithMetadata.java
@@ -17,26 +17,31 @@
 
 package org.apache.hadoop.ozone.om.helpers;
 
+import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import net.jcip.annotations.Immutable;
 
 /**
  * Mixin class to handle custom metadata.
  */
+@Immutable
 public abstract class WithMetadata {
 
-  private Map<String, String> metadata;
+  private final Map<String, String> metadata;
 
   protected WithMetadata() {
-    metadata = new ConcurrentHashMap<>();
+    metadata = ImmutableMap.of();
   }
 
   protected WithMetadata(Builder b) {
-    metadata = b.metadata;
+    metadata = b.metadata == null ? ImmutableMap.of()
+        : ImmutableMap.copyOf(b.metadata);
   }
 
   protected WithMetadata(WithMetadata other) {
-    metadata = new ConcurrentHashMap<>(other.getMetadata());
+    metadata = other.getMetadata() == null ? ImmutableMap.of()
+        : ImmutableMap.copyOf(other.getMetadata());
   }
 
   /**
@@ -46,13 +51,6 @@ public final Map<String, String> getMetadata() {
     return metadata;
   }
 
-  /**
-   * Set custom key value metadata.
-   */
-  public final void setMetadata(Map<String, String> metadata) {
-    this.metadata = metadata;
-  }
-
   /** Builder for {@link WithMetadata}. */
   public static class Builder {
     private final Map<String, String> metadata;
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
index 5a23df4d968..e35a2518cfe 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
@@ -64,7 +64,8 @@ public void protobufConversion() throws IOException {
     assertEquals(key, keyAfterSerialization);
 
     assertFalse(key.isHsync());
-    key.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID, "clientid");
+    key = key.withMetadataMutations(
+        metadata -> metadata.put(OzoneConsts.HSYNC_CLIENT_ID, "clientid"));
     assertTrue(key.isHsync());
     assertEquals(5678L, key.getExpectedDataGeneration());
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
index 34a5f4b7459..5cc2e8ec435 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/OzoneRpcClientTests.java
@@ -4454,7 +4454,8 @@ public void testKeyReadWriteForGDPR() throws Exception {
     OmKeyInfo omKeyInfo = 
omMetadataManager.getKeyTable(BucketLayout.OBJECT_STORE)
         .get(omMetadataManager.getOzoneKey(volumeName, bucketName, keyName));
 
-    omKeyInfo.getMetadata().remove(OzoneConsts.GDPR_FLAG);
+    omKeyInfo = omKeyInfo.withMetadataMutations(
+        metadata -> metadata.remove(OzoneConsts.GDPR_FLAG));
 
     omMetadataManager.getKeyTable(BucketLayout.OBJECT_STORE)
         .put(omMetadataManager.getOzoneKey(volumeName, bucketName, keyName),
diff --git 
a/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmPrefixInfo.java
 
b/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmPrefixInfo.java
index 4b867940864..5fcaed544af 100644
--- 
a/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmPrefixInfo.java
+++ 
b/hadoop-ozone/interface-storage/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmPrefixInfo.java
@@ -131,7 +131,9 @@ public void testGetProtobuf() {
         IAccessAuthorizer.ACLIdentityType.USER,
         username, IAccessAuthorizer.ACLType.WRITE,
         ACCESS);
-    omPrefixInfo.getMetadata().put("key", "value");
+    omPrefixInfo = new OmPrefixInfo.Builder(omPrefixInfo)
+        .addMetadata("key", "value")
+        .build();
     OzoneManagerStorageProtos.PersistedPrefixInfo pi =
         omPrefixInfo.getProtobuf();
     assertEquals(testPath, pi.getName());
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
index 5c96ae67fbe..c3effc5d291 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
@@ -228,7 +228,9 @@ private RecoverLeaseResponse doWork(OzoneManager 
ozoneManager,
         throw new OMException("Open Key " + keyName + " updated recently and 
is inside soft limit period",
             KEY_UNDER_LEASE_SOFT_LIMIT_PERIOD);
       }
-      openKeyInfo.getMetadata().put(OzoneConsts.LEASE_RECOVERY, "true");
+      openKeyInfo = openKeyInfo.toBuilder()
+          .addMetadata(OzoneConsts.LEASE_RECOVERY, "true")
+          .build();
       openKeyInfo.setUpdateID(transactionLogIndex);
       openKeyInfo.setModificationTime(Time.now());
       // add to cache.
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
index ed6185141d6..aa197108195 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMDirectoriesPurgeRequestWithFSO.java
@@ -173,7 +173,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
                 parentId, processed.keyInfo.getFileName(), hsyncClientId);
             OmKeyInfo openKeyInfo = 
omMetadataManager.getOpenKeyTable(getBucketLayout()).get(dbOpenKey);
             if (openKeyInfo != null) {
-              openKeyInfo.getMetadata().put(DELETED_HSYNC_KEY, "true");
+              openKeyInfo = openKeyInfo.withMetadataMutations(
+                  metadata -> metadata.put(DELETED_HSYNC_KEY, "true"));
               openKeyInfoMap.put(dbOpenKey, openKeyInfo);
             }
           }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
index 31f1d9d7180..a106903bce7 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequest.java
@@ -274,7 +274,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
         dbOpenKeyToDeleteKey = omMetadataManager.getOpenKey(volumeName, 
bucketName,
             keyName, 
Long.parseLong(keyToDelete.getMetadata().get(OzoneConsts.HSYNC_CLIENT_ID)));
         openKeyToDelete = 
omMetadataManager.getOpenKeyTable(getBucketLayout()).get(dbOpenKeyToDeleteKey);
-        openKeyToDelete.getMetadata().put(OzoneConsts.OVERWRITTEN_HSYNC_KEY, 
"true");
+        openKeyToDelete = openKeyToDelete.toBuilder()
+            .addMetadata(OzoneConsts.OVERWRITTEN_HSYNC_KEY, "true")
+            .build();
         openKeyToDelete.setModificationTime(Time.now());
         openKeyToDelete.setUpdateID(trxnLogIndex);
         omMetadataManager.getOpenKeyTable(getBucketLayout()).addCacheEntry(
@@ -288,7 +290,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
       if (isHSync) {
         if (!OmKeyHSyncUtil.isHSyncedPreviously(omKeyInfo, clientIdString, 
dbOpenKey)) {
           // Update open key as well if it is the first hsync of this key
-          omKeyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID, 
clientIdString);
+          omKeyInfo = omKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(OzoneConsts.HSYNC_CLIENT_ID, 
clientIdString));
           newOpenKeyInfo = omKeyInfo.copyObject();
         }
       }
@@ -298,8 +301,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
       // not persisted in the key table.
       omKeyInfo.setExpectedDataGeneration(null);
 
-      omKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf(
-          commitKeyArgs.getMetadataList()));
+      omKeyInfo = omKeyInfo.withMetadataMutations(metadata ->
+          metadata.putAll(KeyValueUtil.getFromProtobuf(
+              commitKeyArgs.getMetadataList())));
       omKeyInfo.setDataSize(commitKeyArgs.getDataSize());
 
       // Update the block length for each block, return the allocated but
@@ -343,9 +347,12 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
         long totalNamespace = 0;
         if (!oldVerKeyInfo.getOmKeyInfoList().isEmpty()) {
           oldKeyVersionsToDeleteMap.put(delKeyName, oldVerKeyInfo);
-          for (OmKeyInfo olderKeyVersions : oldVerKeyInfo.getOmKeyInfoList()) {
-            olderKeyVersions.setCommittedKeyDeletedFlag(true);
-            totalSize += sumBlockLengths(olderKeyVersions);
+          List<OmKeyInfo> oldKeys = oldVerKeyInfo.getOmKeyInfoList();
+          for (int i = 0; i < oldKeys.size(); i++) {
+            OmKeyInfo updatedOlderKeyVersions =
+                oldKeys.get(i).withCommittedKeyDeletedFlag(true);
+            oldKeys.set(i, updatedOlderKeyVersions);
+            totalSize += sumBlockLengths(updatedOlderKeyVersions);
             totalNamespace += 1;
           }
         }
@@ -379,10 +386,12 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
             dbOpenKey, trxnLogIndex);
 
         // Prevent hsync metadata from getting committed to the final key
-        omKeyInfo.getMetadata().remove(OzoneConsts.HSYNC_CLIENT_ID);
-        if (isRecovery) {
-          omKeyInfo.getMetadata().remove(OzoneConsts.LEASE_RECOVERY);
-        }
+        omKeyInfo = omKeyInfo.withMetadataMutations(metadata -> {
+          metadata.remove(OzoneConsts.HSYNC_CLIENT_ID);
+          if (isRecovery) {
+            metadata.remove(OzoneConsts.LEASE_RECOVERY);
+          }
+        });
       } else if (newOpenKeyInfo != null) {
         // isHSync is true and newOpenKeyInfo is set, update OpenKeyTable
         omMetadataManager.getOpenKeyTable(getBucketLayout()).addCacheEntry(
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java
index a23716d40d1..ffed1ebf555 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCommitRequestWithFSO.java
@@ -202,7 +202,9 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
             
Long.parseLong(keyToDelete.getMetadata().get(OzoneConsts.HSYNC_CLIENT_ID)));
         openKeyToDelete = OMFileRequest.getOmKeyInfoFromFileTable(true,
             omMetadataManager, dbOpenKeyToDeleteKey, keyName);
-        openKeyToDelete.getMetadata().put(OzoneConsts.OVERWRITTEN_HSYNC_KEY, 
"true");
+        openKeyToDelete = openKeyToDelete.toBuilder()
+            .addMetadata(OzoneConsts.OVERWRITTEN_HSYNC_KEY, "true")
+            .build();
         openKeyToDelete.setModificationTime(Time.now());
         openKeyToDelete.setUpdateID(trxnLogIndex);
         OMFileRequest.addOpenFileTableCacheEntry(omMetadataManager,
@@ -216,13 +218,15 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
       if (isHSync) {
         if (!OmKeyHSyncUtil.isHSyncedPreviously(omKeyInfo, clientIdString, 
dbOpenFileKey)) {
           // Update open key as well if it is the first hsync of this key
-          omKeyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID, 
clientIdString);
+          omKeyInfo = omKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(OzoneConsts.HSYNC_CLIENT_ID, 
clientIdString));
           newOpenKeyInfo = omKeyInfo.copyObject();
         }
       }
 
-      omKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf(
-          commitKeyArgs.getMetadataList()));
+      omKeyInfo = omKeyInfo.withMetadataMutations(metadata ->
+          metadata.putAll(KeyValueUtil.getFromProtobuf(
+              commitKeyArgs.getMetadataList())));
       omKeyInfo.setDataSize(commitKeyArgs.getDataSize());
 
       List<OmKeyLocationInfo> uncommitted =
@@ -275,9 +279,12 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
         long totalNamespace = 0;
         if (!oldVerKeyInfo.getOmKeyInfoList().isEmpty()) {
           oldKeyVersionsToDeleteMap.put(delKeyName, oldVerKeyInfo);
-          for (OmKeyInfo olderKeyVersions : oldVerKeyInfo.getOmKeyInfoList()) {
-            olderKeyVersions.setCommittedKeyDeletedFlag(true);
-            totalSize += sumBlockLengths(olderKeyVersions);
+          List<OmKeyInfo> oldKeys = oldVerKeyInfo.getOmKeyInfoList();
+          for (int i = 0; i < oldKeys.size(); i++) {
+            OmKeyInfo updatedOlderKeyVersions =
+                oldKeys.get(i).withCommittedKeyDeletedFlag(true);
+            oldKeys.set(i, updatedOlderKeyVersions);
+            totalSize += sumBlockLengths(updatedOlderKeyVersions);
             totalNamespace += 1;
           }
         }
@@ -322,9 +329,11 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
             dbOpenFileKey, null, fileName, keyName, trxnLogIndex);
 
         // Prevent hsync metadata from getting committed to the final key
-        omKeyInfo.getMetadata().remove(OzoneConsts.HSYNC_CLIENT_ID);
+        omKeyInfo = omKeyInfo.withMetadataMutations(
+            metadata -> metadata.remove(OzoneConsts.HSYNC_CLIENT_ID));
         if (isRecovery) {
-          omKeyInfo.getMetadata().remove(OzoneConsts.LEASE_RECOVERY);
+          omKeyInfo = omKeyInfo.withMetadataMutations(
+              metadata -> metadata.remove(OzoneConsts.LEASE_RECOVERY));
         }
       } else if (newOpenKeyInfo != null) {
         // isHSync is true and newOpenKeyInfo is set, update OpenKeyTable
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
index 5c2065356c0..fba766504e7 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequest.java
@@ -173,7 +173,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
         dbOpenKey = omMetadataManager.getOpenKey(volumeName, bucketName, 
keyName, hsyncClientId);
         OmKeyInfo openKeyInfo = openKeyTable.get(dbOpenKey);
         if (openKeyInfo != null) {
-          openKeyInfo.getMetadata().put(DELETED_HSYNC_KEY, "true");
+          openKeyInfo = openKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(DELETED_HSYNC_KEY, "true"));
           openKeyTable.addCacheEntry(dbOpenKey, openKeyInfo, trxnLogIndex);
           deletedOpenKeyInfo = openKeyInfo;
         } else {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java
index 75b5966e005..e2541ef051c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyDeleteRequestWithFSO.java
@@ -172,7 +172,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
         dbOpenKey = omMetadataManager.getOpenFileName(volumeId, bucketId, 
parentId, fileName, hsyncClientId);
         OmKeyInfo openKeyInfo = openKeyTable.get(dbOpenKey);
         if (openKeyInfo != null) {
-          openKeyInfo.getMetadata().put(DELETED_HSYNC_KEY, "true");
+          openKeyInfo = openKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(DELETED_HSYNC_KEY, "true"));
           openKeyTable.addCacheEntry(dbOpenKey, openKeyInfo, trxnLogIndex);
           deletedOpenKeyInfo = openKeyInfo;
         } else {
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 2317a481591..46cef44e1c5 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
@@ -980,10 +980,11 @@ protected OmKeyInfo prepareFileInfo(
       dbKeyInfo.setUpdateID(transactionLogIndex);
       dbKeyInfo.setReplicationConfig(replicationConfig);
 
-      // Construct a new metadata map from KeyArgs.
-      dbKeyInfo.getMetadata().clear();
-      dbKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf(
-          keyArgs.getMetadataList()));
+      // Construct a new metadata map from KeyArgs by rebuilding via toBuilder.
+      dbKeyInfo = dbKeyInfo.toBuilder()
+          .setMetadata(KeyValueUtil.getFromProtobuf(
+              keyArgs.getMetadataList()))
+          .build();
 
       // Construct a new tags from KeyArgs
       // Clear the old one when the key is overwritten
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
index 427b2978f9c..f0f447091ec 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
@@ -327,7 +327,8 @@ protected Pair<Long, Integer> 
markKeysAsDeletedInCache(OzoneManager ozoneManager
         String dbOpenKey = omMetadataManager.getOpenKey(volumeName, 
bucketName, keyName, hsyncClientId);
         OmKeyInfo openKeyInfo = openKeyTable.get(dbOpenKey);
         if (openKeyInfo != null) {
-          openKeyInfo.getMetadata().put(DELETED_HSYNC_KEY, "true");
+          openKeyInfo = openKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(DELETED_HSYNC_KEY, "true"));
           openKeyTable.addCacheEntry(dbOpenKey, openKeyInfo, trxnLogIndex);
           // Add to the map of open keys to be deleted.
           openKeyInfoMap.put(dbOpenKey, openKeyInfo);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OmKeysDeleteRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OmKeysDeleteRequestWithFSO.java
index 0dbaa3c9d7b..5d53ce7db09 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OmKeysDeleteRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OmKeysDeleteRequestWithFSO.java
@@ -116,7 +116,8 @@ protected Pair<Long, Integer> markKeysAsDeletedInCache(
         String dbOpenKey = omMetadataManager.getOpenFileName(volumeId, 
bucketId, parentId, fileName, hsyncClientId);
         OmKeyInfo openKeyInfo = openKeyTable.get(dbOpenKey);
         if (openKeyInfo != null) {
-          openKeyInfo.getMetadata().put(DELETED_HSYNC_KEY, "true");
+          openKeyInfo = openKeyInfo.withMetadataMutations(
+              metadata -> metadata.put(DELETED_HSYNC_KEY, "true"));
           openKeyTable.addCacheEntry(dbOpenKey, openKeyInfo, trxnLogIndex);
           // Add to the map of open keys to be deleted.
           openKeyInfoMap.put(dbOpenKey, openKeyInfo);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
index 5f715ded0b1..d2c3d76e35c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
@@ -161,8 +161,10 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
             openKey + "entry is not found in the openKey table",
             KEY_NOT_FOUND);
       }
-      omKeyInfo.getMetadata().putAll(KeyValueUtil.getFromProtobuf(
-          keyArgs.getMetadataList()));
+      omKeyInfo = omKeyInfo.toBuilder()
+          .addAllMetadata(KeyValueUtil.getFromProtobuf(
+              keyArgs.getMetadataList()))
+          .build();
 
       // set the data size and location info list
       omKeyInfo.setDataSize(keyArgs.getDataSize());
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
index 6d41da38087..d51055fdf2f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
@@ -519,11 +519,14 @@ protected OmKeyInfo getOmKeyInfo(long trxnLogIndex,
       omKeyInfo.setModificationTime(keyArgs.getModificationTime());
       omKeyInfo.setDataSize(dataSize);
       omKeyInfo.setReplicationConfig(dbOpenKeyInfo.getReplicationConfig());
+      final String multipartHash = multipartUploadedKeyHash(partKeyInfoMap);
+      OmKeyInfo.Builder omKeyInfoBuilder = omKeyInfo.toBuilder();
       if (dbOpenKeyInfo.getMetadata() != null) {
-        omKeyInfo.setMetadata(dbOpenKeyInfo.getMetadata());
+        omKeyInfoBuilder.setMetadata(dbOpenKeyInfo.getMetadata());
       }
-      omKeyInfo.getMetadata().put(OzoneConsts.ETAG,
-          multipartUploadedKeyHash(partKeyInfoMap));
+      omKeyInfo = omKeyInfoBuilder
+          .addMetadata(OzoneConsts.ETAG, multipartHash)
+          .build();
       if (dbOpenKeyInfo.getTags() != null) {
         omKeyInfo.setTags(dbOpenKeyInfo.getTags());
       }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/AbstractOMKeyDeleteResponse.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/AbstractOMKeyDeleteResponse.java
index e91bb403945..3b5c457cb26 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/AbstractOMKeyDeleteResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/AbstractOMKeyDeleteResponse.java
@@ -77,9 +77,9 @@ protected void addDeletionToBatch(
       // if RepeatedOMKeyInfo structure is null, we create a new instance,
       // if it is not null, then we simply add to the list and store this
       // instance in deletedTable.
-      omKeyInfo.setCommittedKeyDeletedFlag(isCommittedKey);
-      RepeatedOmKeyInfo repeatedOmKeyInfo = 
OmUtils.prepareKeyForDelete(bucketId,
-          omKeyInfo, omKeyInfo.getUpdateID()
+      omKeyInfo = omKeyInfo.withCommittedKeyDeletedFlag(isCommittedKey);
+      RepeatedOmKeyInfo repeatedOmKeyInfo = OmUtils.prepareKeyForDelete(
+          bucketId, omKeyInfo, omKeyInfo.getUpdateID()
       );
       String delKeyName = omMetadataManager.getOzoneDeletePathKey(
           omKeyInfo.getObjectID(), keyName);
@@ -124,9 +124,9 @@ protected void addDeletionToBatch(
       // if RepeatedOMKeyInfo structure is null, we create a new instance,
       // if it is not null, then we simply add to the list and store this
       // instance in deletedTable.
-      omKeyInfo.setCommittedKeyDeletedFlag(isCommittedKey);
-      RepeatedOmKeyInfo repeatedOmKeyInfo = 
OmUtils.prepareKeyForDelete(bucketId,
-          omKeyInfo, omKeyInfo.getUpdateID()
+      omKeyInfo = omKeyInfo.withCommittedKeyDeletedFlag(isCommittedKey);
+      RepeatedOmKeyInfo repeatedOmKeyInfo = OmUtils.prepareKeyForDelete(
+          bucketId, omKeyInfo, omKeyInfo.getUpdateID()
       );
       omMetadataManager.getDeletedTable().putWithBatch(
           batchOperation, deleteKeyName, repeatedOmKeyInfo);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java
index 1beddd25313..4671dd8c3c9 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/key/OMDirectoriesPurgeResponseWithFSO.java
@@ -157,8 +157,8 @@ public void processPaths(
       }
 
       for (OzoneManagerProtocolProtos.KeyInfo key : deletedSubFilesList) {
-        OmKeyInfo keyInfo = OmKeyInfo.getFromProtobuf(key);
-        keyInfo.setCommittedKeyDeletedFlag(true);
+        OmKeyInfo keyInfo = OmKeyInfo.getFromProtobuf(key)
+            .withCommittedKeyDeletedFlag(true);
         String ozoneDbKey = keySpaceOmMetadataManager.getOzonePathKey(volumeId,
             bucketId, keyInfo.getParentObjectID(), keyInfo.getFileName());
         keySpaceOmMetadataManager.getKeyTable(getBucketLayout())
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
index edfa51e7d02..aeb33a06e6e 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
@@ -560,15 +560,15 @@ private OMRequest doPreExecute(OMRequest 
originalOMRequest) throws Exception {
 
   String addToOpenFileTable(List<OmKeyLocationInfo> locationList, boolean 
hsyncFlag)
       throws Exception {
-    OmKeyInfo omKeyInfo = OMRequestTestUtils.createOmKeyInfo(volumeName,
+    OmKeyInfo.Builder keyInfoBuilder = 
OMRequestTestUtils.createOmKeyInfo(volumeName,
             bucketName, keyName, replicationConfig, new 
OmKeyLocationInfoGroup(version, new ArrayList<>(), false))
-        .setParentObjectID(parentId)
-        .build();
-    omKeyInfo.appendNewBlocks(locationList, false);
+        .setParentObjectID(parentId);
     if (hsyncFlag) {
-      omKeyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID,
+      keyInfoBuilder.addMetadata(OzoneConsts.HSYNC_CLIENT_ID,
           String.valueOf(clientID));
     }
+    OmKeyInfo omKeyInfo = keyInfoBuilder.build();
+    omKeyInfo.appendNewBlocks(locationList, false);
 
     OMRequestTestUtils.addFileToKeyTable(
         true, false, omKeyInfo.getFileName(),
@@ -585,15 +585,15 @@ bucketName, keyName, replicationConfig, new 
OmKeyLocationInfoGroup(version, new
 
   String addToFileTable(List<OmKeyLocationInfo> locationList, boolean 
hsyncFlag)
       throws Exception {
-    OmKeyInfo omKeyInfo = OMRequestTestUtils.createOmKeyInfo(volumeName,
+    OmKeyInfo.Builder keyInfoBuilder = 
OMRequestTestUtils.createOmKeyInfo(volumeName,
             bucketName, keyName, replicationConfig, new 
OmKeyLocationInfoGroup(version, new ArrayList<>(), false))
-        .setParentObjectID(parentId)
-        .build();
-    omKeyInfo.appendNewBlocks(locationList, false);
+        .setParentObjectID(parentId);
     if (hsyncFlag) {
-      omKeyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID,
+      keyInfoBuilder.addMetadata(OzoneConsts.HSYNC_CLIENT_ID,
           String.valueOf(clientID));
     }
+    OmKeyInfo omKeyInfo = keyInfoBuilder.build();
+    omKeyInfo.appendNewBlocks(locationList, false);
 
     OMRequestTestUtils.addFileToKeyTable(
         false, false, omKeyInfo.getFileName(),
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
index 78d30550e82..4b53233e98c 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
@@ -500,8 +500,7 @@ public void testOverwritingExistingMetadata(
     // We have to add the key to the key table, as validateAndUpdateCache only
     // updates the cache and not the DB.
     OmKeyInfo keyInfo = createOmKeyInfo(volumeName, bucketName, keyName,
-        replicationConfig).build();
-    keyInfo.setMetadata(initialMetadata);
+        replicationConfig).setMetadata(initialMetadata).build();
     omMetadataManager.getKeyTable(initialOmKeyCreateRequest.getBucketLayout())
         .put(getOzoneKey(), keyInfo);
 
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
index 20d142fdadb..ac691020f37 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRenameRequestWithFSO.java
@@ -80,8 +80,8 @@ public void createParentKey() throws Exception {
 
   @Test
   public void testRenameOpenFile() throws Exception {
-    fromKeyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID,
-        String.valueOf(1234));
+    fromKeyInfo = fromKeyInfo.withMetadataMutations(metadata ->
+        metadata.put(OzoneConsts.HSYNC_CLIENT_ID, String.valueOf(1234)));
     addKeyToTable(fromKeyInfo);
     OMRequest modifiedOmRequest =
         doPreExecute(createRenameKeyRequest(
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotUtils.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotUtils.java
index b956a11237b..aef6d97995e 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotUtils.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotUtils.java
@@ -60,17 +60,16 @@ private OmKeyInfo createOmKeyInfo(boolean hsync, 
OmKeyLocationInfoGroup group, l
   }
 
   private OmKeyInfo createOmKeyInfo(boolean hsync, 
List<OmKeyLocationInfoGroup> group, long objectId) {
-    OmKeyInfo keyInfo = new OmKeyInfo.Builder()
+    OmKeyInfo.Builder builder = new OmKeyInfo.Builder()
         .setVolumeName("vol")
         .setBucketName("bucket")
         .setKeyName("key")
         .setOmKeyLocationInfos(group)
-        .setObjectID(objectId)
-        .build();
+        .setObjectID(objectId);
     if (hsync) {
-      keyInfo.getMetadata().put(OzoneConsts.HSYNC_CLIENT_ID, "clientid");
+      builder.addMetadata(OzoneConsts.HSYNC_CLIENT_ID, "clientid");
     }
-    return keyInfo;
+    return builder.build();
   }
 
   @Test


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


Reply via email to