Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HDDS-12600. Lazily convert ACLs from protobuf in OmKeyInfo and OmDirectoryInfo #8077

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,20 @@

package org.apache.hadoop.ozone.om.helpers;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
import org.apache.hadoop.hdds.utils.db.Codec;
import org.apache.hadoop.hdds.utils.db.CopyObject;
import org.apache.hadoop.hdds.utils.db.DelegatedCodec;
import org.apache.hadoop.hdds.utils.db.Proto2Codec;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.OzoneConsts;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.DirectoryInfo;
import org.apache.ratis.util.MemoizedSupplier;

/**
* This class represents the directory information by keeping each component
Expand All @@ -52,7 +55,7 @@ public static Codec<OmDirectoryInfo> getCodec() {
private final long creationTime;
private final long modificationTime;

private final List<OzoneAcl> acls;
private final Supplier<List<OzoneAcl>> acls;

public OmDirectoryInfo(Builder builder) {
super(builder);
Expand Down Expand Up @@ -82,11 +85,11 @@ public static class Builder extends WithParentObjectId.Builder {
private long creationTime;
private long modificationTime;

private final List<OzoneAcl> acls;
private Supplier<List<OzoneAcl>> acls;

public Builder() {
//Default values
this.acls = new LinkedList<>();
this.acls = MemoizedSupplier.valueOf(LinkedList::new);
}

@Override
Expand Down Expand Up @@ -129,14 +132,27 @@ public Builder setModificationTime(long newModificationTime) {

public Builder setAcls(List<OzoneAcl> listOfAcls) {
if (listOfAcls != null) {
this.acls.addAll(listOfAcls);
this.acls = MemoizedSupplier.valueOf(() -> {
this.acls.get().addAll(listOfAcls);
return this.acls.get();
});
}
return this;
}

public Builder setAcls(Supplier<List<OzoneAcl>> listOfAcls) {
if (listOfAcls != null) {
this.acls = MemoizedSupplier.valueOf(() -> {
this.acls.get().addAll(listOfAcls.get());
return this.acls.get();
});
}
return this;
}

public Builder addAcl(OzoneAcl ozoneAcl) {
if (ozoneAcl != null) {
this.acls.add(ozoneAcl);
return setAcls(Collections.singletonList(ozoneAcl));
}
return this;
}
Expand Down Expand Up @@ -184,7 +200,7 @@ public long getModificationTime() {
}

public List<OzoneAcl> getAcls() {
return acls;
return acls.get();
}

/**
Expand All @@ -203,7 +219,7 @@ public DirectoryInfo getProtobuf() {
pib.setOwnerName(owner);
}
if (acls != null) {
pib.addAllAcls(OzoneAclUtil.toProtobuf(acls));
pib.addAllAcls(OzoneAclUtil.toProtobuf(acls.get()));
}
return pib.build();
}
Expand All @@ -218,7 +234,7 @@ public static OmDirectoryInfo getFromProtobuf(DirectoryInfo dirInfo) {
.setName(dirInfo.getName())
.setCreationTime(dirInfo.getCreationTime())
.setModificationTime(dirInfo.getModificationTime())
.setAcls(OzoneAclUtil.fromProtobuf(dirInfo.getAclsList()));
.setAcls(() -> OzoneAclUtil.fromProtobuf(dirInfo.getAclsList()));
if (dirInfo.getMetadataList() != null) {
opib.addAllMetadata(KeyValueUtil
.getFromProtobuf(dirInfo.getMetadataList()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
package org.apache.hadoop.ozone.om.helpers;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.hadoop.fs.FileChecksum;
Expand All @@ -44,6 +47,7 @@
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyLocationList;
import org.apache.hadoop.ozone.protocolPB.OMPBHelper;
import org.apache.hadoop.util.Time;
import org.apache.ratis.util.MemoizedSupplier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -99,7 +103,7 @@ public static Codec<OmKeyInfo> getCodec(boolean ignorePipeline) {
/**
* ACL Information.
*/
private final CopyOnWriteArrayList<OzoneAcl> acls;
private AtomicReference<Supplier<List<OzoneAcl>>> acls;

/**
* Used for S3 tags.
Expand All @@ -125,7 +129,7 @@ private OmKeyInfo(Builder b) {
this.modificationTime = b.modificationTime;
this.replicationConfig = b.replicationConfig;
this.encInfo = b.encInfo;
this.acls = new CopyOnWriteArrayList<>(b.acls);
this.acls = new AtomicReference<>(MemoizedSupplier.valueOf(() -> new CopyOnWriteArrayList<>(b.acls.get())));
this.fileChecksum = b.fileChecksum;
this.fileName = b.fileName;
this.isFile = b.isFile;
Expand Down Expand Up @@ -411,19 +415,19 @@ public FileEncryptionInfo getFileEncryptionInfo() {
}

public List<OzoneAcl> getAcls() {
return ImmutableList.copyOf(acls);
return ImmutableList.copyOf(acls.get().get());
}

public boolean addAcl(OzoneAcl acl) {
return OzoneAclUtil.addAcl(acls, acl);
return OzoneAclUtil.addAcl(acls.get().get(), acl);
}

public boolean removeAcl(OzoneAcl acl) {
return OzoneAclUtil.removeAcl(acls, acl);
return OzoneAclUtil.removeAcl(acls.get().get(), acl);
}

public boolean setAcls(List<OzoneAcl> newAcls) {
return OzoneAclUtil.setAcl(acls, newAcls);
return OzoneAclUtil.setAcl(acls.get().get(), newAcls);
}

public void setReplicationConfig(ReplicationConfig repConfig) {
Expand Down Expand Up @@ -468,7 +472,7 @@ public static class Builder extends WithParentObjectId.Builder {
private long modificationTime;
private ReplicationConfig replicationConfig;
private FileEncryptionInfo encInfo;
private final List<OzoneAcl> acls = new ArrayList<>();
private Supplier<List<OzoneAcl>> acls = ArrayList::new;
// not persisted to DB. FileName will be the last element in path keyName.
private String fileName;
private FileChecksum fileChecksum;
Expand Down Expand Up @@ -559,14 +563,22 @@ public Builder setFileEncryptionInfo(FileEncryptionInfo feInfo) {

public Builder setAcls(List<OzoneAcl> listOfAcls) {
if (listOfAcls != null) {
this.acls.addAll(listOfAcls);
this.acls = () -> {
this.acls.get().addAll(listOfAcls);
return acls.get();
};
}
return this;
}

public Builder addAcl(OzoneAcl ozoneAcl) {
if (ozoneAcl != null) {
this.acls.add(ozoneAcl);
public Builder setAclsSupplier(Supplier<List<OzoneAcl>> listOfAcls) {
if (listOfAcls != null) {
this.acls = () -> {
if (listOfAcls.get() != null) {
this.acls.get().addAll(listOfAcls.get());
}
return acls.get();
};
}
return this;
}
Expand Down Expand Up @@ -706,7 +718,7 @@ private KeyInfo getProtobuf(boolean ignorePipeline, String fullKeyName,
.setModificationTime(modificationTime)
.addAllMetadata(KeyValueUtil.toProtobuf(getMetadata()))
.addAllTags(KeyValueUtil.toProtobuf(getTags()))
.addAllAcls(OzoneAclUtil.toProtobuf(acls))
.addAllAcls(OzoneAclUtil.toProtobuf(acls.get().get()))
.setObjectID(getObjectID())
.setUpdateID(getUpdateID())
.setParentID(getParentObjectID());
Expand Down Expand Up @@ -759,7 +771,7 @@ public static OmKeyInfo getFromProtobuf(KeyInfo keyInfo) throws IOException {
.addAllTags(KeyValueUtil.getFromProtobuf(keyInfo.getTagsList()))
.setFileEncryptionInfo(keyInfo.hasFileEncryptionInfo() ?
OMPBHelper.convert(keyInfo.getFileEncryptionInfo()) : null)
.setAcls(OzoneAclUtil.fromProtobuf(keyInfo.getAclsList()));
.setAclsSupplier(() -> OzoneAclUtil.fromProtobuf(keyInfo.getAclsList()));
if (keyInfo.hasObjectID()) {
builder.setObjectID(keyInfo.getObjectID());
}
Expand Down Expand Up @@ -867,6 +879,10 @@ public int hashCode() {
*/
@Override
public OmKeyInfo copyObject() {

Supplier<List<OzoneAcl>> prevAcl =
this.acls.getAndUpdate(current ->
MemoizedSupplier.valueOf(() -> new CopyOnWriteArrayList<>(current.get())));
OmKeyInfo.Builder builder = new OmKeyInfo.Builder(this)
.setVolumeName(volumeName)
.setBucketName(bucketName)
Expand All @@ -877,7 +893,7 @@ public OmKeyInfo copyObject() {
.setDataSize(dataSize)
.setReplicationConfig(replicationConfig)
.setFileEncryptionInfo(encInfo)
.setAcls(acls)
.setAclsSupplier(() -> Lists.newArrayList(prevAcl.get()))
.setFileName(fileName)
.setFile(isFile);

Expand Down