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 601fd413a0 HDDS-10322. Make VolumeArgs immutable (#6193)
601fd413a0 is described below

commit 601fd413a02ba60bc621a2bb000f8261b35d2829
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu Feb 8 22:57:40 2024 +0100

    HDDS-10322. Make VolumeArgs immutable (#6193)
---
 .../org/apache/hadoop/ozone/client/VolumeArgs.java | 47 ++++++++++------------
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |  5 ++-
 .../ozone/AbstractRootedOzoneFileSystemTest.java   | 20 ++++-----
 .../om/snapshot/TestOzoneManagerSnapshotAcl.java   |  2 +-
 .../hadoop/ozone/client/ObjectStoreStub.java       |  3 +-
 5 files changed, 34 insertions(+), 43 deletions(-)

diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
index 9d683c5393..a1c9cd55bb 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/VolumeArgs.java
@@ -18,10 +18,13 @@
 
 package org.apache.hadoop.ozone.client;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.OzoneConsts;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -36,8 +39,8 @@ public final class VolumeArgs {
   private final String owner;
   private final long quotaInBytes;
   private final long quotaInNamespace;
-  private final List<OzoneAcl> acls;
-  private Map<String, String> metadata;
+  private final ImmutableList<OzoneAcl> acls;
+  private final ImmutableMap<String, String> metadata;
 
   /**
    * Private constructor, constructed via builder.
@@ -58,8 +61,8 @@ public final class VolumeArgs {
     this.owner = owner;
     this.quotaInBytes = quotaInBytes;
     this.quotaInNamespace = quotaInNamespace;
-    this.acls = acls;
-    this.metadata = metadata;
+    this.acls = acls == null ? ImmutableList.of() : ImmutableList.copyOf(acls);
+    this.metadata = metadata == null ? ImmutableMap.of() : 
ImmutableMap.copyOf(metadata);
   }
 
   /**
@@ -107,34 +110,20 @@ public final class VolumeArgs {
     return acls;
   }
 
-  /**
-   * Returns new builder class that builds a OmVolumeArgs.
-   *
-   * @return Builder
-   */
   public static VolumeArgs.Builder newBuilder() {
     return new VolumeArgs.Builder();
   }
 
   /**
-   * Builder for OmVolumeArgs.
+   * Builder for VolumeArgs.
    */
-  @SuppressWarnings("checkstyle:hiddenfield")
   public static class Builder {
     private String adminName;
     private String ownerName;
-    private long quotaInBytes;
-    private long quotaInNamespace;
-    private List<OzoneAcl> listOfAcls;
-    private Map<String, String> metadata = new HashMap<>();
-
-    /**
-     * Constructs a builder.
-     */
-    public Builder() {
-      quotaInBytes = OzoneConsts.QUOTA_RESET;
-      quotaInNamespace = OzoneConsts.QUOTA_RESET;
-    }
+    private long quotaInBytes = OzoneConsts.QUOTA_RESET;
+    private long quotaInNamespace = OzoneConsts.QUOTA_RESET;
+    private List<OzoneAcl> acls;
+    private Map<String, String> metadata;
 
     public VolumeArgs.Builder setAdmin(String admin) {
       this.adminName = admin;
@@ -157,12 +146,18 @@ public final class VolumeArgs {
     }
 
     public VolumeArgs.Builder addMetadata(String key, String value) {
+      if (metadata == null) {
+        metadata = new HashMap<>();
+      }
       metadata.put(key, value);
       return this;
     }
-    public VolumeArgs.Builder setAcls(List<OzoneAcl> acls)
+    public VolumeArgs.Builder addAcl(OzoneAcl acl)
         throws IOException {
-      this.listOfAcls = acls;
+      if (acls == null) {
+        acls = new ArrayList<>();
+      }
+      acls.add(acl);
       return this;
     }
 
@@ -172,7 +167,7 @@ public final class VolumeArgs {
      */
     public VolumeArgs build() {
       return new VolumeArgs(adminName, ownerName, quotaInBytes,
-          quotaInNamespace, listOfAcls, metadata);
+          quotaInNamespace, acls, metadata);
     }
   }
 
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 7e1e6fe456..8343b87401 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
@@ -430,8 +430,9 @@ public class RpcClient implements ClientProtocol {
     userGroups.stream().forEach((group) -> listOfAcls.add(
         new OzoneAcl(ACLIdentityType.GROUP, group, groupRights, ACCESS)));
     //ACLs from VolumeArgs
-    if (volArgs.getAcls() != null) {
-      listOfAcls.addAll(volArgs.getAcls());
+    List<OzoneAcl> volumeAcls = volArgs.getAcls();
+    if (volumeAcls != null) {
+      listOfAcls.addAll(volumeAcls);
     }
 
     OmVolumeArgs.Builder builder = OmVolumeArgs.newBuilder();
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java
index cb33970d87..8ee82633d5 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/AbstractRootedOzoneFileSystemTest.java
@@ -1185,18 +1185,14 @@ abstract class AbstractRootedOzoneFileSystemTest {
     BitSet aclRights = new BitSet();
     aclRights.set(READ.ordinal());
     aclRights.set(WRITE.ordinal());
-    List<OzoneAcl> objectAcls = new ArrayList<>();
-    objectAcls.add(new OzoneAcl(ACLIdentityType.WORLD, "",
-        aclRights, ACCESS));
-    objectAcls.add(new OzoneAcl(ACLIdentityType.USER, "admin", userRights,
-        ACCESS));
     // volume acls have all access to admin and read+write access to world
 
     // Construct VolumeArgs
-    VolumeArgs volumeArgs = new VolumeArgs.Builder()
+    VolumeArgs volumeArgs = VolumeArgs.newBuilder()
         .setAdmin("admin")
         .setOwner("admin")
-        .setAcls(Collections.unmodifiableList(objectAcls))
+        .addAcl(new OzoneAcl(ACLIdentityType.WORLD, "", aclRights, ACCESS))
+        .addAcl(new OzoneAcl(ACLIdentityType.USER, "admin", userRights, 
ACCESS))
         .setQuotaInNamespace(1000)
         .setQuotaInBytes(Long.MAX_VALUE).build();
     // Sanity check
@@ -1227,7 +1223,7 @@ abstract class AbstractRootedOzoneFileSystemTest {
     }
 
     // set acls for shared tmp mount under the tmp volume
-    objectAcls.clear();
+    List<OzoneAcl> objectAcls = new ArrayList<>();
     objectAcls.add(new OzoneAcl(ACLIdentityType.USER, "admin", userRights,
         ACCESS));
     aclRights.clear(DELETE.ordinal());
@@ -1302,8 +1298,8 @@ abstract class AbstractRootedOzoneFileSystemTest {
     OzoneAcl aclWorldAccess = new OzoneAcl(ACLIdentityType.WORLD, "",
         userRights, ACCESS);
     // Construct VolumeArgs
-    VolumeArgs volumeArgs = new VolumeArgs.Builder()
-        .setAcls(Collections.singletonList(aclWorldAccess))
+    VolumeArgs volumeArgs = VolumeArgs.newBuilder()
+        .addAcl(aclWorldAccess)
         .setQuotaInNamespace(1000).build();
     // Sanity check
     assertNull(volumeArgs.getOwner());
@@ -2303,8 +2299,8 @@ abstract class AbstractRootedOzoneFileSystemTest {
     OzoneAcl aclWorldAccess = new OzoneAcl(ACLIdentityType.WORLD, "",
         userRights, ACCESS);
     // Construct VolumeArgs, set ACL to world access
-    VolumeArgs volumeArgs = new VolumeArgs.Builder()
-        .setAcls(Collections.singletonList(aclWorldAccess))
+    VolumeArgs volumeArgs = VolumeArgs.newBuilder()
+        .addAcl(aclWorldAccess)
         .build();
     proxy.createVolume(volume, volumeArgs);
 
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
index 8c0b375c3c..e9b7e59b4f 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
@@ -630,7 +630,7 @@ public class TestOzoneManagerSnapshotAcl {
   private void createVolume() throws IOException {
     final String volumePrefix = "volume-";
     volumeName = volumePrefix + RandomStringUtils.randomNumeric(32);
-    final VolumeArgs volumeArgs = new VolumeArgs.Builder()
+    final VolumeArgs volumeArgs = VolumeArgs.newBuilder()
         .setAdmin(ADMIN)
         .setOwner(ADMIN)
         .build();
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ObjectStoreStub.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ObjectStoreStub.java
index b79e49f834..e9fb15e613 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ObjectStoreStub.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ObjectStoreStub.java
@@ -20,7 +20,6 @@
 package org.apache.hadoop.ozone.client;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -62,7 +61,7 @@ public class ObjectStoreStub extends ObjectStore {
             .setAdmin("root")
             .setOwner("root")
             .setQuotaInBytes(Integer.MAX_VALUE)
-            .setAcls(new ArrayList<>()).build());
+            .build());
   }
 
   @Override


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

Reply via email to