diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmDirectoryInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmDirectoryInfo.java index 75f90f85133e..5cc51602730a 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmDirectoryInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmDirectoryInfo.java @@ -24,6 +24,7 @@ import java.util.BitSet; import java.util.HashMap; import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -33,7 +34,7 @@ * in the user given path and a pointer to its parent directory element in the * path. Also, it stores directory node related metdata details. */ -public class OmDirectoryInfo extends WithParentObjectId { +public class OmDirectoryInfo extends WithParentObjectId implements Cloneable { private String name; // directory name private long creationTime; @@ -266,4 +267,26 @@ public OmDirectoryInfo copyObject() { return builder.build(); } + + /** + * Return a new copy of the object. + */ + @Override + public Object clone() throws CloneNotSupportedException { + OmDirectoryInfo omDirectoryInfo = (OmDirectoryInfo) super.clone(); + + omDirectoryInfo.metadata = new HashMap<>(); + omDirectoryInfo.acls = new ArrayList<>(); + + acls.stream().filter(acl -> acl != null).forEach(acl -> + omDirectoryInfo.acls.add(new OzoneAcl(acl.getType(), + acl.getName(), (BitSet) acl.getAclBitSet().clone(), + acl.getAclScope()))); + + if (metadata != null) { + metadata.forEach((k, v) -> omDirectoryInfo.metadata.put(k, v)); + } + + return omDirectoryInfo; + } } diff --git a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java index 752e5b04d366..077a081195e7 100644 --- a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java +++ b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java @@ -48,7 +48,7 @@ * This is returned from OM to client, and client use class to talk to * datanode. Also, this is the metadata written to om.db on server side. */ -public final class OmKeyInfo extends WithParentObjectId { +public final class OmKeyInfo extends WithParentObjectId implements Cloneable { private static final Logger LOG = LoggerFactory.getLogger(OmKeyInfo.class); private final String volumeName; private final String bucketName; @@ -789,6 +789,36 @@ public OmKeyInfo copyObject() { return builder.build(); } + /** + * Return a new copy of the object. + */ + @Override + public Object clone() throws CloneNotSupportedException { + OmKeyInfo omKeyInfo = (OmKeyInfo) super.clone(); + + omKeyInfo.metadata = new HashMap<>(); + omKeyInfo.keyLocationVersions = new ArrayList<>(); + omKeyInfo.acls = new ArrayList<>(); + + keyLocationVersions.stream().filter(keyLocationVersion -> + keyLocationVersion != null).forEach(keyLocationVersion -> + omKeyInfo.keyLocationVersions.add( + new OmKeyLocationInfoGroup(keyLocationVersion.getVersion(), + keyLocationVersion.getLocationList(), + keyLocationVersion.isMultipartKey()))); + + acls.stream().filter(acl -> acl != null).forEach(acl -> + omKeyInfo.acls.add(new OzoneAcl(acl.getType(), + acl.getName(), (BitSet) acl.getAclBitSet().clone(), + acl.getAclScope()))); + + if (metadata != null) { + metadata.forEach((k, v) -> omKeyInfo.metadata.put(k, v)); + } + + return omKeyInfo; + } + /** * Method to clear the fileEncryptionInfo. * This method is called when a KeyDelete operation is performed. diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneListStatusHelper.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneListStatusHelper.java index cd1ad7483cfe..bb708b192371 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneListStatusHelper.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneListStatusHelper.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.TableIterator; @@ -444,6 +445,11 @@ private void getCacheValues() { continue; } + // Copy cache value to local copy and work on it + Value copyOmInfo = ObjectUtils.clone(cacheOmInfo); + if (copyOmInfo != null) { + cacheOmInfo = copyOmInfo; + } if (StringUtils.isBlank(startKey)) { // startKey is null or empty, then the seekKeyInDB="1024/" if (cacheKey.startsWith(prefixKey)) {