From 44fc1ddd905e748a50c6e1a59d7818fade5557b8 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Wed, 31 Jul 2019 17:58:01 -0700 Subject: [PATCH 01/14] HDDS-1884. Support Bucket addACL operations for OM HA. --- .../ozone/om/exceptions/OMException.java | 5 +- .../hadoop/ozone/om/helpers/OmBucketInfo.java | 43 ++++- .../src/main/proto/OzoneManagerProtocol.proto | 2 + .../hadoop/ozone/om/TestOzoneManagerHA.java | 44 +++++ .../ratis/utils/OzoneManagerRatisUtils.java | 20 +++ .../bucket/acl/OMBucketAddAclRequest.java | 151 ++++++++++++++++++ .../om/request/bucket/acl/package-info.java | 22 +++ .../ozone/om/request/util/ObjectParser.java | 73 +++++++++ .../ozone/om/request/util/package-info.java | 22 +++ .../bucket/acl/OMBucketAclResponse.java | 61 +++++++ .../om/response/bucket/acl/package-info.java | 22 +++ .../OzoneManagerHARequestHandlerImpl.java | 13 +- 12 files changed, 472 insertions(+), 6 deletions(-) create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/package-info.java diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java index 78bdb2139674b..1e291edfcdc4b 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/exceptions/OMException.java @@ -205,6 +205,9 @@ public enum ResultCodes { S3_BUCKET_INVALID_LENGTH, - RATIS_ERROR // Error in Ratis server + RATIS_ERROR, // Error in Ratis server + + INVALID_PATH_IN_ACL_REQUEST // Error code when path name is invalid during + // acl requests. } } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java index 51cabe66b144e..3990af3b33c60 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java @@ -18,6 +18,8 @@ package org.apache.hadoop.ozone.om.helpers; +import java.util.ArrayList; +import java.util.BitSet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -30,7 +32,8 @@ import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.OzoneConsts; import org.apache.hadoop.ozone.audit.Auditable; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.BucketInfo; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .BucketInfo; import org.apache.hadoop.ozone.protocolPB.OMPBHelper; import com.google.common.base.Preconditions; @@ -124,6 +127,44 @@ public List getAcls() { return acls; } + public boolean addAcl(OzoneAcl ozoneAcl) { + + // Case 1: When we are adding more rights to existing user/group. + boolean addToExistingAcl = false; + for(OzoneAcl existingAcl: getAcls()) { + if(existingAcl.getName().equals(ozoneAcl.getName()) && + existingAcl.getType().equals(ozoneAcl.getType())) { + + BitSet bits = (BitSet) ozoneAcl.getAclBitSet().clone(); + + // We need to do "or" before comparision because think of a case like + // existing acl is 777 and newly added acl is 444, we have already + // that acl set. In this case if we do direct check they will not + // be equal, but if we do or and then check, we shall know it + // has acl's already set or not. + bits.or(existingAcl.getAclBitSet()); + + if (bits.equals(existingAcl.getAclBitSet())) { + return false; + } else { + existingAcl.getAclBitSet().or(ozoneAcl.getAclBitSet()); + addToExistingAcl = true; + break; + } + } + } + + // Case 2: When a completely new acl is added. + if(!addToExistingAcl) { + List newAcls = getAcls(); + if(newAcls == null) { + newAcls = new ArrayList<>(); + } + newAcls.add(ozoneAcl); + } + return true; + } + /** * Returns true if bucket version is enabled, else false. * @return isVersionEnabled diff --git a/hadoop-ozone/common/src/main/proto/OzoneManagerProtocol.proto b/hadoop-ozone/common/src/main/proto/OzoneManagerProtocol.proto index 68e9f267abe8c..2fc78ae8e1c5f 100644 --- a/hadoop-ozone/common/src/main/proto/OzoneManagerProtocol.proto +++ b/hadoop-ozone/common/src/main/proto/OzoneManagerProtocol.proto @@ -283,6 +283,8 @@ enum Status { S3_BUCKET_INVALID_LENGTH = 51; // s3 bucket invalid length. RATIS_ERROR = 52; + + INVALID_PATH_IN_ACL_REQUEST = 53; // Invalid path name in acl request. } 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 92fc263cf957d..217a1115f42c3 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 @@ -19,11 +19,15 @@ import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.security.acl.OzoneObj; +import org.apache.hadoop.ozone.security.acl.OzoneObjInfo; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -65,6 +69,7 @@ import static org.apache.hadoop.ozone.MiniOzoneHAClusterImpl .NODE_FAILURE_TIMEOUT; +import static org.apache.hadoop.ozone.OzoneAcl.AclScope.DEFAULT; import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED; import static org.apache.hadoop.ozone.OzoneConfigKeys .OZONE_CLIENT_FAILOVER_MAX_ATTEMPTS_KEY; @@ -76,6 +81,8 @@ .OZONE_OPEN_KEY_EXPIRE_THRESHOLD_SECONDS; 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.security.acl.IAccessAuthorizer.ACLIdentityType.USER; +import static org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ; import static org.junit.Assert.fail; /** @@ -759,6 +766,43 @@ public void testReadRequest() throws Exception { } } + @Test + public void testAddBucketAcl() throws Exception { + OzoneBucket ozoneBucket = setupBucket(); + String remoteUserName = "remoteUser"; + OzoneAcl defaultUserAcl = new OzoneAcl(USER, remoteUserName, + READ, DEFAULT); + + OzoneObj ozoneObj = OzoneObjInfo.Builder.newBuilder() + .setResType(OzoneObj.ResourceType.BUCKET) + .setStoreType(OzoneObj.StoreType.OZONE) + .setVolumeName(ozoneBucket.getVolumeName()) + .setBucketName(ozoneBucket.getName()).build(); + + boolean addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); + Assert.assertTrue(addAcl); + + ozoneBucket.addAcls(Collections.singletonList(defaultUserAcl)); + List acls = ozoneBucket.getAcls(); + + Assert.assertTrue(containsAcl(defaultUserAcl, acls)); + + addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); + Assert.assertFalse(addAcl); + } + + private boolean containsAcl(OzoneAcl ozoneAcl, List ozoneAcls) { + for (OzoneAcl acl : ozoneAcls) { + if (acl.getType().equals(ozoneAcl.getType()) + && acl.getName().equals(ozoneAcl.getName()) + && acl.getAclBitSet().equals(ozoneAcl.getAclBitSet()) + && acl.getAclScope().equals(ozoneAcl.getAclScope())) { + return true; + } + } + return false; + } + @Test public void testOMRatisSnapshot() throws Exception { String userName = "user" + RandomStringUtils.randomNumeric(5); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java index aef189c02f247..c4c50e2f927b7 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java @@ -23,6 +23,7 @@ import org.apache.hadoop.ozone.om.request.bucket.OMBucketDeleteRequest; import org.apache.hadoop.ozone.om.request.bucket.OMBucketSetPropertyRequest; import org.apache.hadoop.ozone.om.request.OMClientRequest; +import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketAddAclRequest; import org.apache.hadoop.ozone.om.request.file.OMDirectoryCreateRequest; import org.apache.hadoop.ozone.om.request.file.OMFileCreateRequest; import org.apache.hadoop.ozone.om.request.key.OMAllocateBlockRequest; @@ -44,6 +45,8 @@ 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 + .OzoneObj.ObjectType; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Type; @@ -117,12 +120,29 @@ public static OMClientRequest createClientRequest(OMRequest omRequest) { return new S3MultipartUploadAbortRequest(omRequest); case CompleteMultiPartUpload: return new S3MultipartUploadCompleteRequest(omRequest); + case AddAcl: + return getOMAclRequest(omRequest); default: // TODO: will update once all request types are implemented. return null; } } + private static OMClientRequest getOMAclRequest(OMRequest omRequest) { + ObjectType type = omRequest.getAddAclRequest().getObj().getResType(); + Type cmdType = omRequest.getCmdType(); + if (ObjectType.BUCKET == type) { + if (Type.AddAcl == cmdType) { + return new OMBucketAddAclRequest(omRequest); + } else { + // TODO: remaining operations of acl needs to be supported + return null; + } + } + //TODO: handle key and prefix AddAcl + return null; + } + /** * Convert exception result to {@link OzoneManagerProtocolProtos.Status}. * @param exception diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java new file mode 100644 index 0000000000000..0a969b064689d --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -0,0 +1,151 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.om.request.bucket.acl; + +import java.io.IOException; + +import com.google.common.base.Optional; +import org.apache.hadoop.ozone.om.request.util.ObjectParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; +import org.apache.hadoop.ozone.om.request.OMClientRequest; +import org.apache.hadoop.ozone.om.response.OMClientResponse; +import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .AddAclRequest; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .AddAclResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .OMRequest; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .OMResponse; +import org.apache.hadoop.utils.db.cache.CacheKey; +import org.apache.hadoop.utils.db.cache.CacheValue; + +import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; + +/** + * Handle add Acl request for bucket. + */ +public class OMBucketAddAclRequest extends OMClientRequest { + + private static final Logger LOG = + LoggerFactory.getLogger(OMBucketAddAclRequest.class); + + public OMBucketAddAclRequest(OMRequest omRequest) { + super(omRequest); + } + + @Override + public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, + long transactionLogIndex, + OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper) { + + AddAclRequest addAclRequest = getOmRequest().getAddAclRequest(); + + OMResponse.Builder omResponse = OMResponse.newBuilder().setCmdType( + OzoneManagerProtocolProtos.Type.AddAcl).setStatus( + OzoneManagerProtocolProtos.Status.OK).setSuccess(true) + .setAddAclResponse(AddAclResponse.newBuilder() + .setResponse(true).build()); + + OzoneAcl ozoneAcl = OzoneAcl.fromProtobuf(addAclRequest.getAcl()); + + OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); + ozoneManager.getMetrics().incNumBucketUpdates(); + + boolean acquiredLock = false; + OMClientResponse omClientResponse = null; + IOException exception = null; + String volume = null; + String bucket = null; + try { + ObjectParser objectParser = + new ObjectParser(addAclRequest.getObj().getPath(), + addAclRequest.getObj().getResType()); + + volume= objectParser.getVolume(); + bucket = objectParser.getBucket(); + + acquiredLock = omMetadataManager.getLock().acquireLock(BUCKET_LOCK, + volume, bucket); + + String dbBucketKey = omMetadataManager.getBucketKey(volume, bucket); + + OmBucketInfo omBucketInfo = + omMetadataManager.getBucketTable().get(dbBucketKey); + + if (omBucketInfo == null) { + throw new OMException("Bucket " + bucket + " is not found", + BUCKET_NOT_FOUND); + } + + boolean addAcl = omBucketInfo.addAcl(ozoneAcl); + omResponse.setAddAclResponse(AddAclResponse.newBuilder() + .setResponse(addAcl).build()); + + if (addAcl) { + omMetadataManager.getBucketTable().addCacheEntry( + new CacheKey<>(dbBucketKey), + new CacheValue<>(Optional.of(omBucketInfo), transactionLogIndex)); + } + + omClientResponse = new OMBucketAclResponse(omBucketInfo, + omResponse.build()); + + } catch (IOException ex) { + exception = ex; + omClientResponse = new OMBucketAclResponse(null, + createErrorOMResponse(omResponse, exception)); + } finally { + if (omClientResponse != null) { + omClientResponse.setFlushFuture(ozoneManagerDoubleBufferHelper.add( + omClientResponse, transactionLogIndex)); + } + if (acquiredLock) { + omMetadataManager.getLock().releaseLock(BUCKET_LOCK, volume, bucket); + } + } + + // TODO: audit log + if (!omResponse.getAddAclResponse().getResponse()) { + LOG.warn("AddAcl is called to add an already exisiting ACL {} for " + + "bucket {} in volume {} ", ozoneAcl, bucket, volume); + } + if (exception == null) { + LOG.debug("AddAcl for bucket {} in volume {} is successful", bucket, + volume); + } else { + ozoneManager.getMetrics().incNumBucketUpdateFails(); + LOG.error("AddAcl for bucket {} in volume {} failed", bucket, volume, + exception); + } + + return omClientResponse; + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java new file mode 100644 index 0000000000000..77ee0e3d41aa8 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java @@ -0,0 +1,22 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This package contains classes for handling acl requests for bucket. + */ +package org.apache.hadoop.ozone.om.request.bucket.acl; \ No newline at end of file diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java new file mode 100644 index 0000000000000..f280b6fcbb58b --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.om.request.util; + +import com.google.common.base.Preconditions; +import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .OzoneObj.ObjectType; +import org.apache.hadoop.ozone.security.acl.OzoneObj; + +import static org.apache.hadoop.ozone.OzoneConsts.OZONE_URI_DELIMITER; + +/** + * Utility class to parse {@link OzoneObj#getPath()}. + */ +public class ObjectParser { + + private String volume; + private String bucket; + private String key; + + /** + * Parse the path and extract volume, bucket and key names. + * @param path + */ + public ObjectParser(String path, ObjectType objectType) throws OMException { + Preconditions.checkNotNull(path); + String[] tokens = StringUtils.split(path, OZONE_URI_DELIMITER, 3); + + if (objectType == ObjectType.VOLUME && tokens.length == 1) { + volume = tokens[0]; + } else if (objectType == ObjectType.BUCKET && tokens.length == 2) { + volume = tokens[0]; + bucket = tokens[1]; + } else if (objectType == ObjectType.KEY && tokens.length == 3) { + volume = tokens[0]; + bucket = tokens[1]; + key = tokens[3]; + } else { + throw new OMException("Illegal path " + path, + OMException.ResultCodes.INVALID_PATH_IN_ACL_REQUEST); + } + } + + public String getVolume() { + return volume; + } + + public String getBucket() { + return bucket; + } + + public String getKey() { + return key; + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java new file mode 100644 index 0000000000000..d80ee8906b0e1 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java @@ -0,0 +1,22 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Package contains helper/utility classes for requests. + */ +package org.apache.hadoop.ozone.om.request.util; \ No newline at end of file diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java new file mode 100644 index 0000000000000..d01628c3a788a --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java @@ -0,0 +1,61 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.om.response.bucket.acl; + +import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.response.OMClientResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos + .OMResponse; +import org.apache.hadoop.utils.db.BatchOperation; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; + +/** + * Response for Bucket acl request. + */ +public class OMBucketAclResponse extends OMClientResponse { + + private final OmBucketInfo omBucketInfo; + + public OMBucketAclResponse(@Nullable OmBucketInfo omBucketInfo, + @Nonnull OMResponse omResponse) { + super(omResponse); + this.omBucketInfo = omBucketInfo; + } + + @Override + public void addToDBBatch(OMMetadataManager omMetadataManager, + BatchOperation batchOperation) throws IOException { + + // If response status is OK and AddAclResponse is true, add to DB batch. + if (getOMResponse().getStatus() == OzoneManagerProtocolProtos.Status.OK && + getOMResponse().getAddAclResponse().getResponse()) { + String dbBucketKey = + omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), + omBucketInfo.getBucketName()); + omMetadataManager.getBucketTable().putWithBatch(batchOperation, + dbBucketKey, omBucketInfo); + } + } + +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/package-info.java new file mode 100644 index 0000000000000..dd262727e1feb --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/package-info.java @@ -0,0 +1,22 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This package contains classes for handling bucket acl responses. + */ +package org.apache.hadoop.ozone.om.response.bucket.acl; \ No newline at end of file diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java index f3f27a65a019f..ab6a73292b885 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java @@ -71,6 +71,7 @@ public OMResponse handleApplyTransaction(OMRequest omRequest, case CommitMultiPartUpload: case AbortMultiPartUpload: case CompleteMultiPartUpload: + case AddAcl: //TODO: We don't need to pass transactionID, this will be removed when // complete write requests is changed to new model. And also we can // return OMClientResponse, then adding to doubleBuffer can be taken @@ -78,10 +79,14 @@ public OMResponse handleApplyTransaction(OMRequest omRequest, // paths. OMClientRequest omClientRequest = OzoneManagerRatisUtils.createClientRequest(omRequest); - OMClientResponse omClientResponse = - omClientRequest.validateAndUpdateCache(getOzoneManager(), - transactionLogIndex, ozoneManagerDoubleBuffer::add); - return omClientResponse.getOMResponse(); + if (omClientRequest != null) { + OMClientResponse omClientResponse = + omClientRequest.validateAndUpdateCache(getOzoneManager(), + transactionLogIndex, ozoneManagerDoubleBuffer::add); + return omClientResponse.getOMResponse(); + } else { + return handle(omRequest); + } default: // As all request types are not changed so we need to call handle // here. From b84b7a45592e4a0061d9db6550ede4639f8c01f5 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Wed, 31 Jul 2019 21:49:26 -0700 Subject: [PATCH 02/14] fix find bug. --- .../org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java index 3990af3b33c60..88bcd933dc917 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java @@ -156,11 +156,7 @@ public boolean addAcl(OzoneAcl ozoneAcl) { // Case 2: When a completely new acl is added. if(!addToExistingAcl) { - List newAcls = getAcls(); - if(newAcls == null) { - newAcls = new ArrayList<>(); - } - newAcls.add(ozoneAcl); + getAcls().add(ozoneAcl); } return true; } From 3f85616167874f50ce57dd00030189bfdc3e968e Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 17:38:43 -0700 Subject: [PATCH 03/14] HDDS-1884. Support Bucket ACL operations for OM HA. --- .../hadoop/ozone/om/helpers/OmBucketInfo.java | 60 +++++- .../main/compose/ozone-om-ha/docker-config | 2 +- .../hadoop/ozone/om/TestOzoneManagerHA.java | 109 ++++++++++- .../ratis/utils/OzoneManagerRatisUtils.java | 26 ++- .../bucket/acl/OMBucketAclRequest.java | 185 ++++++++++++++++++ .../bucket/acl/OMBucketAddAclRequest.java | 154 ++++++--------- .../bucket/acl/OMBucketRemoveAclRequest.java | 99 ++++++++++ .../bucket/acl/OMBucketSetAclRequest.java | 100 ++++++++++ .../ozone/om/request/util/BiFunction.java | 10 + .../OzoneManagerHARequestHandlerImpl.java | 2 + 10 files changed, 641 insertions(+), 106 deletions(-) create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java create mode 100644 hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java index 88bcd933dc917..86a1b21f159bd 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.BitSet; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -38,6 +39,8 @@ import com.google.common.base.Preconditions; +import static org.apache.hadoop.ozone.OzoneAcl.ZERO_BITSET; + /** * A class that encapsulates Bucket Info. */ @@ -127,8 +130,13 @@ public List getAcls() { return acls; } + /** + * Add an ozoneAcl to list of existing Acl set. + * @param ozoneAcl + * @return true - if successfully added, false if not added or acl is + * already existing in the acl list. + */ public boolean addAcl(OzoneAcl ozoneAcl) { - // Case 1: When we are adding more rights to existing user/group. boolean addToExistingAcl = false; for(OzoneAcl existingAcl: getAcls()) { @@ -161,6 +169,56 @@ public boolean addAcl(OzoneAcl ozoneAcl) { return true; } + /** + * Remove acl from existing acl list. + * @param ozoneAcl + * @return true - if successfully removed, false if not able to remove due + * to that acl is not in the existing acl list. + */ + public boolean removeAcl(OzoneAcl ozoneAcl) { + boolean removed = false; + + // When we are removing subset of rights from existing acl. + for(OzoneAcl existingAcl: getAcls()) { + if (existingAcl.getName().equals(ozoneAcl.getName()) && + existingAcl.getType().equals(ozoneAcl.getType())) { + BitSet bits = (BitSet) ozoneAcl.getAclBitSet().clone(); + bits.and(existingAcl.getAclBitSet()); + + // This happens when the acl bitset is not existing for current name + // and type. + // Like a case we have 444 permission, 333 is asked to removed. + if (bits.equals(ZERO_BITSET)) { + return false; + } + + // We have some matching. Remove them. + existingAcl.getAclBitSet().xor(bits); + + // If existing acl has same bitset as passed acl bitset, remove that + // acl from the list + if (existingAcl.getAclBitSet().equals(ZERO_BITSET)) { + getAcls().remove(existingAcl); + } + removed = true; + break; + } + } + + return removed; + } + + /** + * Reset the existing acl list. + * @param ozoneAcls + * @return true - if successfully able to reset. + */ + public boolean setAcls(List ozoneAcls) { + this.acls.clear(); + this.acls = ozoneAcls; + return true; + } + /** * Returns true if bucket version is enabled, else false. * @return isVersionEnabled diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config index 6bebfdf8686c3..dcc3e5cfdd343 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config @@ -18,7 +18,7 @@ OZONE-SITE.XML_ozone.om.nodes=om1,om2,om3 OZONE-SITE.XML_ozone.om.address.om1=om1 OZONE-SITE.XML_ozone.om.address.om2=om2 OZONE-SITE.XML_ozone.om.address.om3=om3 -OZONE-SITE.XML_ozone.om.ratis.enable=true +OZONE-SITE.XMiL_ozone.om.ratis.enable=true OZONE-SITE.XML_ozone.scm.names=scm OZONE-SITE.XML_ozone.enabled=True OZONE-SITE.XML_ozone.scm.datanode.id.dir=/data 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 217a1115f42c3..65cabc33f7afc 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 @@ -19,6 +19,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; +import java.util.BitSet; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -83,6 +84,7 @@ import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.NOT_A_FILE; import static org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER; import static org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ; +import static org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.WRITE; import static org.junit.Assert.fail; /** @@ -783,20 +785,117 @@ public void testAddBucketAcl() throws Exception { Assert.assertTrue(addAcl); ozoneBucket.addAcls(Collections.singletonList(defaultUserAcl)); - List acls = ozoneBucket.getAcls(); + List acls = objectStore.getAcl(ozoneObj); Assert.assertTrue(containsAcl(defaultUserAcl, acls)); + // Add an already existing acl. addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); Assert.assertFalse(addAcl); + + // Add an acl by changing acl type with same type, name and scope. + defaultUserAcl = new OzoneAcl(USER, remoteUserName, + WRITE, DEFAULT); + addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); + Assert.assertTrue(addAcl); + } + + @Test + public void testRemoveBucketAcl() throws Exception { + OzoneBucket ozoneBucket = setupBucket(); + String remoteUserName = "remoteUser"; + OzoneAcl defaultUserAcl = new OzoneAcl(USER, remoteUserName, + READ, DEFAULT); + + OzoneObj ozoneObj = OzoneObjInfo.Builder.newBuilder() + .setResType(OzoneObj.ResourceType.BUCKET) + .setStoreType(OzoneObj.StoreType.OZONE) + .setVolumeName(ozoneBucket.getVolumeName()) + .setBucketName(ozoneBucket.getName()).build(); + + // As by default create bucket we add some default acls in RpcClient. + List acls = objectStore.getAcl(ozoneObj); + + Assert.assertTrue(acls.size() > 0); + + // Remove an existing acl. + boolean removeAcl = objectStore.removeAcl(ozoneObj, acls.get(0)); + Assert.assertTrue(removeAcl); + + // Trying to remove an already removed acl. + removeAcl = objectStore.removeAcl(ozoneObj, acls.get(0)); + Assert.assertFalse(removeAcl); + + boolean addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); + Assert.assertTrue(addAcl); + + // Just changed acl type here to write, rest all is same as defaultUserAcl. + OzoneAcl modifiedUserAcl = new OzoneAcl(USER, remoteUserName, + WRITE, DEFAULT); + addAcl = objectStore.addAcl(ozoneObj, modifiedUserAcl); + Assert.assertTrue(addAcl); + + removeAcl = objectStore.removeAcl(ozoneObj, modifiedUserAcl); + Assert.assertTrue(removeAcl); + + removeAcl = objectStore.removeAcl(ozoneObj, defaultUserAcl); + Assert.assertTrue(removeAcl); + + } + + @Test + public void testSetBucketAcl() throws Exception { + OzoneBucket ozoneBucket = setupBucket(); + String remoteUserName = "remoteUser"; + OzoneAcl defaultUserAcl = new OzoneAcl(USER, remoteUserName, + READ, DEFAULT); + + OzoneObj ozoneObj = OzoneObjInfo.Builder.newBuilder() + .setResType(OzoneObj.ResourceType.BUCKET) + .setStoreType(OzoneObj.StoreType.OZONE) + .setVolumeName(ozoneBucket.getVolumeName()) + .setBucketName(ozoneBucket.getName()).build(); + + // As by default create bucket we add some default acls in RpcClient. + List acls = objectStore.getAcl(ozoneObj); + + Assert.assertTrue(acls.size() > 0); + + OzoneAcl modifiedUserAcl = new OzoneAcl(USER, remoteUserName, + WRITE, DEFAULT); + + List newAcls = Collections.singletonList(modifiedUserAcl); + boolean setAcl = objectStore.setAcl(ozoneObj, newAcls); + Assert.assertTrue(setAcl); + + // Get acls and check whether they are reset or not. + List getAcls = objectStore.getAcl(ozoneObj); + + Assert.assertTrue(newAcls.size() == getAcls.size()); + int i = 0; + for (OzoneAcl ozoneAcl : newAcls) { + Assert.assertTrue(compareAcls(getAcls.get(i++), ozoneAcl)); + } } private boolean containsAcl(OzoneAcl ozoneAcl, List ozoneAcls) { for (OzoneAcl acl : ozoneAcls) { - if (acl.getType().equals(ozoneAcl.getType()) - && acl.getName().equals(ozoneAcl.getName()) - && acl.getAclBitSet().equals(ozoneAcl.getAclBitSet()) - && acl.getAclScope().equals(ozoneAcl.getAclScope())) { + boolean result = compareAcls(ozoneAcl, acl); + if (result) { + // We found a match, return. + return result; + } + } + return false; + } + + private boolean compareAcls(OzoneAcl givenAcl, OzoneAcl existingAcl) { + if (givenAcl.getType().equals(existingAcl.getType()) + && givenAcl.getName().equals(existingAcl.getName()) + && givenAcl.getAclScope().equals(existingAcl.getAclScope())) { + BitSet bitSet = (BitSet) givenAcl.getAclBitSet().clone(); + bitSet.and(existingAcl.getAclBitSet()); + if (bitSet.equals(existingAcl.getAclBitSet())) { return true; } } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java index c4c50e2f927b7..eb0e52581e59d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java @@ -24,6 +24,8 @@ import org.apache.hadoop.ozone.om.request.bucket.OMBucketSetPropertyRequest; import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketAddAclRequest; +import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketRemoveAclRequest; +import org.apache.hadoop.ozone.om.request.bucket.acl.OMBucketSetAclRequest; import org.apache.hadoop.ozone.om.request.file.OMDirectoryCreateRequest; import org.apache.hadoop.ozone.om.request.file.OMFileCreateRequest; import org.apache.hadoop.ozone.om.request.key.OMAllocateBlockRequest; @@ -121,6 +123,8 @@ public static OMClientRequest createClientRequest(OMRequest omRequest) { case CompleteMultiPartUpload: return new S3MultipartUploadCompleteRequest(omRequest); case AddAcl: + case RemoveAcl: + case SetAcl: return getOMAclRequest(omRequest); default: // TODO: will update once all request types are implemented. @@ -129,17 +133,25 @@ public static OMClientRequest createClientRequest(OMRequest omRequest) { } private static OMClientRequest getOMAclRequest(OMRequest omRequest) { - ObjectType type = omRequest.getAddAclRequest().getObj().getResType(); Type cmdType = omRequest.getCmdType(); - if (ObjectType.BUCKET == type) { - if (Type.AddAcl == cmdType) { + if (Type.AddAcl == cmdType) { + ObjectType type = omRequest.getAddAclRequest().getObj().getResType(); + if (type == ObjectType.BUCKET) { return new OMBucketAddAclRequest(omRequest); - } else { - // TODO: remaining operations of acl needs to be supported - return null; + } + } else if (Type.SetAcl == cmdType) { + ObjectType type = omRequest.getSetAclRequest().getObj().getResType(); + if (type == ObjectType.BUCKET) { + return new OMBucketSetAclRequest(omRequest); + } + } else if (Type.RemoveAcl == cmdType) { + ObjectType type = omRequest.getRemoveAclRequest().getObj().getResType(); + if (type == ObjectType.BUCKET) { + return new OMBucketRemoveAclRequest(omRequest); } } - //TODO: handle key and prefix AddAcl + + // Because all acl requests are not handled. return null; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java new file mode 100644 index 0000000000000..ee7fbac36db04 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java @@ -0,0 +1,185 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.ozone.om.request.bucket.acl; + +import java.io.IOException; +import java.util.List; + +import com.google.common.base.Optional; +import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.om.OMMetadataManager; +import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.OzoneManager; +import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; +import org.apache.hadoop.ozone.om.request.OMClientRequest; +import org.apache.hadoop.ozone.om.request.util.BiFunction; +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.OzoneObj.ObjectType; +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; +import org.apache.hadoop.ozone.security.acl.OzoneObj; +import org.apache.hadoop.utils.db.cache.CacheKey; +import org.apache.hadoop.utils.db.cache.CacheValue; + +import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; + +/** + * Base class for Bucket acl request. + */ +public abstract class OMBucketAclRequest extends OMClientRequest { + + private BiFunction, OmBucketInfo> omBucketAclOp; + + public OMBucketAclRequest(OMRequest omRequest, + BiFunction, OmBucketInfo> aclOp) { + super(omRequest); + omBucketAclOp = aclOp; + } + + @Override + public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, + long transactionLogIndex, + OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper) { + + // protobuf guarantees acls are non-null. + List ozoneAcls = getAcls(); + + OMMetrics omMetrics = ozoneManager.getMetrics(); + omMetrics.incNumBucketUpdates(); + OmBucketInfo omBucketInfo = null; + + OMResponse.Builder omResponse = onInit(); + OMClientResponse omClientResponse = null; + IOException exception = null; + + OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); + boolean lockAcquired = false; + String volume = null; + String bucket = null; + boolean operationResult = false; + try { + ObjectParser objectParser = new ObjectParser(getPath(), + ObjectType.BUCKET); + + volume = objectParser.getVolume(); + bucket = objectParser.getBucket(); + + // check Acl + if (ozoneManager.getAclsEnabled()) { + checkAcls(ozoneManager, OzoneObj.ResourceType.VOLUME, + OzoneObj.StoreType.OZONE, IAccessAuthorizer.ACLType.WRITE_ACL, + volume, null, null); + } + lockAcquired = + omMetadataManager.getLock().acquireLock(BUCKET_LOCK, volume, bucket); + + String dbBucketKey = omMetadataManager.getBucketKey(volume, bucket); + omBucketInfo = omMetadataManager.getBucketTable().get(dbBucketKey); + if (omBucketInfo == null) { + throw new OMException(OMException.ResultCodes.BUCKET_NOT_FOUND); + } + + operationResult = omBucketAclOp.apply(ozoneAcls, omBucketInfo); + + if (operationResult) { + // update cache. + omMetadataManager.getBucketTable().addCacheEntry( + new CacheKey<>(dbBucketKey), + new CacheValue<>(Optional.of(omBucketInfo), transactionLogIndex)); + } + + omClientResponse = onSuccess(omResponse, omBucketInfo, operationResult); + + } catch (IOException ex) { + exception = ex; + omClientResponse = onFailure(omResponse, ex); + } finally { + if (omClientResponse != null) { + omClientResponse.setFlushFuture( + ozoneManagerDoubleBufferHelper.add(omClientResponse, + transactionLogIndex)); + } + if (lockAcquired) { + omMetadataManager.getLock().releaseLock(BUCKET_LOCK, volume, bucket); + } + } + + + onComplete(operationResult, exception, ozoneManager.getMetrics()); + + return omClientResponse; + } + + /** + * Get the Acls from the request. + * @return List of OzoneAcls, for add/remove it is a single element list + * for set it can be non-single element list. + */ + abstract List getAcls(); + + /** + * Get the path name from the request. + * @return path name + */ + abstract String getPath(); + + // 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. + */ + abstract OMResponse.Builder onInit(); + + /** + * Get the om client response on success case with lock. + * @param omResponse + * @param omBucketInfo + * @param operationResult + * @return OMClientResponse + */ + abstract OMClientResponse onSuccess( + OMResponse.Builder omResponse, OmBucketInfo omBucketInfo, + boolean operationResult); + + /** + * Get the om client response on failure case with lock. + * @param omResponse + * @param exception + * @return OMClientResponse + */ + abstract OMClientResponse onFailure(OMResponse.Builder omResponse, + IOException exception); + + /** + * Completion hook for final processing before return without lock. + * Usually used for logging without lock and metric update. + * @param operationResult + * @param exception + * @param omMetrics + */ + abstract void onComplete(boolean operationResult, IOException exception, + OMMetrics omMetrics); + + +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 0a969b064689d..0002212523f07 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -19,133 +19,103 @@ package org.apache.hadoop.ozone.om.request.bucket.acl; import java.io.IOException; +import java.util.List; -import com.google.common.base.Optional; -import org.apache.hadoop.ozone.om.request.util.ObjectParser; +import com.google.common.collect.Lists; +import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.request.util.BiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.ozone.OzoneAcl; -import org.apache.hadoop.ozone.om.OMMetadataManager; -import org.apache.hadoop.ozone.om.OzoneManager; -import org.apache.hadoop.ozone.om.exceptions.OMException; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; -import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; -import org.apache.hadoop.ozone.om.request.OMClientRequest; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; -import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos - .AddAclRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos .AddAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos .OMRequest; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos .OMResponse; -import org.apache.hadoop.utils.db.cache.CacheKey; -import org.apache.hadoop.utils.db.cache.CacheValue; - -import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.BUCKET_NOT_FOUND; -import static org.apache.hadoop.ozone.om.lock.OzoneManagerLock.Resource.BUCKET_LOCK; /** * Handle add Acl request for bucket. */ -public class OMBucketAddAclRequest extends OMClientRequest { +public class OMBucketAddAclRequest extends OMBucketAclRequest { private static final Logger LOG = LoggerFactory.getLogger(OMBucketAddAclRequest.class); + private static BiFunction, OmBucketInfo> bucketAddAclOp; + private String path; + private List ozoneAcls; + + static { + bucketAddAclOp = (ozoneAcls, omBucketInfo) -> { + return omBucketInfo.addAcl(ozoneAcls.get(0)); + }; + } + public OMBucketAddAclRequest(OMRequest omRequest) { - super(omRequest); + super(omRequest, bucketAddAclOp); + OzoneManagerProtocolProtos.AddAclRequest addAclRequest = + getOmRequest().getAddAclRequest(); + path = addAclRequest.getObj().getPath(); + ozoneAcls = Lists.newArrayList( + OzoneAcl.fromProtobuf(addAclRequest.getAcl())); } @Override - public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, - long transactionLogIndex, - OzoneManagerDoubleBufferHelper ozoneManagerDoubleBufferHelper) { + List getAcls() { + return ozoneAcls; + } - AddAclRequest addAclRequest = getOmRequest().getAddAclRequest(); + @Override + String getPath() { + return path; + } - OMResponse.Builder omResponse = OMResponse.newBuilder().setCmdType( + @Override + OMResponse.Builder onInit() { + return OMResponse.newBuilder().setCmdType( OzoneManagerProtocolProtos.Type.AddAcl).setStatus( - OzoneManagerProtocolProtos.Status.OK).setSuccess(true) - .setAddAclResponse(AddAclResponse.newBuilder() - .setResponse(true).build()); + OzoneManagerProtocolProtos.Status.OK).setSuccess(true); - OzoneAcl ozoneAcl = OzoneAcl.fromProtobuf(addAclRequest.getAcl()); - - OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager(); - ozoneManager.getMetrics().incNumBucketUpdates(); - - boolean acquiredLock = false; - OMClientResponse omClientResponse = null; - IOException exception = null; - String volume = null; - String bucket = null; - try { - ObjectParser objectParser = - new ObjectParser(addAclRequest.getObj().getPath(), - addAclRequest.getObj().getResType()); - - volume= objectParser.getVolume(); - bucket = objectParser.getBucket(); - - acquiredLock = omMetadataManager.getLock().acquireLock(BUCKET_LOCK, - volume, bucket); - - String dbBucketKey = omMetadataManager.getBucketKey(volume, bucket); - - OmBucketInfo omBucketInfo = - omMetadataManager.getBucketTable().get(dbBucketKey); - - if (omBucketInfo == null) { - throw new OMException("Bucket " + bucket + " is not found", - BUCKET_NOT_FOUND); - } - - boolean addAcl = omBucketInfo.addAcl(ozoneAcl); - omResponse.setAddAclResponse(AddAclResponse.newBuilder() - .setResponse(addAcl).build()); + } - if (addAcl) { - omMetadataManager.getBucketTable().addCacheEntry( - new CacheKey<>(dbBucketKey), - new CacheValue<>(Optional.of(omBucketInfo), transactionLogIndex)); - } + @Override + OMClientResponse onSuccess(OMResponse.Builder omResponse, + OmBucketInfo omBucketInfo, boolean operationResult) { + omResponse.setAddAclResponse(AddAclResponse.newBuilder() + .setResponse(operationResult)); + return new OMBucketAclResponse(omBucketInfo, + omResponse.build()); + } - omClientResponse = new OMBucketAclResponse(omBucketInfo, - omResponse.build()); - - } catch (IOException ex) { - exception = ex; - omClientResponse = new OMBucketAclResponse(null, - createErrorOMResponse(omResponse, exception)); - } finally { - if (omClientResponse != null) { - omClientResponse.setFlushFuture(ozoneManagerDoubleBufferHelper.add( - omClientResponse, transactionLogIndex)); - } - if (acquiredLock) { - omMetadataManager.getLock().releaseLock(BUCKET_LOCK, volume, bucket); - } - } + @Override + OMClientResponse onFailure(OMResponse.Builder omResponse, + IOException exception) { + return new OMBucketAclResponse(null, + createErrorOMResponse(omResponse, exception)); + } - // TODO: audit log - if (!omResponse.getAddAclResponse().getResponse()) { - LOG.warn("AddAcl is called to add an already exisiting ACL {} for " + - "bucket {} in volume {} ", ozoneAcl, bucket, volume); - } - if (exception == null) { - LOG.debug("AddAcl for bucket {} in volume {} is successful", bucket, - volume); + @Override + void onComplete(boolean operationResult, IOException exception, + OMMetrics omMetrics) { + if (operationResult) { + LOG.debug("Add acl: {} to path: {} success!", getAcls(), getPath()); } else { - ozoneManager.getMetrics().incNumBucketUpdateFails(); - LOG.error("AddAcl for bucket {} in volume {} failed", bucket, volume, - exception); + omMetrics.incNumBucketUpdateFails(); + if (exception == null) { + LOG.error("Add acl {} to path {} failed, because acl already exist", + getAcls(), getPath()); + } else { + LOG.error("Add acl {} to path {} failed!", getAcls(), getPath(), + exception); + } } - - return omClientResponse; } + } + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java new file mode 100644 index 0000000000000..65943de087126 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -0,0 +1,99 @@ +package org.apache.hadoop.ozone.om.request.bucket.acl; + +import java.io.IOException; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Lists; +import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.om.response.OMClientResponse; +import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.RemoveAclResponse; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest; +import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse; + + +/** + * Handle removeAcl request for bucket. + */ +public class OMBucketRemoveAclRequest extends OMBucketAclRequest { + private static final Logger LOG = + LoggerFactory.getLogger(OMBucketAddAclRequest.class); + + private static BiFunction, OmBucketInfo> bucketAddAclOp; + private String path; + private List ozoneAcls; + + static { + bucketAddAclOp = (ozoneAcls, omBucketInfo) -> { + return omBucketInfo.removeAcl(ozoneAcls.get(0)); + }; + } + + public OMBucketRemoveAclRequest(OMRequest omRequest) { + super(omRequest, bucketAddAclOp); + OzoneManagerProtocolProtos.RemoveAclRequest removeAclRequest = + getOmRequest().getRemoveAclRequest(); + path = removeAclRequest.getObj().getPath(); + ozoneAcls = Lists.newArrayList( + OzoneAcl.fromProtobuf(removeAclRequest.getAcl())); + } + + @Override + List getAcls() { + return ozoneAcls; + } + + @Override + String getPath() { + return path; + } + + @Override + OMResponse.Builder onInit() { + return OMResponse.newBuilder().setCmdType( + OzoneManagerProtocolProtos.Type.RemoveAcl).setStatus( + OzoneManagerProtocolProtos.Status.OK).setSuccess(true); + + } + + @Override + OMClientResponse onSuccess(OMResponse.Builder omResponse, + OmBucketInfo omBucketInfo, boolean operationResult) { + omResponse.setSuccess(operationResult); + omResponse.setRemoveAclResponse(RemoveAclResponse.newBuilder() + .setResponse(operationResult)); + return new OMBucketAclResponse(omBucketInfo, + omResponse.build()); + } + + @Override + OMClientResponse onFailure(OMResponse.Builder omResponse, + IOException exception) { + return new OMBucketAclResponse(null, + createErrorOMResponse(omResponse, exception)); + } + + @Override + void onComplete(boolean operationResult, IOException exception, + OMMetrics omMetrics) { + if (operationResult) { + LOG.debug("Remove acl: {} for path: {} success!", getAcls(), getPath()); + } else { + omMetrics.incNumBucketUpdateFails(); + if (exception == null) { + LOG.error("Remove acl {} for path {} failed, because acl already exist", + getAcls(), getPath()); + } else { + LOG.error("Remove acl {} for path {} failed!", getAcls(), getPath(), + exception); + } + } + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java new file mode 100644 index 0000000000000..b8d8769d32600 --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -0,0 +1,100 @@ +package org.apache.hadoop.ozone.om.request.bucket.acl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.hadoop.ozone.OzoneAcl; +import org.apache.hadoop.ozone.om.OMMetrics; +import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; +import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.om.response.OMClientResponse; +import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; +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.protocol.proto.OzoneManagerProtocolProtos.SetAclResponse; + +/** + * Handle setAcl request for bucket. + */ +public class OMBucketSetAclRequest extends OMBucketAclRequest { + private static final Logger LOG = + LoggerFactory.getLogger(OMBucketAddAclRequest.class); + + private static BiFunction< List, + OmBucketInfo > bucketAddAclOp; + private String path; + private List ozoneAcls; + + static { + bucketAddAclOp = (ozoneAcls, omBucketInfo) -> { + return omBucketInfo.setAcls(ozoneAcls); + }; + } + + public OMBucketSetAclRequest(OMRequest omRequest) { + super(omRequest, bucketAddAclOp); + OzoneManagerProtocolProtos.SetAclRequest setAclRequest = + getOmRequest().getSetAclRequest(); + path = setAclRequest.getObj().getPath(); + ozoneAcls = new ArrayList<>(); + setAclRequest.getAclList().forEach(aclInfo -> + ozoneAcls.add(OzoneAcl.fromProtobuf(aclInfo))); + } + + @Override + List getAcls() { + return ozoneAcls; + } + + @Override + String getPath() { + return path; + } + + @Override + OMResponse.Builder onInit() { + return OMResponse.newBuilder().setCmdType( + OzoneManagerProtocolProtos.Type.SetAcl).setStatus( + OzoneManagerProtocolProtos.Status.OK).setSuccess(true); + + } + + @Override + OMClientResponse onSuccess(OMResponse.Builder omResponse, + OmBucketInfo omBucketInfo, boolean operationResult) { + omResponse.setSuccess(operationResult); + omResponse.setSetAclResponse(SetAclResponse.newBuilder() + .setResponse(operationResult)); + return new OMBucketAclResponse(omBucketInfo, + omResponse.build()); + } + + @Override + OMClientResponse onFailure(OMResponse.Builder omResponse, + IOException exception) { + return new OMBucketAclResponse(null, + createErrorOMResponse(omResponse, exception)); + } + + @Override + void onComplete(boolean operationResult, IOException exception, + OMMetrics omMetrics) { + if (operationResult) { + LOG.debug("Set acl: {} for path: {} success!", getAcls(), getPath()); + } else { + omMetrics.incNumBucketUpdateFails(); + if (exception == null) { + LOG.error("Set acl {} for path {} failed, because acl already exist", + getAcls(), getPath()); + } else { + LOG.error("Set acl {} for path {} failed!", getAcls(), getPath(), + exception); + } + } + } +} diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java new file mode 100644 index 0000000000000..a72e66f6a0f3a --- /dev/null +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java @@ -0,0 +1,10 @@ +package org.apache.hadoop.ozone.om.request.util; + +/** + * Defines a functional interface having two inputs and returns boolean as + * output. + */ +@FunctionalInterface +public interface BiFunction { + boolean apply(LEFT left, RIGHT right); +} \ No newline at end of file diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java index ab6a73292b885..455dc67d2788b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerHARequestHandlerImpl.java @@ -72,6 +72,8 @@ public OMResponse handleApplyTransaction(OMRequest omRequest, case AbortMultiPartUpload: case CompleteMultiPartUpload: case AddAcl: + case SetAcl: + case RemoveAcl: //TODO: We don't need to pass transactionID, this will be removed when // complete write requests is changed to new model. And also we can // return OMClientResponse, then adding to doubleBuffer can be taken From 82fcd1f7a4765823927074acbf4f1988d52f1a23 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 17:44:16 -0700 Subject: [PATCH 04/14] fix checkstyle. --- .../java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java index 86a1b21f159bd..4d764a5cee270 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmBucketInfo.java @@ -18,9 +18,7 @@ package org.apache.hadoop.ozone.om.helpers; -import java.util.ArrayList; import java.util.BitSet; -import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; From 094ad24dd97582ac4ef4608538e721503991a78f Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 17:57:03 -0700 Subject: [PATCH 05/14] unneeded change. --- hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config index dcc3e5cfdd343..6bebfdf8686c3 100644 --- a/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config +++ b/hadoop-ozone/dist/src/main/compose/ozone-om-ha/docker-config @@ -18,7 +18,7 @@ OZONE-SITE.XML_ozone.om.nodes=om1,om2,om3 OZONE-SITE.XML_ozone.om.address.om1=om1 OZONE-SITE.XML_ozone.om.address.om2=om2 OZONE-SITE.XML_ozone.om.address.om3=om3 -OZONE-SITE.XMiL_ozone.om.ratis.enable=true +OZONE-SITE.XML_ozone.om.ratis.enable=true OZONE-SITE.XML_ozone.scm.names=scm OZONE-SITE.XML_ozone.enabled=True OZONE-SITE.XML_ozone.scm.datanode.id.dir=/data From e67922aa69b5f91baa1ef180366a93bbcafe9d2c Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 18:00:06 -0700 Subject: [PATCH 06/14] add new line at end of file. --- .../hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java | 1 + .../ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java | 1 + .../ozone/om/request/bucket/acl/OMBucketSetAclRequest.java | 1 + .../hadoop/ozone/om/request/bucket/acl/package-info.java | 3 ++- .../org/apache/hadoop/ozone/om/request/util/BiFunction.java | 3 ++- .../org/apache/hadoop/ozone/om/request/util/ObjectParser.java | 1 + .../org/apache/hadoop/ozone/om/request/util/package-info.java | 3 ++- .../ozone/om/response/bucket/acl/OMBucketAclResponse.java | 1 + 8 files changed, 11 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java index ee7fbac36db04..ee5a892296906 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java @@ -183,3 +183,4 @@ abstract void onComplete(boolean operationResult, IOException exception, } + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java index 65943de087126..6d4f2e6fbca5f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -97,3 +97,4 @@ void onComplete(boolean operationResult, IOException exception, } } } + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java index b8d8769d32600..2f4b824da6a50 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -98,3 +98,4 @@ void onComplete(boolean operationResult, IOException exception, } } } + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java index 77ee0e3d41aa8..7b3b43d567853 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/package-info.java @@ -19,4 +19,5 @@ /** * This package contains classes for handling acl requests for bucket. */ -package org.apache.hadoop.ozone.om.request.bucket.acl; \ No newline at end of file +package org.apache.hadoop.ozone.om.request.bucket.acl; + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java index a72e66f6a0f3a..17b3f313b5d08 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java @@ -7,4 +7,5 @@ @FunctionalInterface public interface BiFunction { boolean apply(LEFT left, RIGHT right); -} \ No newline at end of file +} + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java index f280b6fcbb58b..7b258a079886d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/ObjectParser.java @@ -71,3 +71,4 @@ public String getKey() { return key; } } + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java index d80ee8906b0e1..72fc09a53a37d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/package-info.java @@ -19,4 +19,5 @@ /** * Package contains helper/utility classes for requests. */ -package org.apache.hadoop.ozone.om.request.util; \ No newline at end of file +package org.apache.hadoop.ozone.om.request.util; + diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java index d01628c3a788a..6b03e8fad1d48 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java @@ -59,3 +59,4 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, } } + From 8a4ccdd1872570ac3ec9580ffd854618b5c14944 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 18:04:03 -0700 Subject: [PATCH 07/14] move BiFunction to ozone common. --- .../src/main/java/org/apache/hadoop/ozone}/util/BiFunction.java | 2 +- .../hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java | 2 +- .../ozone/om/request/bucket/acl/OMBucketAddAclRequest.java | 2 +- .../ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java | 2 +- .../ozone/om/request/bucket/acl/OMBucketSetAclRequest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename hadoop-ozone/{ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request => common/src/main/java/org/apache/hadoop/ozone}/util/BiFunction.java (80%) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java similarity index 80% rename from hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java rename to hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java index 17b3f313b5d08..a43520388b0dd 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/util/BiFunction.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java @@ -1,4 +1,4 @@ -package org.apache.hadoop.ozone.om.request.util; +package org.apache.hadoop.ozone.util; /** * Defines a functional interface having two inputs and returns boolean as diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java index ee5a892296906..0e32daddcd7d4 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java @@ -30,7 +30,7 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; import org.apache.hadoop.ozone.om.request.OMClientRequest; -import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.util.BiFunction; 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.OzoneObj.ObjectType; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 0002212523f07..797aee51cdd1b 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -23,7 +23,7 @@ import com.google.common.collect.Lists; import org.apache.hadoop.ozone.om.OMMetrics; -import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.util.BiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java index 6d4f2e6fbca5f..a8e06b44b5356 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -10,7 +10,7 @@ import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; -import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.util.BiFunction; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java index 2f4b824da6a50..46548a64eabd6 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -10,7 +10,7 @@ import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; -import org.apache.hadoop.ozone.om.request.util.BiFunction; +import org.apache.hadoop.ozone.util.BiFunction; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; From b5b93bde983acaee6cee6161224717a1a1e3a924 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 21:50:07 -0700 Subject: [PATCH 08/14] fix check in OmBucketAclResponse. --- .../ozone/om/response/bucket/acl/OMBucketAclResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java index 6b03e8fad1d48..e10172801fcb3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java @@ -49,7 +49,7 @@ public void addToDBBatch(OMMetadataManager omMetadataManager, // If response status is OK and AddAclResponse is true, add to DB batch. if (getOMResponse().getStatus() == OzoneManagerProtocolProtos.Status.OK && - getOMResponse().getAddAclResponse().getResponse()) { + getOMResponse().getSuccess()) { String dbBucketKey = omMetadataManager.getBucketKey(omBucketInfo.getVolumeName(), omBucketInfo.getBucketName()); From f27f1968728b0f74ab75cd65c11513d6fb9bcbf4 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 1 Aug 2019 21:52:12 -0700 Subject: [PATCH 09/14] fix onSuccess in addAcl. --- .../ozone/om/request/bucket/acl/OMBucketAddAclRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 797aee51cdd1b..7c089e81a6495 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -87,6 +87,7 @@ OMResponse.Builder onInit() { @Override OMClientResponse onSuccess(OMResponse.Builder omResponse, OmBucketInfo omBucketInfo, boolean operationResult) { + omResponse.setSuccess(false); omResponse.setAddAclResponse(AddAclResponse.newBuilder() .setResponse(operationResult)); return new OMBucketAclResponse(omBucketInfo, From dbddcedbaf1d1c8910169deb579f7ca971cca73d Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Mon, 5 Aug 2019 16:09:41 -0700 Subject: [PATCH 10/14] minor changes. --- .../ozone/om/request/bucket/acl/OMBucketAddAclRequest.java | 2 +- .../ozone/om/response/bucket/acl/OMBucketAclResponse.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 7c089e81a6495..0072faa249bcc 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -87,7 +87,7 @@ OMResponse.Builder onInit() { @Override OMClientResponse onSuccess(OMResponse.Builder omResponse, OmBucketInfo omBucketInfo, boolean operationResult) { - omResponse.setSuccess(false); + omResponse.setSuccess(operationResult); omResponse.setAddAclResponse(AddAclResponse.newBuilder() .setResponse(operationResult)); return new OMBucketAclResponse(omBucketInfo, diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java index e10172801fcb3..a8c5b863165f8 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/response/bucket/acl/OMBucketAclResponse.java @@ -47,7 +47,7 @@ public OMBucketAclResponse(@Nullable OmBucketInfo omBucketInfo, public void addToDBBatch(OMMetadataManager omMetadataManager, BatchOperation batchOperation) throws IOException { - // If response status is OK and AddAclResponse is true, add to DB batch. + // If response status is OK and success is true, add to DB batch. if (getOMResponse().getStatus() == OzoneManagerProtocolProtos.Status.OK && getOMResponse().getSuccess()) { String dbBucketKey = From d48e48a80b84b526f85fe9c0ab826c117dee0468 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Wed, 7 Aug 2019 11:14:54 -0700 Subject: [PATCH 11/14] address comments. --- .../ozone/util/{BiFunction.java => BooleanBiFunction.java} | 2 +- .../java/org/apache/hadoop/ozone/om/TestOzoneManagerHA.java | 1 - .../ozone/om/request/bucket/acl/OMBucketAclRequest.java | 6 +++--- .../ozone/om/request/bucket/acl/OMBucketAddAclRequest.java | 4 ++-- .../om/request/bucket/acl/OMBucketRemoveAclRequest.java | 4 ++-- .../ozone/om/request/bucket/acl/OMBucketSetAclRequest.java | 6 +++--- 6 files changed, 11 insertions(+), 12 deletions(-) rename hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/{BiFunction.java => BooleanBiFunction.java} (79%) diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BooleanBiFunction.java similarity index 79% rename from hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java rename to hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BooleanBiFunction.java index a43520388b0dd..a70f4b0ebc686 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BiFunction.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/util/BooleanBiFunction.java @@ -5,7 +5,7 @@ * output. */ @FunctionalInterface -public interface BiFunction { +public interface BooleanBiFunction { boolean apply(LEFT left, RIGHT right); } 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 65cabc33f7afc..29b63686aa357 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 @@ -784,7 +784,6 @@ public void testAddBucketAcl() throws Exception { boolean addAcl = objectStore.addAcl(ozoneObj, defaultUserAcl); Assert.assertTrue(addAcl); - ozoneBucket.addAcls(Collections.singletonList(defaultUserAcl)); List acls = objectStore.getAcl(ozoneObj); Assert.assertTrue(containsAcl(defaultUserAcl, acls)); diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java index 0e32daddcd7d4..9c4741967977d 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAclRequest.java @@ -30,7 +30,7 @@ import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; import org.apache.hadoop.ozone.om.ratis.utils.OzoneManagerDoubleBufferHelper; import org.apache.hadoop.ozone.om.request.OMClientRequest; -import org.apache.hadoop.ozone.util.BiFunction; +import org.apache.hadoop.ozone.util.BooleanBiFunction; 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.OzoneObj.ObjectType; @@ -48,10 +48,10 @@ */ public abstract class OMBucketAclRequest extends OMClientRequest { - private BiFunction, OmBucketInfo> omBucketAclOp; + private BooleanBiFunction, OmBucketInfo> omBucketAclOp; public OMBucketAclRequest(OMRequest omRequest, - BiFunction, OmBucketInfo> aclOp) { + BooleanBiFunction, OmBucketInfo> aclOp) { super(omRequest); omBucketAclOp = aclOp; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java index 0072faa249bcc..41aef6db6d31f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketAddAclRequest.java @@ -23,7 +23,7 @@ import com.google.common.collect.Lists; import org.apache.hadoop.ozone.om.OMMetrics; -import org.apache.hadoop.ozone.util.BiFunction; +import org.apache.hadoop.ozone.util.BooleanBiFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +47,7 @@ public class OMBucketAddAclRequest extends OMBucketAclRequest { private static final Logger LOG = LoggerFactory.getLogger(OMBucketAddAclRequest.class); - private static BiFunction, OmBucketInfo> bucketAddAclOp; + private static BooleanBiFunction, OmBucketInfo> bucketAddAclOp; private String path; private List ozoneAcls; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java index a8e06b44b5356..511258e6d5561 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -10,7 +10,7 @@ import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; -import org.apache.hadoop.ozone.util.BiFunction; +import org.apache.hadoop.ozone.util.BooleanBiFunction; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; @@ -26,7 +26,7 @@ public class OMBucketRemoveAclRequest extends OMBucketAclRequest { private static final Logger LOG = LoggerFactory.getLogger(OMBucketAddAclRequest.class); - private static BiFunction, OmBucketInfo> bucketAddAclOp; + private static BooleanBiFunction, OmBucketInfo> bucketAddAclOp; private String path; private List ozoneAcls; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java index 46548a64eabd6..d5effbde92c27 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -10,7 +10,7 @@ import org.apache.hadoop.ozone.OzoneAcl; import org.apache.hadoop.ozone.om.OMMetrics; import org.apache.hadoop.ozone.om.helpers.OmBucketInfo; -import org.apache.hadoop.ozone.util.BiFunction; +import org.apache.hadoop.ozone.util.BooleanBiFunction; import org.apache.hadoop.ozone.om.response.OMClientResponse; import org.apache.hadoop.ozone.om.response.bucket.acl.OMBucketAclResponse; import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos; @@ -25,8 +25,8 @@ public class OMBucketSetAclRequest extends OMBucketAclRequest { private static final Logger LOG = LoggerFactory.getLogger(OMBucketAddAclRequest.class); - private static BiFunction< List, - OmBucketInfo > bucketAddAclOp; + private static BooleanBiFunction< List, + OmBucketInfo > bucketAddAclOp; private String path; private List ozoneAcls; From 8c206eb93e1ec996d77d0a58530c2a1d80a0d964 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Wed, 7 Aug 2019 11:16:28 -0700 Subject: [PATCH 12/14] fix minor comment. --- .../ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java | 3 ++- .../ozone/om/request/bucket/acl/OMBucketSetAclRequest.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java index 511258e6d5561..cc6089710671a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketRemoveAclRequest.java @@ -88,7 +88,8 @@ void onComplete(boolean operationResult, IOException exception, } else { omMetrics.incNumBucketUpdateFails(); if (exception == null) { - LOG.error("Remove acl {} for path {} failed, because acl already exist", + LOG.error("Remove acl {} for path {} failed, because acl does not " + + "exist", getAcls(), getPath()); } else { LOG.error("Remove acl {} for path {} failed!", getAcls(), getPath(), diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java index d5effbde92c27..776789891a73a 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/bucket/acl/OMBucketSetAclRequest.java @@ -89,8 +89,7 @@ void onComplete(boolean operationResult, IOException exception, } else { omMetrics.incNumBucketUpdateFails(); if (exception == null) { - LOG.error("Set acl {} for path {} failed, because acl already exist", - getAcls(), getPath()); + LOG.error("Set acl {} for path {} failed", getAcls(), getPath()); } else { LOG.error("Set acl {} for path {} failed!", getAcls(), getPath(), exception); From 0e7273cd760105dbdf6ae2b6cba7581e7fdcb579 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 8 Aug 2019 15:28:56 -0700 Subject: [PATCH 13/14] fix issue caused by HDDS-1619. --- .../hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java index a071eb28db15f..b1ac0d144d822 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java @@ -143,14 +143,14 @@ private static OMClientRequest getOMAclRequest(OMRequest omRequest) { return new OMBucketAddAclRequest(omRequest); } } else if (Type.RemoveAcl == cmdType) { - ObjectType type = omRequest.getAddAclRequest().getObj().getResType(); + ObjectType type = omRequest.getRemoveAclRequest().getObj().getResType(); if (ObjectType.VOLUME == type) { return new OMVolumeRemoveAclRequest(omRequest); } else if (ObjectType.BUCKET == type) { return new OMBucketSetAclRequest(omRequest); } } else if (Type.SetAcl == cmdType) { - ObjectType type = omRequest.getAddAclRequest().getObj().getResType(); + ObjectType type = omRequest.getSetAclRequest().getObj().getResType(); if (ObjectType.VOLUME == type) { return new OMVolumeSetAclRequest(omRequest); } else if (ObjectType.BUCKET == type) { From 3893fdd25239072e5691956ecac5720dcc985257 Mon Sep 17 00:00:00 2001 From: Bharat Viswanadham Date: Thu, 8 Aug 2019 16:39:16 -0700 Subject: [PATCH 14/14] fix checkstyle --- .../hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java index b1ac0d144d822..d0dd64029c47f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/utils/OzoneManagerRatisUtils.java @@ -147,7 +147,7 @@ private static OMClientRequest getOMAclRequest(OMRequest omRequest) { if (ObjectType.VOLUME == type) { return new OMVolumeRemoveAclRequest(omRequest); } else if (ObjectType.BUCKET == type) { - return new OMBucketSetAclRequest(omRequest); + return new OMBucketRemoveAclRequest(omRequest); } } else if (Type.SetAcl == cmdType) { ObjectType type = omRequest.getSetAclRequest().getObj().getResType();