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 79b59457479 HDDS-13941. Introduce builder for list of ACLs (#9430)
79b59457479 is described below

commit 79b594574795cf42c6f52c4ce1468e8ad89280db
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Dec 9 07:46:39 2025 +0100

    HDDS-13941. Introduce builder for list of ACLs (#9430)
---
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |   9 +-
 .../hadoop/ozone/om/helpers/AclListBuilder.java    |  94 ++++++++++++++
 .../hadoop/ozone/om/helpers/OmVolumeArgs.java      |  92 ++++++-------
 .../hadoop/ozone/om/helpers/OzoneAclUtil.java      |   9 ++
 .../ozone/om/helpers/TestAclListBuilder.java       | 143 +++++++++++++++++++++
 .../hadoop/ozone/om/helpers/TestOmVolumeArgs.java  |  98 ++++++++------
 .../freon/containergenerator/GeneratorOm.java      |   4 +-
 .../om/TestOzoneManagerListVolumesSecure.java      |   4 +-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |   2 +-
 .../request/s3/tenant/OMTenantCreateRequest.java   |  17 +--
 .../om/request/volume/OMVolumeCreateRequest.java   |  23 ++--
 .../om/request/volume/acl/OMVolumeAclRequest.java  |  23 ++--
 .../request/volume/acl/OMVolumeAddAclRequest.java  |  10 +-
 .../volume/acl/OMVolumeRemoveAclRequest.java       |  10 +-
 .../request/volume/acl/OMVolumeSetAclRequest.java  |  12 +-
 .../ozone/security/acl/OzoneNativeAclTestUtil.java |  14 +-
 .../hadoop/ozone/recon/api/TestEndpoints.java      |   4 +-
 17 files changed, 415 insertions(+), 153 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 2cd7f11b3df..254f686eb24 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
@@ -454,14 +454,7 @@ public void createVolume(String volumeName, VolumeArgs 
volArgs)
     builder.setUsedNamespace(0L);
     builder.addAllMetadata(volArgs.getMetadata());
     //ACLs from VolumeArgs
-    List<OzoneAcl> volumeAcls = volArgs.getAcls();
-    if (volumeAcls != null) {
-      //Remove duplicates and add ACLs
-      for (OzoneAcl ozoneAcl :
-          volumeAcls.stream().distinct().collect(Collectors.toList())) {
-        builder.addOzoneAcls(ozoneAcl);
-      }
-    }
+    builder.acls().addAll(volArgs.getAcls());
 
     if (volArgs.getQuotaInBytes() == 0) {
       LOG.info("Creating Volume: {}, with {} as owner.", volumeName, owner);
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
new file mode 100644
index 00000000000..436885a83a7
--- /dev/null
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
@@ -0,0 +1,94 @@
+/*
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.om.helpers;
+
+import com.google.common.collect.ImmutableList;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import org.apache.hadoop.ozone.OzoneAcl;
+
+/** Helps incrementally build a list of ACLs. */
+public final class AclListBuilder {
+
+  /** The original list being built from, used if no changes are made, to 
reduce copying. */
+  private final ImmutableList<OzoneAcl> originalList;
+  /** The updated list being built, created lazily on the first modification. 
*/
+  private List<OzoneAcl> updatedList;
+  /** Whether any changes were made. */
+  private boolean changed;
+
+  public static AclListBuilder empty() {
+    return new AclListBuilder(ImmutableList.of());
+  }
+
+  public static AclListBuilder of(ImmutableList<OzoneAcl> list) {
+    return new AclListBuilder(list);
+  }
+
+  public static AclListBuilder copyOf(List<OzoneAcl> list) {
+    return new AclListBuilder(list == null ? ImmutableList.of() : 
ImmutableList.copyOf(list));
+  }
+
+  private AclListBuilder(ImmutableList<OzoneAcl> list) {
+    originalList = list;
+  }
+
+  public boolean isChanged() {
+    return changed;
+  }
+
+  public ImmutableList<OzoneAcl> build() {
+    return changed ? ImmutableList.copyOf(updatedList) : originalList;
+  }
+
+  public void add(@Nonnull OzoneAcl acl) {
+    Objects.requireNonNull(acl, "acl == null");
+    ensureInitialized();
+    changed |= OzoneAclUtil.addAcl(updatedList, acl);
+  }
+
+  public void addAll(@Nullable List<OzoneAcl> newAcls) {
+    if (newAcls == null || newAcls.isEmpty()) {
+      return;
+    }
+    ensureInitialized();
+    changed |= OzoneAclUtil.addAllAcl(updatedList, newAcls);
+  }
+
+  /** Set the list being built to {@code acls}.  For further mutations to 
work, it must be modifiable. */
+  public void set(@Nonnull List<OzoneAcl> acls) {
+    Objects.requireNonNull(acls, "acls == null");
+    changed |= !acls.equals(updatedList != null ? updatedList : originalList);
+    updatedList = acls;
+  }
+
+  public void remove(@Nonnull OzoneAcl acl) {
+    Objects.requireNonNull(acl, "acl == null");
+    ensureInitialized();
+    changed |= OzoneAclUtil.removeAcl(updatedList, acl);
+  }
+
+  private void ensureInitialized() {
+    if (updatedList == null) {
+      updatedList = new ArrayList<>(originalList);
+    }
+  }
+}
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
index 3b028d616e8..26a7fe63bd3 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
@@ -24,7 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.CopyOnWriteArrayList;
+import net.jcip.annotations.Immutable;
 import org.apache.hadoop.hdds.utils.db.Codec;
 import org.apache.hadoop.hdds.utils.db.CopyObject;
 import org.apache.hadoop.hdds.utils.db.DelegatedCodec;
@@ -38,9 +38,9 @@
 /**
  * A class that encapsulates the OmVolumeArgs Args.
  */
-// not yet @Immutable, needs HDDS-13941
+@Immutable
 public final class OmVolumeArgs extends WithObjectID
-    implements CopyObject<OmVolumeArgs>, Auditable {
+    implements CopyObject<OmVolumeArgs> {
   private static final Codec<OmVolumeArgs> CODEC = new DelegatedCodec<>(
       Proto2Codec.get(VolumeInfo.getDefaultInstance()),
       OmVolumeArgs::getFromProtobuf,
@@ -55,7 +55,7 @@ public final class OmVolumeArgs extends WithObjectID
   private final long quotaInBytes;
   private final long quotaInNamespace;
   private final long usedNamespace;
-  private final CopyOnWriteArrayList<OzoneAcl> acls;
+  private final ImmutableList<OzoneAcl> acls;
   /**
    * Reference count on this Ozone volume.
    *
@@ -78,7 +78,7 @@ private OmVolumeArgs(Builder b) {
     this.quotaInBytes = b.quotaInBytes;
     this.quotaInNamespace = b.quotaInNamespace;
     this.usedNamespace = b.usedNamespace;
-    this.acls = new CopyOnWriteArrayList<>(b.acls);
+    this.acls = b.acls.build();
     this.creationTime = b.creationTime;
     this.modificationTime = b.modificationTime;
     this.refCount = b.refCount;
@@ -93,18 +93,6 @@ public long getRefCount() {
     return refCount;
   }
 
-  public boolean addAcl(OzoneAcl ozoneAcl) {
-    return OzoneAclUtil.addAcl(acls, ozoneAcl);
-  }
-
-  public boolean setAcls(List<OzoneAcl> ozoneAcls) {
-    return OzoneAclUtil.setAcl(acls, ozoneAcls);
-  }
-
-  public boolean removeAcl(OzoneAcl ozoneAcl) {
-    return OzoneAclUtil.removeAcl(acls, ozoneAcl);
-  }
-
   /**
    * Returns the Admin Name.
    * @return String.
@@ -196,25 +184,6 @@ public static Builder newBuilder() {
     return new Builder();
   }
 
-  @Override
-  public Map<String, String> toAuditMap() {
-    Map<String, String> auditMap = new LinkedHashMap<>();
-    auditMap.put(OzoneConsts.ADMIN, this.adminName);
-    auditMap.put(OzoneConsts.OWNER, this.ownerName);
-    auditMap.put(OzoneConsts.VOLUME, this.volume);
-    auditMap.put(OzoneConsts.CREATION_TIME, String.valueOf(this.creationTime));
-    auditMap.put(OzoneConsts.MODIFICATION_TIME,
-        String.valueOf(this.modificationTime));
-    auditMap.put(OzoneConsts.QUOTA_IN_BYTES, 
String.valueOf(this.quotaInBytes));
-    auditMap.put(OzoneConsts.QUOTA_IN_NAMESPACE,
-        String.valueOf(this.quotaInNamespace));
-    auditMap.put(OzoneConsts.USED_NAMESPACE,
-        String.valueOf(this.usedNamespace));
-    auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.getObjectID()));
-    auditMap.put(OzoneConsts.UPDATE_ID, String.valueOf(this.getUpdateID()));
-    return auditMap;
-  }
-
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -235,7 +204,7 @@ public int hashCode() {
   /**
    * Builder for OmVolumeArgs.
    */
-  public static class Builder extends WithObjectID.Builder<OmVolumeArgs> {
+  public static class Builder extends WithObjectID.Builder<OmVolumeArgs> 
implements Auditable {
     private String adminName;
     private String ownerName;
     private String volume;
@@ -244,7 +213,7 @@ public static class Builder extends 
WithObjectID.Builder<OmVolumeArgs> {
     private long quotaInBytes;
     private long quotaInNamespace;
     private long usedNamespace;
-    private final List<OzoneAcl> acls;
+    private final AclListBuilder acls;
     private long refCount;
 
     @Override
@@ -263,10 +232,14 @@ public Builder setUpdateID(long id) {
      * Constructs a builder.
      */
     public Builder() {
-      this(new ArrayList<>());
+      this(AclListBuilder.empty());
     }
 
     private Builder(List<OzoneAcl> acls) {
+      this(AclListBuilder.copyOf(acls));
+    }
+
+    private Builder(AclListBuilder acls) {
       this.acls = acls;
       quotaInBytes = OzoneConsts.QUOTA_RESET;
       quotaInNamespace = OzoneConsts.QUOTA_RESET;
@@ -274,7 +247,7 @@ private Builder(List<OzoneAcl> acls) {
 
     private Builder(OmVolumeArgs omVolumeArgs) {
       super(omVolumeArgs);
-      this.acls = omVolumeArgs.acls;
+      this.acls = AclListBuilder.of(omVolumeArgs.acls);
       this.adminName = omVolumeArgs.adminName;
       this.ownerName = omVolumeArgs.ownerName;
       this.volume = omVolumeArgs.volume;
@@ -346,8 +319,22 @@ public Builder addAllMetadata(Map<String, String> 
additionalMetaData) {
       return this;
     }
 
-    public Builder addOzoneAcls(OzoneAcl acl) {
-      OzoneAclUtil.addAcl(acls, acl);
+    public AclListBuilder acls() {
+      return acls;
+    }
+
+    public Builder addAcl(OzoneAcl acl) {
+      acls.add(acl);
+      return this;
+    }
+
+    public Builder setAcls(List<OzoneAcl> newList) {
+      acls.set(newList);
+      return this;
+    }
+
+    public Builder removeAcl(OzoneAcl acl) {
+      acls.remove(acl);
       return this;
     }
 
@@ -385,6 +372,25 @@ protected void validate() {
     protected OmVolumeArgs buildObject() {
       return new OmVolumeArgs(this);
     }
+
+    @Override
+    public Map<String, String> toAuditMap() {
+      Map<String, String> auditMap = new LinkedHashMap<>();
+      auditMap.put(OzoneConsts.ADMIN, this.adminName);
+      auditMap.put(OzoneConsts.OWNER, this.ownerName);
+      auditMap.put(OzoneConsts.VOLUME, this.volume);
+      auditMap.put(OzoneConsts.CREATION_TIME, 
String.valueOf(this.creationTime));
+      auditMap.put(OzoneConsts.MODIFICATION_TIME,
+          String.valueOf(this.modificationTime));
+      auditMap.put(OzoneConsts.QUOTA_IN_BYTES, 
String.valueOf(this.quotaInBytes));
+      auditMap.put(OzoneConsts.QUOTA_IN_NAMESPACE,
+          String.valueOf(this.quotaInNamespace));
+      auditMap.put(OzoneConsts.USED_NAMESPACE,
+          String.valueOf(this.usedNamespace));
+      auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.getObjectID()));
+      auditMap.put(OzoneConsts.UPDATE_ID, String.valueOf(this.getUpdateID()));
+      return auditMap;
+    }
   }
 
   public VolumeInfo getProtobuf() {
@@ -442,6 +448,6 @@ public String getObjectInfo() {
 
   @Override
   public OmVolumeArgs copyObject() {
-    return toBuilder().build();
+    return this;
   }
 }
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
index d89f9282b7f..e2b3cd04db2 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
@@ -230,6 +230,15 @@ public static boolean addAcl(List<OzoneAcl> existingAcls, 
OzoneAcl acl) {
     return true;
   }
 
+  public static boolean addAllAcl(List<OzoneAcl> existingAcls, List<OzoneAcl> 
acls) {
+    // TOOD optimize
+    boolean changed = false;
+    for (OzoneAcl acl : acls) {
+      changed |= addAcl(existingAcls, acl);
+    }
+    return changed;
+  }
+
   /**
    * remove OzoneAcl from existing list of OzoneAcls.
    * @return true if current OzoneAcls are changed, false otherwise.
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
new file mode 100644
index 00000000000..d8f6cf41345
--- /dev/null
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
@@ -0,0 +1,143 @@
+/*
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.om.helpers;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.WRITE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class TestAclListBuilder {
+
+  private static final OzoneAcl ALICE_READ = OzoneAcl.of(USER, "alice", 
ACCESS, READ);
+  private static final OzoneAcl ALICE_WRITE = OzoneAcl.of(USER, "alice", 
ACCESS, WRITE);
+  private static final OzoneAcl ALICE_READ_WRITE = ALICE_READ.add(ALICE_WRITE);
+  private static final OzoneAcl BOB_READ = OzoneAcl.of(USER, "bob", ACCESS, 
READ);
+
+  public static Stream<List<OzoneAcl>> initialLists() {
+    return Stream.of(
+        emptyList(),
+        singletonList(ALICE_READ),
+        asList(ALICE_READ, ALICE_WRITE)
+    );
+  }
+
+  @Test
+  void returnsInitialListIfUnchanged() {
+    ImmutableList<OzoneAcl> list = ImmutableList.copyOf(asList(ALICE_READ, 
ALICE_WRITE));
+    AclListBuilder subject = AclListBuilder.of(list);
+
+    assertThat(subject.build())
+        .isSameAs(list);
+  }
+
+  @Test
+  void testAdd() {
+    testAdd(subject -> {
+      subject.add(ALICE_WRITE);
+      subject.add(BOB_READ);
+    });
+  }
+
+  @Test
+  void testAddAll() {
+    testAdd(subject -> subject.addAll(asList(ALICE_WRITE, BOB_READ)));
+  }
+
+  // op should be adding ALICE_WRITE and BOB_READ
+  private void testAdd(Consumer<AclListBuilder> op) {
+    AclListBuilder subject = AclListBuilder.copyOf(singletonList(ALICE_READ));
+
+    op.accept(subject);
+
+    assertThat(subject.isChanged())
+        .isTrue();
+    assertThat(subject.build())
+        .contains(ALICE_READ_WRITE)
+        .contains(BOB_READ)
+        .hasSize(2);
+  }
+
+  @ParameterizedTest
+  @MethodSource("initialLists")
+  void testSetSame(List<OzoneAcl> initialList) {
+    AclListBuilder subject = AclListBuilder.copyOf(initialList);
+
+    subject.set(initialList);
+
+    assertThat(subject.isChanged())
+        .isFalse();
+    assertThat(subject.build())
+        .isEqualTo(initialList);
+  }
+
+  @ParameterizedTest
+  @MethodSource("initialLists")
+  void testSetEqual(List<OzoneAcl> initialList) {
+    AclListBuilder subject = AclListBuilder.copyOf(initialList);
+
+    subject.set(new ArrayList<>(initialList));
+
+    assertThat(subject.isChanged())
+        .isFalse();
+    assertThat(subject.build())
+        .isEqualTo(initialList);
+  }
+
+  @ParameterizedTest
+  @MethodSource("initialLists")
+  void testSetDifferent(List<OzoneAcl> initialList) {
+    AclListBuilder subject = AclListBuilder.copyOf(initialList);
+    List<OzoneAcl> differentList = new ArrayList<>(initialList);
+    differentList.add(BOB_READ);
+
+    subject.set(differentList);
+
+    assertThat(subject.isChanged())
+        .isTrue();
+    assertThat(subject.build())
+        .isEqualTo(differentList);
+  }
+
+  @Test
+  void testRemove() {
+    AclListBuilder subject = AclListBuilder.copyOf(asList(ALICE_READ_WRITE, 
BOB_READ));
+
+    subject.remove(ALICE_WRITE);
+    subject.remove(BOB_READ);
+
+    assertThat(subject.isChanged())
+        .isTrue();
+    assertThat(subject.build())
+        .isEqualTo(singletonList(ALICE_READ));
+  }
+}
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
index de6df303b58..869d153b429 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
@@ -17,15 +17,21 @@
 
 package org.apache.hadoop.ozone.om.helpers;
 
+import static java.util.Collections.emptyList;
 import static org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.WRITE;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
 
+import java.io.IOException;
 import java.util.Collections;
 import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.hadoop.util.Time;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -33,54 +39,68 @@
  */
 public class TestOmVolumeArgs {
 
+  private static final OzoneAcl USER1_READ = OzoneAcl.of(USER, "user1", 
ACCESS, READ);
+  private static final OzoneAcl USER1_WRITE = OzoneAcl.of(USER, "user1", 
ACCESS, WRITE);
+  private static String user;
+
+  @BeforeAll
+  static void setup() throws IOException {
+    user = UserGroupInformation.getCurrentUser().getUserName();
+  }
+
   @Test
-  public void testClone() throws Exception {
-    String volumeName = "vol1";
-    String admin = "admin";
-    String owner = UserGroupInformation.getCurrentUser().getUserName();
-    OmVolumeArgs omVolumeArgs = new 
OmVolumeArgs.Builder().setVolume(volumeName)
-        .setAdminName(admin).setCreationTime(Time.now()).setOwnerName(owner)
-        .setObjectID(1L).setUpdateID(1L).setQuotaInBytes(Long.MAX_VALUE)
-        .addMetadata("key1", "value1").addMetadata("key2", "value2")
-        .addOzoneAcls(
-            OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.USER, "user1",
-                ACCESS, IAccessAuthorizer.ACLType.READ)).build();
-
-    OmVolumeArgs cloneVolumeArgs = omVolumeArgs.copyObject();
-
-    assertEquals(omVolumeArgs, cloneVolumeArgs);
+  public void testClone() {
+    OmVolumeArgs subject = createSubject();
+    assertSame(subject, subject.copyObject());
+  }
 
+  @Test
+  void addAcl() {
+    OmVolumeArgs omVolumeArgs = createSubject();
     // add user acl to write.
-    omVolumeArgs.addAcl(OzoneAcl.of(
-        IAccessAuthorizer.ACLIdentityType.USER, "user1",
-        ACCESS, IAccessAuthorizer.ACLType.WRITE));
+    OmVolumeArgs updated = omVolumeArgs.toBuilder()
+        .addAcl(USER1_WRITE)
+        .build();
+
+    assertNotEquals(omVolumeArgs.getAcls().get(0), updated.getAcls().get(0));
+  }
 
-    // Now check clone acl
-    assertNotEquals(cloneVolumeArgs.getAcls().get(0),
-        omVolumeArgs.getAcls().get(0));
+  @Test
+  void setAcls() {
+    OmVolumeArgs omVolumeArgs = createSubject();
 
     // Set user acl to Write_ACL.
-    omVolumeArgs.setAcls(Collections.singletonList(OzoneAcl.of(
-        IAccessAuthorizer.ACLIdentityType.USER, "user1",
-        ACCESS, IAccessAuthorizer.ACLType.WRITE_ACL)));
-
-    assertNotEquals(cloneVolumeArgs.getAcls().get(0),
-        omVolumeArgs.getAcls().get(0));
+    OmVolumeArgs updated = omVolumeArgs.toBuilder()
+        .setAcls(Collections.singletonList(USER1_WRITE))
+        .build();
 
-    // Now clone and check. It should have same as original acl.
-    cloneVolumeArgs = (OmVolumeArgs) omVolumeArgs.copyObject();
+    assertEquals(USER1_WRITE, updated.getAcls().get(0));
+    assertNotEquals(omVolumeArgs.getAcls().get(0), updated.getAcls().get(0));
+  }
 
-    assertEquals(omVolumeArgs, cloneVolumeArgs);
-    assertEquals(cloneVolumeArgs.getAcls().get(0),
-        omVolumeArgs.getAcls().get(0));
+  @Test
+  void removeAcl() {
+    OmVolumeArgs subject = createSubject();
 
-    omVolumeArgs.removeAcl(OzoneAcl.of(
-        IAccessAuthorizer.ACLIdentityType.USER, "user1",
-        ACCESS, IAccessAuthorizer.ACLType.WRITE_ACL));
+    OmVolumeArgs updated = subject.toBuilder()
+        .removeAcl(USER1_READ)
+        .build();
 
-    // Removing acl, in original omVolumeArgs it should have no acls.
-    assertEquals(0, omVolumeArgs.getAcls().size());
-    assertEquals(1, cloneVolumeArgs.getAcls().size());
+    assertEquals(emptyList(), updated.getAcls());
+  }
 
+  private static OmVolumeArgs createSubject() {
+    return new OmVolumeArgs.Builder()
+        .setVolume("vol1")
+        .setAdminName("admin")
+        .setCreationTime(Time.now())
+        .setOwnerName(user)
+        .setObjectID(1L)
+        .setUpdateID(1L)
+        .setQuotaInBytes(Long.MAX_VALUE)
+        .addMetadata("key1", "value1")
+        .addMetadata("key2", "value2")
+        .addAcl(USER1_READ)
+        .build();
   }
 }
diff --git 
a/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
 
b/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
index fe3752e4edf..05b498abb2f 100644
--- 
a/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
+++ 
b/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
@@ -141,10 +141,10 @@ private void writeOmBucketVolume() throws IOException {
         .setObjectID(1L)
         .setUpdateID(1L)
         .setQuotaInBytes(100L)
-        .addOzoneAcls(
+        .addAcl(
             OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.WORLD, "",
                 ACCESS, IAccessAuthorizer.ACLType.ALL))
-        .addOzoneAcls(
+        .addAcl(
             OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.USER, getUserId(),
                 ACCESS, IAccessAuthorizer.ACLType.ALL)
         ).build();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
index 6bf4a9fed83..906a1934ab0 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
@@ -220,8 +220,8 @@ private void setupEnvironment(boolean aclEnabled,
     String aclUser1All = "user:user1:a";
     String aclUser2All = "user:user2:a";
     String aclWorldAll = "world::a";
-    createVolumeWithOwnerAndAcl(omClient, "volume1", USER_1, aclUser1All);
-    createVolumeWithOwnerAndAcl(omClient, "volume2", USER_2, aclUser2All);
+    createVolumeWithOwnerAndAcl(omClient, "volume1", USER_1, null);
+    createVolumeWithOwnerAndAcl(omClient, "volume2", USER_2, null);
     createVolumeWithOwnerAndAcl(omClient, "volume3", USER_1, aclUser2All);
     createVolumeWithOwnerAndAcl(omClient, "volume4", USER_2, aclUser1All);
     createVolumeWithOwnerAndAcl(omClient, "volume5", USER_1, aclWorldAll);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 36d05e14074..19823796e70 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -4801,7 +4801,7 @@ private OmVolumeArgs createS3VolumeContext(String 
s3Volume,
 
     // Add ACLs
     for (OzoneAcl ozoneAcl : listOfAcls) {
-      omVolumeArgs.addOzoneAcls(ozoneAcl);
+      omVolumeArgs.addAcl(ozoneAcl);
     }
 
     return omVolumeArgs.build();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
index ab14c68dce2..0a9977ff785 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
@@ -219,7 +219,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
     OMClientResponse omClientResponse = null;
     final OMResponse.Builder omResponse =
         OmResponseUtil.getOMResponseBuilder(getOmRequest());
-    OmVolumeArgs omVolumeArgs = null;
+    OmVolumeArgs omVolumeArgs;
     boolean acquiredVolumeLock = false;
     boolean acquiredUserLock = false;
     final String owner = getOmRequest().getUserInfo().getUserName();
@@ -273,16 +273,17 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
           USER_LOCK, owner));
       acquiredUserLock = getOmLockDetails().isLockAcquired();
 
+      OmVolumeArgs.Builder volumeBuilder;
       PersistedUserVolumeInfo volumeList = null;
       if (!skipVolumeCreation) {
         // Create volume. TODO: dedup OMVolumeCreateRequest
-        omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo)
+        volumeBuilder = OmVolumeArgs.builderFromProtobuf(volumeInfo)
             .setQuotaInBytes(OzoneConsts.QUOTA_RESET)
             .setQuotaInNamespace(OzoneConsts.QUOTA_RESET)
             .setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex))
             .setUpdateID(transactionLogIndex)
-            .incRefCount()
-            .build();
+            .incRefCount();
+        omVolumeArgs = volumeBuilder.build();
 
         // Remove this check when vol ref count is also used by other features
         Preconditions.checkState(omVolumeArgs.getRefCount() == 1L,
@@ -298,10 +299,10 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
       } else {
         LOG.info("Skipped volume '{}' creation. "
             + "Will only increment volume refCount", volumeName);
-        omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName)
+        volumeBuilder = getVolumeInfo(omMetadataManager, volumeName)
             .toBuilder()
-            .incRefCount()
-            .build();
+            .incRefCount();
+        omVolumeArgs = volumeBuilder.build();
 
         // Remove this check when vol ref count is also used by other features
         Preconditions.checkState(omVolumeArgs.getRefCount() == 1L,
@@ -313,7 +314,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
       }
 
       // Audit
-      auditMap = omVolumeArgs.toAuditMap();
+      auditMap = volumeBuilder.toAuditMap();
 
       // Check tenant existence in tenantStateTable
       if (omMetadataManager.getTenantStateTable().isExist(tenantId)) {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
index 1c739cb4f99..3348037a62d 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
@@ -26,7 +26,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.stream.Collectors;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.audit.OMAction;
@@ -135,12 +134,11 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
       // when you create a volume, we set both Object ID and update ID.
       // The Object ID will never change, but update
       // ID will be set to transactionID each time we update the object.
-      omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo)
+      OmVolumeArgs.Builder builder = 
OmVolumeArgs.builderFromProtobuf(volumeInfo)
           .setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex))
-          .setUpdateID(transactionLogIndex)
-          .build();
+          .setUpdateID(transactionLogIndex);
 
-      auditMap = omVolumeArgs.toAuditMap();
+      auditMap = builder.toAuditMap();
       // acquire lock.
       mergeOmLockDetails(omMetadataManager.getLock().acquireWriteLock(
           VOLUME_LOCK, volume));
@@ -154,7 +152,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       PersistedUserVolumeInfo volumeList = null;
       if (omMetadataManager.getVolumeTable().isExist(dbVolumeKey)) {
-        LOG.debug("volume:{} already exists", omVolumeArgs.getVolume());
+        LOG.debug("volume:{} already exists", volume);
         throw new OMException("Volume already exists",
             OMException.ResultCodes.VOLUME_ALREADY_EXISTS);
       } else {
@@ -164,15 +162,16 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
             ozoneManager.getMaxUserVolumeCount(), transactionLogIndex);
 
         // Add default ACL for volume
-        List<OzoneAcl> listOfAcls = 
getDefaultAclList(UserGroupInformation.createRemoteUser(owner),
+        List<OzoneAcl> defaultAclList = 
getDefaultAclList(UserGroupInformation.createRemoteUser(owner),
             ozoneManager.getConfig());
         // ACLs from VolumeArgs
-        if (omVolumeArgs.getAcls() != null && 
!ozoneManager.getConfig().ignoreClientACLs()) {
-          listOfAcls.addAll(omVolumeArgs.getAcls());
+        if (ozoneManager.getConfig().ignoreClientACLs()) {
+          builder.acls().set(defaultAclList);
+        } else {
+          builder.acls().addAll(defaultAclList);
         }
-        // Remove the duplicates
-        listOfAcls = 
listOfAcls.stream().distinct().collect(Collectors.toList());
-        omVolumeArgs.setAcls(listOfAcls);
+
+        omVolumeArgs = builder.build();
 
         createVolume(omMetadataManager, omVolumeArgs, volumeList, dbVolumeKey,
             dbUserKey, transactionLogIndex);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
index 7eb070bbcf5..347fbefacd9 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
@@ -23,6 +23,7 @@
 import java.nio.file.InvalidPathException;
 import java.util.List;
 import java.util.Map;
+import java.util.function.BiConsumer;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
 import org.apache.hadoop.ozone.OzoneAcl;
@@ -31,8 +32,8 @@
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OMMetrics;
 import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
+import org.apache.hadoop.ozone.om.helpers.AclListBuilder;
 import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
 import org.apache.hadoop.ozone.om.request.volume.OMVolumeRequest;
 import org.apache.hadoop.ozone.om.response.OMClientResponse;
@@ -40,17 +41,15 @@
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
 import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
 import org.apache.hadoop.ozone.security.acl.OzoneObj;
-import org.apache.ratis.util.function.CheckedBiConsumer;
 
 /**
  * Base class for OMVolumeAcl Request.
  */
 public abstract class OMVolumeAclRequest extends OMVolumeRequest {
 
-  private final VolumeAclOp omVolumeAclOp;
+  private final AclOp omVolumeAclOp;
 
-  OMVolumeAclRequest(OzoneManagerProtocolProtos.OMRequest omRequest,
-      VolumeAclOp aclOp) {
+  OMVolumeAclRequest(OzoneManagerProtocolProtos.OMRequest omRequest, AclOp 
aclOp) {
     super(omRequest);
     omVolumeAclOp = aclOp;
   }
@@ -83,18 +82,14 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
           VOLUME_LOCK, volume));
       lockAcquired = getOmLockDetails().isLockAcquired();
       OmVolumeArgs omVolumeArgs = getVolumeInfo(omMetadataManager, volume);
+      OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder();
 
       // result is false upon add existing acl or remove non-existing acl
-      boolean applyAcl = true;
-      try {
-        omVolumeAclOp.accept(ozoneAcls, omVolumeArgs);
-      } catch (OMException ex) {
-        applyAcl = false;
-      }
+      omVolumeAclOp.accept(ozoneAcls, builder.acls());
+      boolean applyAcl = builder.acls().isChanged();
 
       // Update only when
       if (applyAcl) {
-        OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder();
         // Update the modification time when updating ACLs of Volume.
         if (getOmRequest().getAddAclRequest().hasObj()) {
           
builder.setModificationTime(getOmRequest().getAddAclRequest().getModificationTime());
@@ -194,8 +189,8 @@ abstract void onComplete(Result result, Exception ex, long 
trxnLogIndex,
   /**
    * Volume ACL operation.
    */
-  public interface VolumeAclOp extends
-      CheckedBiConsumer<List<OzoneAcl>, OmVolumeArgs, IOException> {
+  public interface AclOp extends
+      BiConsumer<List<OzoneAcl>, AclListBuilder> {
     // just a shortcut to avoid having to repeat long list of generic 
parameters
   }
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
index b1796c8779c..95f42d8ae39 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
@@ -17,7 +17,8 @@
 
 package org.apache.hadoop.ozone.om.request.volume.acl;
 
-import com.google.common.collect.Lists;
+import static java.util.Collections.singletonList;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -47,8 +48,8 @@ public class OMVolumeAddAclRequest extends OMVolumeAclRequest 
{
   private static final Logger LOG =
       LoggerFactory.getLogger(OMVolumeAddAclRequest.class);
 
-  private static final VolumeAclOp VOLUME_ADD_ACL_OP =
-      (acls, volArgs) -> volArgs.addAcl(acls.get(0));
+  private static final AclOp VOLUME_ADD_ACL_OP =
+      (acls, builder) -> builder.add(acls.get(0));
 
   private final List<OzoneAcl> ozoneAcls;
   private final String volumeName;
@@ -72,8 +73,7 @@ public OMVolumeAddAclRequest(OMRequest omRequest) {
     OzoneManagerProtocolProtos.AddAclRequest addAclRequest =
         getOmRequest().getAddAclRequest();
     Objects.requireNonNull(addAclRequest, "addAclRequest == null");
-    ozoneAcls = Lists.newArrayList(
-        OzoneAcl.fromProtobuf(addAclRequest.getAcl()));
+    ozoneAcls = singletonList(OzoneAcl.fromProtobuf(addAclRequest.getAcl()));
     obj = OzoneObjInfo.fromProtobuf(addAclRequest.getObj());
     volumeName = obj.getPath().substring(1);
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
index fee8c09f219..92e5a529b9b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
@@ -17,7 +17,8 @@
 
 package org.apache.hadoop.ozone.om.request.volume.acl;
 
-import com.google.common.collect.Lists;
+import static java.util.Collections.singletonList;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -47,8 +48,8 @@ public class OMVolumeRemoveAclRequest extends 
OMVolumeAclRequest {
   private static final Logger LOG =
       LoggerFactory.getLogger(OMVolumeRemoveAclRequest.class);
 
-  private static final VolumeAclOp VOLUME_REMOVE_ACL_OP =
-      (acls, volArgs) -> volArgs.removeAcl(acls.get(0));
+  private static final AclOp VOLUME_REMOVE_ACL_OP =
+      (acls, builder) -> builder.remove(acls.get(0));
 
   private final List<OzoneAcl> ozoneAcls;
   private final String volumeName;
@@ -72,8 +73,7 @@ public OMVolumeRemoveAclRequest(OMRequest omRequest) {
     OzoneManagerProtocolProtos.RemoveAclRequest removeAclRequest =
         getOmRequest().getRemoveAclRequest();
     Objects.requireNonNull(removeAclRequest, "removeAclRequest == null");
-    ozoneAcls = Lists.newArrayList(
-        OzoneAcl.fromProtobuf(removeAclRequest.getAcl()));
+    ozoneAcls = 
singletonList(OzoneAcl.fromProtobuf(removeAclRequest.getAcl()));
     obj = OzoneObjInfo.fromProtobuf(removeAclRequest.getObj());
     volumeName = obj.getPath().substring(1);
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
index e45d2234e1c..ac4fcfe393d 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
@@ -18,10 +18,10 @@
 package org.apache.hadoop.ozone.om.request.volume.acl;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.OMAction;
@@ -47,8 +47,8 @@ public class OMVolumeSetAclRequest extends OMVolumeAclRequest 
{
   private static final Logger LOG =
       LoggerFactory.getLogger(OMVolumeSetAclRequest.class);
 
-  private static final VolumeAclOp VOLUME_SET_ACL_OP =
-      (acls, volArgs) -> volArgs.setAcls(acls);
+  private static final AclOp VOLUME_SET_ACL_OP =
+      (acls, builder) -> builder.set(acls);
 
   private final List<OzoneAcl> ozoneAcls;
   private final String volumeName;
@@ -72,9 +72,9 @@ public OMVolumeSetAclRequest(OMRequest omRequest) {
     OzoneManagerProtocolProtos.SetAclRequest setAclRequest =
         getOmRequest().getSetAclRequest();
     Objects.requireNonNull(setAclRequest, "setAclRequest == null");
-    ozoneAcls = new ArrayList<>();
-    setAclRequest.getAclList().forEach(oai ->
-        ozoneAcls.add(OzoneAcl.fromProtobuf(oai)));
+    ozoneAcls = setAclRequest.getAclList().stream()
+        .map(OzoneAcl::fromProtobuf)
+        .collect(Collectors.toList());
     obj = OzoneObjInfo.fromProtobuf(setAclRequest.getObj());
     volumeName = obj.getPath().substring(1);
   }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
index 3468787b90c..cf6ea4450c6 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
@@ -39,9 +39,10 @@ public static void addVolumeAcl(
   ) throws IOException {
     final String volumeKey = metadataManager.getVolumeKey(volume);
     final Table<String, OmVolumeArgs> volumeTable = 
metadataManager.getVolumeTable();
-    final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey);
-
-    omVolumeArgs.addAcl(ozoneAcl);
+    final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey)
+        .toBuilder()
+        .addAcl(ozoneAcl)
+        .build();
 
     volumeTable.addCacheEntry(
         new CacheKey<>(volumeKey),
@@ -89,9 +90,10 @@ public static void setVolumeAcl(
       List<OzoneAcl> ozoneAcls) throws IOException {
     final String volumeKey = metadataManager.getVolumeKey(volume);
     final Table<String, OmVolumeArgs> volumeTable = 
metadataManager.getVolumeTable();
-    final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey);
-
-    omVolumeArgs.setAcls(ozoneAcls);
+    final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey)
+        .toBuilder()
+        .setAcls(ozoneAcls)
+        .build();
 
     volumeTable.addCacheEntry(
         new CacheKey<>(volumeKey),
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
index 9bb64f1ec37..280ff4210cd 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
@@ -483,12 +483,12 @@ public void setUp() throws Exception {
             .setQuotaInBytes(OzoneConsts.GB)
             .setQuotaInNamespace(1000)
             .setUsedNamespace(500)
-            .addOzoneAcls(OzoneAcl.of(
+            .addAcl(OzoneAcl.of(
                 IAccessAuthorizer.ACLIdentityType.USER,
                 "TestUser2",
                 OzoneAcl.AclScope.ACCESS, IAccessAuthorizer.ACLType.WRITE
             ))
-            .addOzoneAcls(OzoneAcl.of(
+            .addAcl(OzoneAcl.of(
                 IAccessAuthorizer.ACLIdentityType.USER,
                 "TestUser2",
                 OzoneAcl.AclScope.ACCESS, IAccessAuthorizer.ACLType.READ


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


Reply via email to