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]