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 b69674c7f8 HDDS-10412. Prefix ACL check needs to resolve the bucket 
link (#6268)
b69674c7f8 is described below

commit b69674c7f89a92ab2ad066548495e42482bd97c2
Author: Ivan Andika <[email protected]>
AuthorDate: Tue Mar 5 19:56:16 2024 +0800

    HDDS-10412. Prefix ACL check needs to resolve the bucket link (#6268)
---
 .../hadoop/ozone/security/acl/OzoneObjInfo.java    | 10 +++
 .../dist/src/main/smoketest/basic/links.robot      | 15 ++++
 .../apache/hadoop/ozone/om/TestOzoneManagerHA.java | 11 +++
 .../ozone/om/TestOzoneManagerHAWithAllRunning.java | 86 +++++++++++++++++++++-
 .../apache/hadoop/ozone/om/OMMetadataManager.java  |  1 -
 .../apache/hadoop/ozone/om/BucketManagerImpl.java  |  3 +-
 .../org/apache/hadoop/ozone/om/KeyManagerImpl.java |  6 --
 .../apache/hadoop/ozone/om/OmMetadataReader.java   |  2 +-
 .../apache/hadoop/ozone/om/OmSnapshotManager.java  |  2 +-
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |  2 +-
 .../apache/hadoop/ozone/om/PrefixManagerImpl.java  | 54 +++++++++++---
 .../org/apache/hadoop/ozone/om/ResolvedBucket.java | 11 +++
 .../request/key/acl/prefix/OMPrefixAclRequest.java | 86 ++++++++++++----------
 .../key/acl/prefix/OMPrefixAddAclRequest.java      | 29 ++++----
 .../key/acl/prefix/OMPrefixRemoveAclRequest.java   | 21 +++---
 .../key/acl/prefix/OMPrefixSetAclRequest.java      | 21 +++---
 .../om/request/key/TestOMKeyCreateRequest.java     |  2 +-
 .../om/request/key/TestOMPrefixAclRequest.java     |  8 +-
 .../key/acl/prefix/TestOMPrefixAclResponse.java    | 23 +++++-
 19 files changed, 281 insertions(+), 112 deletions(-)

diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/acl/OzoneObjInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/acl/OzoneObjInfo.java
index 09c8743137..ca32c96855 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/acl/OzoneObjInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/security/acl/OzoneObjInfo.java
@@ -186,6 +186,16 @@ public final class OzoneObjInfo extends OzoneObj {
           .setResType(ResourceType.KEY);
     }
 
+    public static Builder fromOzoneObj(OzoneObj obj) {
+      return new Builder()
+          .setVolumeName(obj.getVolumeName())
+          .setBucketName(obj.getBucketName())
+          .setKeyName(obj.getKeyName())
+          .setResType(obj.getResourceType())
+          .setStoreType(obj.getStoreType())
+          .setOzonePrefixPath(obj.getOzonePrefixPathViewer());
+    }
+
     public Builder setResType(OzoneObj.ResourceType res) {
       this.resType = res;
       return this;
diff --git a/hadoop-ozone/dist/src/main/smoketest/basic/links.robot 
b/hadoop-ozone/dist/src/main/smoketest/basic/links.robot
index 09437aca24..d4d53c8d3c 100644
--- a/hadoop-ozone/dist/src/main/smoketest/basic/links.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/basic/links.robot
@@ -171,6 +171,21 @@ Source and target key have same ACLs
     Verify ACL          key    ${target}/link1/key1     GROUP   group2    READ
     Verify ACL          key    ${source}/bucket1/key1   GROUP   group2    READ
 
+Source and target prefix have same ACLs
+    Execute             ozone sh prefix addacl --acl user:user1:rwxy 
${source}/bucket1/prefix1/
+    Verify ACL          prefix       ${target}/link1/prefix1/     USER    
user1    READ WRITE READ_ACL WRITE_ACL
+    Verify ACL          prefix       ${source}/bucket1/prefix1/   USER    
user1    READ WRITE READ_ACL WRITE_ACL
+    Execute             ozone sh prefix removeacl --acl user:user1:y 
${target}/link1/prefix1/
+    Verify ACL          prefix       ${target}/link1/prefix1/     USER    
user1    READ WRITE READ_ACL
+    Verify ACL          prefix       ${source}/bucket1/prefix1/   USER    
user1    READ WRITE READ_ACL
+    Execute             ozone sh prefix setacl --acl user:user1:rw 
${source}/bucket1/prefix1/
+    Verify ACL          prefix       ${target}/link1/prefix1/     USER    
user1    READ WRITE
+    Verify ACL          prefix       ${source}/bucket1/prefix1/   USER    
user1    READ WRITE
+
+    Execute             ozone sh prefix addacl --acl group:group2:r 
${source}/bucket1/prefix1/
+    Verify ACL          prefix       ${target}/link1/prefix1/     GROUP   
group2    READ
+    Verify ACL          prefix       ${source}/bucket1/prefix1/   GROUP   
group2    READ
+
 Buckets and links share namespace
                         Execute                     ozone sh bucket link 
${source}/bucket2 ${target}/link2
     ${result} =         Execute And Ignore Error    ozone sh bucket create 
${target}/link2
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java
index 2c6ab49b21..ba0dabf47d 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java
@@ -40,6 +40,7 @@ import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
 import org.apache.hadoop.ozone.client.rpc.RpcClient;
 import org.apache.hadoop.ozone.om.ha.HadoopRpcOMFailoverProxyProvider;
 import org.apache.hadoop.ozone.om.ratis.OzoneManagerRatisServerConfig;
+import org.apache.hadoop.ozone.security.acl.OzoneObj;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Timeout;
@@ -47,6 +48,7 @@ import org.junit.jupiter.api.Timeout;
 import java.io.IOException;
 import java.net.ConnectException;
 import java.time.Duration;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.UUID;
 import java.util.HashMap;
@@ -61,6 +63,7 @@ import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_BLOCK_DELETING_SERVI
 import static 
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_CLIENT_FAILOVER_MAX_ATTEMPTS_KEY;
 
 import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
+import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_DEFAULT_BUCKET_LAYOUT;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_KEY_DELETING_LIMIT_PER_TASK;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -212,6 +215,14 @@ public abstract class TestOzoneManagerHA {
     ozoneOutputStream.close();
   }
 
+  public static String createPrefixName() {
+    return "prefix" + RandomStringUtils.randomNumeric(5) + OZONE_URI_DELIMITER;
+  }
+
+  public static void createPrefix(OzoneObj prefixObj) throws IOException {
+    assertTrue(objectStore.setAcl(prefixObj, Collections.emptyList()));
+  }
+
   protected OzoneBucket setupBucket() throws Exception {
     String userName = "user" + RandomStringUtils.randomNumeric(5);
     String adminName = "admin" + RandomStringUtils.randomNumeric(5);
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAWithAllRunning.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAWithAllRunning.java
index fbf80a8a87..8b63136adf 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAWithAllRunning.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHAWithAllRunning.java
@@ -70,6 +70,7 @@ import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.DIRE
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.FILE_ALREADY_EXISTS;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.PARTIAL_DELETE;
+import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.GROUP;
 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;
@@ -860,6 +861,79 @@ class TestOzoneManagerHAWithAllRunning extends 
TestOzoneManagerHA {
 
   }
 
+  @Test
+  void testLinkBucketAddPrefixAcl() throws Exception {
+    OzoneBucket srcBucket = setupBucket();
+    OzoneBucket linkedBucket = linkBucket(srcBucket);
+    String prefix = createPrefixName();
+    OzoneObj linkObj = buildPrefixObj(linkedBucket, prefix);
+    OzoneObj srcObj = buildPrefixObj(srcBucket, prefix);
+    createPrefix(linkObj);
+
+    String user1 = "remoteUser1";
+    OzoneAcl acl1 = new OzoneAcl(USER, user1, READ, DEFAULT);
+    testAddAcl(user1, linkObj, acl1);  // case1: set link acl
+    assertEqualsAcls(srcObj, linkObj);
+
+    String user2 = "remoteUser2";
+    OzoneAcl acl2 = new OzoneAcl(USER, user2, READ, DEFAULT);
+    testAddAcl(user2, srcObj, acl2);  // case2: set src acl
+    assertEqualsAcls(srcObj, linkObj);
+
+  }
+
+  @Test
+  void testLinkBucketRemovePrefixAcl() throws Exception {
+
+    // CASE 1: from link bucket
+    OzoneBucket srcBucket = setupBucket();
+    OzoneBucket linkedBucket = linkBucket(srcBucket);
+    String prefix = createPrefixName();
+    OzoneObj linkObj = buildPrefixObj(linkedBucket, prefix);
+    OzoneObj srcObj = buildPrefixObj(srcBucket, prefix);
+    createPrefix(linkObj);
+
+    String user = "remoteUser1";
+    OzoneAcl acl = new OzoneAcl(USER, user, READ, DEFAULT);
+    testRemoveAcl(user, linkObj, acl);
+    assertEqualsAcls(srcObj, linkObj);
+
+    // CASE 2: from src bucket
+    OzoneBucket srcBucket2 = setupBucket();
+    OzoneBucket linkedBucket2 = linkBucket(srcBucket2);
+    String prefix2 = createPrefixName();
+    OzoneObj linkObj2 = buildPrefixObj(linkedBucket2, prefix2);
+    OzoneObj srcObj2 = buildPrefixObj(srcBucket2, prefix2);
+    createPrefix(srcObj2);
+
+    String user2 = "remoteUser2";
+    OzoneAcl acl2 = new OzoneAcl(USER, user2, READ, DEFAULT);
+    testRemoveAcl(user2, srcObj2, acl2);
+    assertEqualsAcls(srcObj2, linkObj2);
+
+  }
+
+  @Test
+  void testLinkBucketSetPrefixAcl() throws Exception {
+    OzoneBucket srcBucket = setupBucket();
+    OzoneBucket linkedBucket = linkBucket(srcBucket);
+    String prefix = createPrefixName();
+    OzoneObj linkObj = buildPrefixObj(linkedBucket, prefix);
+    OzoneObj srcObj = buildPrefixObj(srcBucket, prefix);
+    createPrefix(linkObj);
+
+    String user1 = "remoteUser1";
+    OzoneAcl acl1 = new OzoneAcl(USER, user1, READ, DEFAULT);
+    testSetAcl(user1, linkObj, acl1);  // case1: set link acl
+    assertEqualsAcls(srcObj, linkObj);
+
+    String user2 = "remoteUser2";
+    OzoneAcl acl2 = new OzoneAcl(USER, user2, READ, DEFAULT);
+    testSetAcl(user2, srcObj, acl2);  // case2: set src acl
+    assertEqualsAcls(srcObj, linkObj);
+
+  }
+
   private OzoneObj buildBucketObj(OzoneBucket bucket) {
     return OzoneObjInfo.Builder.newBuilder()
         .setResType(OzoneObj.ResourceType.BUCKET)
@@ -990,8 +1064,16 @@ class TestOzoneManagerHAWithAllRunning extends 
TestOzoneManagerHA {
       OzoneAcl userAcl) throws Exception {
     ObjectStore objectStore = getObjectStore();
 
-    // As by default create will add some default acls in RpcClient.
-    List<OzoneAcl> acls = objectStore.getAcl(ozoneObj);
+    // Other than prefix, by default create will add some default acls in 
RpcClient.
+    List<OzoneAcl> acls;
+    if (ozoneObj.getResourceType().equals(OzoneObj.ResourceType.PREFIX)) {
+      objectStore.addAcl(ozoneObj, userAcl);
+      // Add another arbitrary group ACL since the prefix will be removed when 
removing
+      // the last ACL for the prefix and PREFIX_NOT_FOUND will be thrown
+      OzoneAcl groupAcl = new OzoneAcl(GROUP, "arbitrary-group", READ, ACCESS);
+      objectStore.addAcl(ozoneObj, groupAcl);
+    }
+    acls = objectStore.getAcl(ozoneObj);
 
     assertTrue(acls.size() > 0);
 
diff --git 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
index 9651c16175..0a2d258c7d 100644
--- 
a/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
+++ 
b/hadoop-ozone/interface-storage/src/main/java/org/apache/hadoop/ozone/om/OMMetadataManager.java
@@ -122,7 +122,6 @@ public interface OMMetadataManager extends DBStoreHAManager 
{
    * @param key    - key name
    * @return DB key as String.
    */
-
   String getOzoneKey(String volume, String bucket, String key);
 
   /**
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java
index 5bc894b2b9..68429c36d0 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/BucketManagerImpl.java
@@ -154,7 +154,8 @@ public class BucketManagerImpl implements BucketManager {
             && context.getAclRights() != ACLType.READ);
 
     if (bucketNeedResolved ||
-        ozObject.getResourceType() == OzoneObj.ResourceType.KEY) {
+        ozObject.getResourceType() == OzoneObj.ResourceType.KEY ||
+        ozObject.getResourceType() == OzoneObj.ResourceType.PREFIX) {
       try {
         ResolvedBucket resolvedBucket =
             ozoneManager.resolveBucketLink(
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
index af6b41b610..ffe1908c68 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
@@ -923,12 +923,6 @@ public class KeyManagerImpl implements KeyManager {
     return partName;
   }
 
-  /**
-   * Returns list of ACLs for given Ozone object.
-   *
-   * @param obj Ozone object.
-   * @throws IOException if there is error.
-   */
   @Override
   public List<OzoneAcl> getAcl(OzoneObj obj) throws IOException {
     validateOzoneObj(obj);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
index 7c332788d2..84a5148720 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataReader.java
@@ -387,7 +387,7 @@ public class OmMetadataReader implements IOmMetadataReader, 
Auditor {
     String volumeName = obj.getVolumeName();
     String bucketName = obj.getBucketName();
     String keyName = obj.getKeyName();
-    if (obj.getResourceType() == ResourceType.KEY) {
+    if (obj.getResourceType() == ResourceType.KEY || obj.getResourceType() == 
ResourceType.PREFIX) {
       ResolvedBucket resolvedBucket = ozoneManager.resolveBucketLink(
           Pair.of(volumeName, bucketName));
       volumeName = resolvedBucket.realVolume();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
index eb37e399df..602620743b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java
@@ -372,7 +372,7 @@ public final class OmSnapshotManager implements 
AutoCloseable {
         try {
           // create the other manager instances based on snapshot
           // metadataManager
-          PrefixManagerImpl pm = new PrefixManagerImpl(snapshotMetadataManager,
+          PrefixManagerImpl pm = new PrefixManagerImpl(ozoneManager, 
snapshotMetadataManager,
               false);
           KeyManagerImpl km = new KeyManagerImpl(ozoneManager,
               ozoneManager.getScmClient(), snapshotMetadataManager, conf,
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 b6bd57ff6f..b8133e5844 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
@@ -839,7 +839,7 @@ public final class OzoneManager extends 
ServiceRuntimeInfoImpl
       delegationTokenMgr = createDelegationTokenSecretManager(configuration);
     }
 
-    prefixManager = new PrefixManagerImpl(metadataManager, isRatisEnabled);
+    prefixManager = new PrefixManagerImpl(this, metadataManager, 
isRatisEnabled);
     keyManager = new KeyManagerImpl(this, scmClient, configuration,
         perfMetrics);
     accessAuthorizer = OzoneAuthorizerFactory.forOM(this);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java
index d801d1dbf3..097f354bbb 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/PrefixManagerImpl.java
@@ -18,6 +18,8 @@ package org.apache.hadoop.ozone.om;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
@@ -40,6 +42,7 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND;
+import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INTERNAL_ERROR;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.PREFIX_NOT_FOUND;
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.VOLUME_NOT_FOUND;
 import static 
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.PREFIX_LOCK;
@@ -53,6 +56,7 @@ public class PrefixManagerImpl implements PrefixManager {
       LoggerFactory.getLogger(PrefixManagerImpl.class);
 
   private static final List<OzoneAcl> EMPTY_ACL_LIST = new ArrayList<>();
+  private final OzoneManager ozoneManager;
   private final OMMetadataManager metadataManager;
 
   // In-memory prefix tree to optimize ACL evaluation
@@ -62,9 +66,10 @@ public class PrefixManagerImpl implements PrefixManager {
   //  where we integrate both HA and Non-HA code.
   private boolean isRatisEnabled;
 
-  public PrefixManagerImpl(OMMetadataManager metadataManager,
+  public PrefixManagerImpl(OzoneManager ozoneManager, OMMetadataManager 
metadataManager,
       boolean isRatisEnabled) {
     this.isRatisEnabled = isRatisEnabled;
+    this.ozoneManager = ozoneManager;
     this.metadataManager = metadataManager;
     loadPrefixTree();
   }
@@ -90,16 +95,11 @@ public class PrefixManagerImpl implements PrefixManager {
     return metadataManager;
   }
 
-  /**
-   * Returns list of ACLs for given Ozone object.
-   *
-   * @param obj Ozone object.
-   * @throws IOException if there is error.
-   */
   @Override
   public List<OzoneAcl> getAcl(OzoneObj obj) throws IOException {
     validateOzoneObj(obj);
-    String prefixPath = obj.getPath();
+    OzoneObj resolvedObj = getResolvedPrefixObj(obj);
+    String prefixPath = resolvedObj.getPath();
     metadataManager.getLock().acquireReadLock(PREFIX_LOCK, prefixPath);
     try {
       String longestPrefix = prefixTree.getLongestPrefix(prefixPath);
@@ -149,7 +149,14 @@ public class PrefixManagerImpl implements PrefixManager {
     Objects.requireNonNull(ozObject);
     Objects.requireNonNull(context);
 
-    String prefixPath = ozObject.getPath();
+    OzoneObj resolvedObj;
+    try {
+      resolvedObj = getResolvedPrefixObj(ozObject);
+    } catch (IOException e) {
+      throw new OMException("Failed to resolveBucketLink:", e, INTERNAL_ERROR);
+    }
+
+    String prefixPath = resolvedObj.getPath();
     metadataManager.getLock().acquireReadLock(PREFIX_LOCK, prefixPath);
     try {
       String longestPrefix = prefixTree.getLongestPrefix(prefixPath);
@@ -312,6 +319,7 @@ public class PrefixManagerImpl implements PrefixManager {
 
   public OMPrefixAclOpResult setAcl(OzoneObj ozoneObj, List<OzoneAcl> 
ozoneAcls,
       OmPrefixInfo prefixInfo, long transactionLogIndex) throws IOException {
+    boolean newPrefix = false;
     if (prefixInfo == null) {
       OmPrefixInfo.Builder prefixInfoBuilder =
           new OmPrefixInfo.Builder()
@@ -322,10 +330,13 @@ public class PrefixManagerImpl implements PrefixManager {
         prefixInfoBuilder.setUpdateID(transactionLogIndex);
       }
       prefixInfo = prefixInfoBuilder.build();
+      newPrefix = true;
     }
 
     boolean changed = prefixInfo.setAcls(ozoneAcls);
-    inheritParentAcl(ozoneObj, prefixInfo);
+    if (newPrefix) {
+      inheritParentAcl(ozoneObj, prefixInfo);
+    }
     prefixTree.insert(ozoneObj.getPath(), prefixInfo);
     if (!isRatisEnabled) {
       metadataManager.getPrefixTable().put(ozoneObj.getPath(), prefixInfo);
@@ -333,12 +344,31 @@ public class PrefixManagerImpl implements PrefixManager {
     return new OMPrefixAclOpResult(prefixInfo, changed);
   }
 
+  /**
+   * Get the resolved prefix object to handle prefix that is under a link 
bucket.
+   * @param obj prefix object
+   * @return the resolved prefix object if the object belongs under a link 
bucket.
+   * Otherwise, return the same prefix object.
+   * @throws IOException Exception thrown when resolving the bucket link.
+   */
+  public OzoneObj getResolvedPrefixObj(OzoneObj obj) throws IOException {
+    if (StringUtils.isEmpty(obj.getVolumeName()) || 
StringUtils.isEmpty(obj.getBucketName())) {
+      return obj;
+    }
+
+    ResolvedBucket resolvedBucket = ozoneManager.resolveBucketLink(
+        Pair.of(obj.getVolumeName(), obj.getBucketName()));
+    return resolvedBucket.update(obj);
+  }
+
   /**
    * Result of the prefix acl operation.
    */
   public static class OMPrefixAclOpResult {
-    private OmPrefixInfo omPrefixInfo;
-    private boolean operationsResult;
+    /** The updated prefix info after applying the prefix acl operation. */
+    private final OmPrefixInfo omPrefixInfo;
+    /** Operation result, success if the underlying ACL is changed, false 
otherwise. */
+    private final boolean operationsResult;
 
     public OMPrefixAclOpResult(OmPrefixInfo omPrefixInfo,
         boolean operationsResult) {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ResolvedBucket.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ResolvedBucket.java
index 9c304ac2f1..af1db8bad3 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ResolvedBucket.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ResolvedBucket.java
@@ -23,6 +23,8 @@ import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
+import org.apache.hadoop.ozone.security.acl.OzoneObj;
+import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -120,6 +122,15 @@ public class ResolvedBucket {
         : args;
   }
 
+  public OzoneObj update(OzoneObj ozoneObj) {
+    return isLink()
+        ? OzoneObjInfo.Builder.fromOzoneObj(ozoneObj)
+            .setVolumeName(realVolume())
+            .setBucketName(realBucket())
+            .build()
+        : ozoneObj;
+  }
+
   public boolean isLink() {
     return !Objects.equals(requestedVolume, realVolume)
         || !Objects.equals(requestedBucket, realBucket);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java
index 345886c050..a8490b1115 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAclRequest.java
@@ -33,9 +33,7 @@ import 
org.apache.hadoop.ozone.om.PrefixManagerImpl.OMPrefixAclOpResult;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
 import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
-import org.apache.hadoop.ozone.om.request.util.ObjectParser;
 import org.apache.hadoop.ozone.om.response.OMClientResponse;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
 import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
@@ -66,9 +64,8 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
 
     OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager();
     boolean lockAcquired = false;
-    String volume = null;
-    String bucket = null;
-    String key = null;
+    String prefixPath = null;
+    OzoneObj resolvedPrefixObj = null;
     OMPrefixAclOpResult operationResult = null;
     boolean opResult = false;
     Result result = null;
@@ -76,20 +73,17 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
     PrefixManagerImpl prefixManager =
         (PrefixManagerImpl) ozoneManager.getPrefixManager();
     try {
+      resolvedPrefixObj = prefixManager.getResolvedPrefixObj(getOzoneObj());
       prefixManager.validateOzoneObj(getOzoneObj());
-      String prefixPath = getOzoneObj().getPath();
-      validatePrefixPath(prefixPath);
-      ObjectParser objectParser = new ObjectParser(prefixPath,
-          OzoneManagerProtocolProtos.OzoneObj.ObjectType.PREFIX);
-      volume = objectParser.getVolume();
-      bucket = objectParser.getBucket();
-      key = objectParser.getKey();
+      validatePrefixPath(resolvedPrefixObj.getPath());
+      prefixPath = resolvedPrefixObj.getPath();
 
       // check Acl
       if (ozoneManager.getAclsEnabled()) {
         checkAcls(ozoneManager, OzoneObj.ResourceType.PREFIX,
             OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL,
-            volume, bucket, key);
+            resolvedPrefixObj.getVolumeName(), 
resolvedPrefixObj.getBucketName(),
+            resolvedPrefixObj.getPrefixName());
       }
 
       mergeOmLockDetails(omMetadataManager.getLock()
@@ -102,7 +96,7 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
       }
 
       try {
-        operationResult = apply(prefixManager, omPrefixInfo, trxnLogIndex);
+        operationResult = apply(resolvedPrefixObj, prefixManager, 
omPrefixInfo, trxnLogIndex);
       } catch (IOException ex) {
         // In HA case this will never happen.
         // As in add/remove/setAcl method we have logic to update database,
@@ -145,16 +139,21 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
     } finally {
       if (lockAcquired) {
         mergeOmLockDetails(omMetadataManager.getLock()
-            .releaseWriteLock(PREFIX_LOCK, getOzoneObj().getPath()));
+            .releaseWriteLock(PREFIX_LOCK, prefixPath));
       }
       if (omClientResponse != null) {
         omClientResponse.setOmLockDetails(getOmLockDetails());
       }
     }
 
-    OzoneObj obj = getOzoneObj();
+    OzoneObj obj = resolvedPrefixObj;
+    if (obj == null) {
+      // Fall back to the prefix under link bucket
+      obj = getOzoneObj();
+    }
+
     Map<String, String> auditMap = obj.toAuditMap();
-    onComplete(opResult, exception, ozoneManager.getMetrics(), result,
+    onComplete(obj, opResult, exception, ozoneManager.getMetrics(), result,
         trxnLogIndex, ozoneManager.getAuditLogger(), auditMap);
 
     return omClientResponse;
@@ -168,24 +167,26 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
   }
 
   /**
-   * Get the path name from the request.
-   * @return path name
+   * Get the prefix ozone object passed in the request.
+   * Note: The ozone object might still refer to a prefix under a link bucket 
which
+   *       might require to be resolved.
+   * @return Prefix ozone object.
    */
   abstract OzoneObj getOzoneObj();
 
   // TODO: Finer grain metrics can be moved to these callbacks. They can also
   // be abstracted into separate interfaces in future.
   /**
-   * Get the initial om response builder with lock.
-   * @return om response builder.
+   * Get the initial OM response builder with lock.
+   * @return OM response builder.
    */
   abstract OMResponse.Builder onInit();
 
   /**
-   * Get the om client response on success case with lock.
-   * @param omResponse
-   * @param omPrefixInfo
-   * @param operationResult
+   * Get the OM client response on success case with lock.
+   * @param omResponse OM response builder.
+   * @param omPrefixInfo The updated prefix info.
+   * @param operationResult The operation result. See {@link 
OMPrefixAclOpResult}.
    * @return OMClientResponse
    */
   abstract OMClientResponse onSuccess(
@@ -194,8 +195,8 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
 
   /**
    * Get the om client response on failure case with lock.
-   * @param omResponse
-   * @param exception
+   * @param omResponse OM response builder.
+   * @param exception Exception thrown while processing the request.
    * @return OMClientResponse
    */
   abstract OMClientResponse onFailure(OMResponse.Builder omResponse,
@@ -204,23 +205,28 @@ public abstract class OMPrefixAclRequest extends 
OMClientRequest {
   /**
    * Completion hook for final processing before return without lock.
    * Usually used for logging without lock and metric update.
-   * @param operationResult
-   * @param exception
-   * @param omMetrics
+   * @param resolvedOzoneObj Resolved prefix object in case the prefix is 
under a link bucket.
+   *                         The original ozone object if the prefix is not 
under a link bucket.
+   * @param operationResult The operation result. See {@link 
OMPrefixAclOpResult}.
+   * @param exception Exception thrown while processing the request.
+   * @param omMetrics OM metrics used to update the relevant metrics.
    */
-  abstract void onComplete(boolean operationResult, Exception exception,
-      OMMetrics omMetrics, Result result, long trxnLogIndex,
-      AuditLogger auditLogger, Map<String, String> auditMap);
+  @SuppressWarnings("checkstyle:ParameterNumber")
+  abstract void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult,
+                           Exception exception, OMMetrics omMetrics, Result 
result, long trxnLogIndex,
+                           AuditLogger auditLogger, Map<String, String> 
auditMap);
 
   /**
-   * Apply the acl operation, if successfully completed returns true,
-   * else false.
-   * @param prefixManager
-   * @param omPrefixInfo
-   * @param trxnLogIndex
-   * @throws IOException
+   * Apply the acl operation to underlying storage (prefix tree and table 
cache).
+   * @param resolvedOzoneObj Resolved prefix object in case the prefix is 
under a link bucket.
+   *                         The original ozone object if the prefix is not 
under a link bucket.
+   * @param prefixManager Prefix manager used to update the underlying prefix 
storage.
+   * @param omPrefixInfo Previous prefix info, null if there is no existing 
prefix info.
+   * @param trxnLogIndex Transaction log index.
+   * @return result of the prefix operation, see {@link OMPrefixAclOpResult}.
+   * @throws IOException Exception thrown when updating the underlying prefix 
storage.
    */
-  abstract OMPrefixAclOpResult apply(PrefixManagerImpl prefixManager,
+  abstract OMPrefixAclOpResult apply(OzoneObj resolvedOzoneObj, 
PrefixManagerImpl prefixManager,
       OmPrefixInfo omPrefixInfo, long trxnLogIndex) throws IOException;
 }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
index fe75928795..c290b08939 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixAddAclRequest.java
@@ -19,10 +19,8 @@
 package org.apache.hadoop.ozone.om.request.key.acl.prefix;
 
 import java.io.IOException;
-import java.util.List;
 import java.util.Map;
 
-import com.google.common.collect.Lists;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.OMAction;
@@ -55,8 +53,8 @@ public class OMPrefixAddAclRequest extends OMPrefixAclRequest 
{
   private static final Logger LOG =
       LoggerFactory.getLogger(OMPrefixAddAclRequest.class);
 
-  private OzoneObj ozoneObj;
-  private List<OzoneAcl> ozoneAcls;
+  private final OzoneObj ozoneObj;
+  private final OzoneAcl ozoneAcl;
 
   public OMPrefixAddAclRequest(OMRequest omRequest) {
     super(omRequest);
@@ -65,8 +63,7 @@ public class OMPrefixAddAclRequest extends OMPrefixAclRequest 
{
     // TODO: conversion of OzoneObj to protobuf can be avoided when we have
     //  single code path for HA and Non-HA
     ozoneObj = OzoneObjInfo.fromProtobuf(addAclRequest.getObj());
-    ozoneAcls = Lists.newArrayList(
-        OzoneAcl.fromProtobuf(addAclRequest.getAcl()));
+    ozoneAcl = OzoneAcl.fromProtobuf(addAclRequest.getAcl());
   }
 
   @Override
@@ -96,41 +93,41 @@ public class OMPrefixAddAclRequest extends 
OMPrefixAclRequest {
   }
 
   @Override
-  void onComplete(boolean operationResult, Exception exception,
+  void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult, 
Exception exception,
       OMMetrics omMetrics, Result result, long trxnLogIndex,
       AuditLogger auditLogger, Map<String, String> auditMap) {
     switch (result) {
     case SUCCESS:
       if (LOG.isDebugEnabled()) {
         if (operationResult) {
-          LOG.debug("Add acl: {} to path: {} success!", ozoneAcls,
-              ozoneObj.getPath());
+          LOG.debug("Add acl: {} to path: {} success!", ozoneAcl,
+              resolvedOzoneObj.getPath());
         } else {
           LOG.debug("Acl {} already exists in path {}",
-              ozoneAcls, ozoneObj.getPath());
+              ozoneAcl, resolvedOzoneObj.getPath());
         }
       }
       break;
     case FAILURE:
-      LOG.error("Add acl {} to path {} failed!", ozoneAcls,
-          ozoneObj.getPath(), exception);
+      LOG.error("Add acl {} to path {} failed!", ozoneAcl,
+          resolvedOzoneObj.getPath(), exception);
       break;
     default:
       LOG.error("Unrecognized Result for OMPrefixAddAclRequest: {}",
           getOmRequest());
     }
 
-    if (ozoneAcls != null) {
-      auditMap.put(OzoneConsts.ACL, ozoneAcls.toString());
+    if (ozoneAcl != null) {
+      auditMap.put(OzoneConsts.ACL, ozoneAcl.toString());
     }
     auditLog(auditLogger, buildAuditMessage(OMAction.ADD_ACL, auditMap,
         exception, getOmRequest().getUserInfo()));
   }
 
   @Override
-  OMPrefixAclOpResult apply(PrefixManagerImpl prefixManager,
+  OMPrefixAclOpResult apply(OzoneObj resolvedOzoneObj, PrefixManagerImpl 
prefixManager,
       OmPrefixInfo omPrefixInfo, long trxnLogIndex) throws IOException {
-    return prefixManager.addAcl(ozoneObj, ozoneAcls.get(0), omPrefixInfo,
+    return prefixManager.addAcl(resolvedOzoneObj, ozoneAcl, omPrefixInfo,
         trxnLogIndex);
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
index 67b7041216..7c2666944c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixRemoveAclRequest.java
@@ -45,15 +45,15 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRespo
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RemoveAclResponse;
 
 /**
- * Handle add Acl request for prefix.
+ * Handle remove Acl request for prefix.
  */
 public class OMPrefixRemoveAclRequest extends OMPrefixAclRequest {
 
   private static final Logger LOG =
       LoggerFactory.getLogger(OMPrefixRemoveAclRequest.class);
 
-  private OzoneObj ozoneObj;
-  private List<OzoneAcl> ozoneAcls;
+  private final OzoneObj ozoneObj;
+  private final List<OzoneAcl> ozoneAcls;
 
   public OMPrefixRemoveAclRequest(OMRequest omRequest) {
     super(omRequest);
@@ -93,25 +93,24 @@ public class OMPrefixRemoveAclRequest extends 
OMPrefixAclRequest {
   }
 
   @Override
-  void onComplete(boolean operationResult, Exception exception,
-      OMMetrics omMetrics, Result result, long trxnLogIndex,
+  void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult,
+      Exception exception, OMMetrics omMetrics, Result result, long 
trxnLogIndex,
       AuditLogger auditLogger, Map<String, String> auditMap) {
     switch (result) {
     case SUCCESS:
       if (LOG.isDebugEnabled()) {
         if (operationResult) {
           LOG.debug("Remove acl: {} to path: {} success!", ozoneAcls,
-              ozoneObj.getPath());
+              resolvedOzoneObj.getPath());
         } else {
           LOG.debug("Acl {} not removed from path {} as it does not exist",
-              ozoneAcls, ozoneObj.getPath());
+              ozoneAcls, resolvedOzoneObj.getPath());
         }
       }
       break;
     case FAILURE:
-      omMetrics.incNumBucketUpdateFails();
       LOG.error("Remove acl {} to path {} failed!", ozoneAcls,
-          ozoneObj.getPath(), exception);
+          resolvedOzoneObj.getPath(), exception);
       break;
     default:
       LOG.error("Unrecognized Result for OMPrefixRemoveAclRequest: {}",
@@ -126,9 +125,9 @@ public class OMPrefixRemoveAclRequest extends 
OMPrefixAclRequest {
   }
 
   @Override
-  OMPrefixAclOpResult apply(PrefixManagerImpl prefixManager,
+  OMPrefixAclOpResult apply(OzoneObj resolvedOzoneObj, PrefixManagerImpl 
prefixManager,
       OmPrefixInfo omPrefixInfo, long trxnLogIndex) throws IOException {
-    return prefixManager.removeAcl(ozoneObj, ozoneAcls.get(0), omPrefixInfo);
+    return prefixManager.removeAcl(resolvedOzoneObj, ozoneAcls.get(0), 
omPrefixInfo);
   }
 
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
index 6e93e8ffe5..11fc0d150e 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/acl/prefix/OMPrefixSetAclRequest.java
@@ -45,15 +45,15 @@ import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRespo
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.SetAclResponse;
 
 /**
- * Handle add Acl request for prefix.
+ * Handle set Acl request for prefix.
  */
 public class OMPrefixSetAclRequest extends OMPrefixAclRequest {
 
   private static final Logger LOG =
       LoggerFactory.getLogger(OMPrefixSetAclRequest.class);
 
-  private OzoneObj ozoneObj;
-  private List<OzoneAcl> ozoneAcls;
+  private final OzoneObj ozoneObj;
+  private final List<OzoneAcl> ozoneAcls;
 
   public OMPrefixSetAclRequest(OMRequest omRequest) {
     super(omRequest);
@@ -94,20 +94,19 @@ public class OMPrefixSetAclRequest extends 
OMPrefixAclRequest {
   }
 
   @Override
-  void onComplete(boolean operationResult, Exception exception,
-      OMMetrics omMetrics, Result result, long trxnLogIndex,
-      AuditLogger auditLogger, Map<String, String> auditMap) {
+  void onComplete(OzoneObj resolvedOzoneObj, boolean operationResult,
+      Exception exception, OMMetrics omMetrics, Result result,
+      long trxnLogIndex, AuditLogger auditLogger, Map<String, String> 
auditMap) {
     switch (result) {
     case SUCCESS:
       if (LOG.isDebugEnabled()) {
         LOG.debug("Set acl: {} to path: {} success!", ozoneAcls,
-            ozoneObj.getPath());
+            resolvedOzoneObj.getPath());
       }
       break;
     case FAILURE:
-      omMetrics.incNumBucketUpdateFails();
       LOG.error("Set acl {} to path {} failed!", ozoneAcls,
-          ozoneObj.getPath(), exception);
+          resolvedOzoneObj.getPath(), exception);
       break;
     default:
       LOG.error("Unrecognized Result for OMPrefixSetAclRequest: {}",
@@ -122,9 +121,9 @@ public class OMPrefixSetAclRequest extends 
OMPrefixAclRequest {
   }
 
   @Override
-  OMPrefixAclOpResult apply(PrefixManagerImpl prefixManager,
+  OMPrefixAclOpResult apply(OzoneObj resolvedOzoneObj, PrefixManagerImpl 
prefixManager,
       OmPrefixInfo omPrefixInfo, long trxnLogIndex) throws IOException {
-    return prefixManager.setAcl(ozoneObj, ozoneAcls, omPrefixInfo,
+    return prefixManager.setAcl(resolvedOzoneObj, ozoneAcls, omPrefixInfo,
         trxnLogIndex);
   }
 
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 f61e947d2b..83b491984e 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
@@ -426,7 +426,7 @@ public class TestOMKeyCreateRequest extends 
TestOMKeyRequest {
   @MethodSource("data")
   public void testValidateAndUpdateCacheWithInvalidPath(
       boolean setKeyPathLock, boolean setFileSystemPaths) throws Exception {
-    PrefixManager prefixManager = new PrefixManagerImpl(
+    PrefixManager prefixManager = new PrefixManagerImpl(ozoneManager,
         ozoneManager.getMetadataManager(), true);
     when(ozoneManager.getPrefixManager()).thenReturn(prefixManager);
     when(ozoneManager.getOzoneLockProvider()).thenReturn(
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMPrefixAclRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMPrefixAclRequest.java
index 9c5a925724..b2d495a423 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMPrefixAclRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMPrefixAclRequest.java
@@ -50,7 +50,7 @@ public class TestOMPrefixAclRequest extends TestOMKeyRequest {
 
   @Test
   public void testAddAclRequest() throws Exception {
-    PrefixManagerImpl prefixManager = new PrefixManagerImpl(
+    PrefixManagerImpl prefixManager = new PrefixManagerImpl(ozoneManager,
         ozoneManager.getMetadataManager(), true);
     when(ozoneManager.getPrefixManager()).thenReturn(prefixManager);
     String prefixName = UUID.randomUUID() + OZONE_URI_DELIMITER;
@@ -116,7 +116,7 @@ public class TestOMPrefixAclRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testValidationFailure() {
-    PrefixManagerImpl prefixManager = new PrefixManagerImpl(
+    PrefixManagerImpl prefixManager = new PrefixManagerImpl(ozoneManager,
         ozoneManager.getMetadataManager(), true);
     when(ozoneManager.getPrefixManager()).thenReturn(prefixManager);
 
@@ -143,7 +143,7 @@ public class TestOMPrefixAclRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testRemoveAclRequest() throws Exception {
-    PrefixManagerImpl prefixManager = new PrefixManagerImpl(
+    PrefixManagerImpl prefixManager = new PrefixManagerImpl(ozoneManager,
         ozoneManager.getMetadataManager(), true);
     when(ozoneManager.getPrefixManager()).thenReturn(prefixManager);
     String prefixName = UUID.randomUUID() + OZONE_URI_DELIMITER;
@@ -223,7 +223,7 @@ public class TestOMPrefixAclRequest extends 
TestOMKeyRequest {
 
   @Test
   public void testSetAclRequest() throws Exception {
-    PrefixManagerImpl prefixManager = new PrefixManagerImpl(
+    PrefixManagerImpl prefixManager = new PrefixManagerImpl(ozoneManager,
         ozoneManager.getMetadataManager(), true);
     when(ozoneManager.getPrefixManager()).thenReturn(prefixManager);
     String prefixName = UUID.randomUUID() + OZONE_URI_DELIMITER;
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/acl/prefix/TestOMPrefixAclResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/acl/prefix/TestOMPrefixAclResponse.java
index b12087785b..543266b51a 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/acl/prefix/TestOMPrefixAclResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/key/acl/prefix/TestOMPrefixAclResponse.java
@@ -17,8 +17,12 @@
 
 package org.apache.hadoop.ozone.om.response.key.acl.prefix;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.hadoop.ozone.OzoneAcl;
+import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.PrefixManagerImpl;
+import org.apache.hadoop.ozone.om.ResolvedBucket;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmPrefixInfo;
 import org.apache.hadoop.ozone.om.response.key.TestOMKeyResponse;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
@@ -36,6 +40,8 @@ import static 
org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
 import static 
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * Tests TestOMPrefixAclResponse.
@@ -77,13 +83,22 @@ public class TestOMPrefixAclResponse extends 
TestOMKeyResponse {
         .getSkipCache(prefixName);
     assertEquals(omPrefixInfo, persistedPrefixInfo);
 
+    String volumeName = "vol";
+    String bucketName = "buck";
+
+    OzoneManager ozoneManager = mock(OzoneManager.class);
+    when(ozoneManager.resolveBucketLink(Pair.of(volumeName, bucketName)))
+        .thenReturn(new ResolvedBucket(volumeName, bucketName, volumeName,
+            bucketName, "", BucketLayout.DEFAULT));
+
+
     // Verify that in-memory Prefix Tree (Radix Tree) is able to reload from
     // DB successfully
     PrefixManagerImpl prefixManager =
-        new PrefixManagerImpl(omMetadataManager, true);
+        new PrefixManagerImpl(ozoneManager, omMetadataManager, true);
     OzoneObj prefixObj = OzoneObjInfo.Builder.newBuilder()
-        .setVolumeName("vol")
-        .setBucketName("buck")
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
         .setPrefixName("prefix/")
         .setResType(OzoneObj.ResourceType.PREFIX)
         .setStoreType(OzoneObj.StoreType.OZONE)
@@ -123,7 +138,7 @@ public class TestOMPrefixAclResponse extends 
TestOMKeyResponse {
 
     // Reload prefix tree from DB and validate again.
     prefixManager =
-        new PrefixManagerImpl(omMetadataManager, true);
+        new PrefixManagerImpl(ozoneManager, omMetadataManager, true);
     prefixInfo = prefixManager.getPrefixInfo(prefixObj);
     assertEquals(2L, prefixInfo.getUpdateID());
 


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


Reply via email to