This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 4a6d2f01e8e HDDS-14169. Reduce copying of maps in OmKeyArgs (#9631)
4a6d2f01e8e is described below
commit 4a6d2f01e8ea8acea6ab3f6faf5ea152cae4e2d5
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Jan 30 20:21:19 2026 +0100
HDDS-14169. Reduce copying of maps in OmKeyArgs (#9631)
---
.../client/io/BlockDataStreamOutputEntryPool.java | 23 ++++++----
.../client/io/BlockOutputStreamEntryPool.java | 29 ++++++------
.../apache/hadoop/ozone/om/helpers/OmKeyArgs.java | 51 ++++++++++++++--------
3 files changed, 63 insertions(+), 40 deletions(-)
diff --git
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockDataStreamOutputEntryPool.java
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockDataStreamOutputEntryPool.java
index e5ffc2211e7..ff054c35095 100644
---
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockDataStreamOutputEntryPool.java
+++
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockDataStreamOutputEntryPool.java
@@ -22,6 +22,7 @@
import java.time.Clock;
import java.time.ZoneOffset;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
@@ -55,7 +56,8 @@ public class BlockDataStreamOutputEntryPool implements
KeyMetadataAware {
private final OzoneClientConfig config;
private int currentStreamIndex;
private final OzoneManagerProtocol omClient;
- private final OmKeyArgs keyArgs;
+ private final OmKeyArgs.Builder keyArgs;
+ private final Map<String, String> metadata = new HashMap<>();
private final XceiverClientFactory xceiverClientFactory;
private OmMultipartCommitUploadPartInfo commitUploadPartInfo;
private final long openID;
@@ -83,7 +85,7 @@ public BlockDataStreamOutputEntryPool(
.setReplicationConfig(replicationConfig).setDataSize(info.getDataSize())
.setIsMultipartKey(isMultipart).setMultipartUploadID(uploadID)
.setMultipartUploadPartNumber(partNumber)
- .setSortDatanodesInPipeline(true).build();
+ .setSortDatanodesInPipeline(true);
this.openID = openID;
this.excludeList = createExcludeList();
this.bufferList = new ArrayList<>();
@@ -163,12 +165,12 @@ void hsyncKey(long offset) throws IOException {
throw new IOException("Hsync is unsupported for multipart keys.");
} else {
if (keyArgs.getLocationInfoList().isEmpty()) {
- omClient.hsyncKey(keyArgs, openID);
+ omClient.hsyncKey(buildKeyArgs(), openID);
} else {
ContainerBlockID lastBLockId =
keyArgs.getLocationInfoList().get(keyArgs.getLocationInfoList().size() - 1)
.getBlockID().getContainerBlockID();
if (!lastUpdatedBlockId.equals(lastBLockId)) {
- omClient.hsyncKey(keyArgs, openID);
+ omClient.hsyncKey(buildKeyArgs(), openID);
lastUpdatedBlockId = lastBLockId;
}
}
@@ -235,7 +237,7 @@ private void allocateNewBlock() throws IOException {
LOG.debug("Allocating block with {}", excludeList);
}
OmKeyLocationInfo subKeyInfo =
- omClient.allocateBlock(keyArgs, openID, excludeList);
+ omClient.allocateBlock(buildKeyArgs(), openID, excludeList);
addKeyLocationInfo(subKeyInfo);
}
@@ -251,9 +253,9 @@ void commitKey(long offset) throws IOException {
// partial key of a large file.
if (keyArgs.getIsMultipartKey()) {
commitUploadPartInfo =
- omClient.commitMultipartUploadPart(keyArgs, openID);
+ omClient.commitMultipartUploadPart(buildKeyArgs(), openID);
} else {
- omClient.commitKey(keyArgs, openID);
+ omClient.commitKey(buildKeyArgs(), openID);
}
} else {
LOG.warn("Closing KeyDataStreamOutput, but key args is null");
@@ -333,6 +335,11 @@ public long getDataSize() {
@Override
public Map<String, String> getMetadata() {
- return this.keyArgs.getMetadata();
+ return metadata;
+ }
+
+ private OmKeyArgs buildKeyArgs() {
+ keyArgs.addAllMetadata(metadata);
+ return keyArgs.build();
}
}
diff --git
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockOutputStreamEntryPool.java
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockOutputStreamEntryPool.java
index d36e922c447..f3b98626f09 100644
---
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockOutputStreamEntryPool.java
+++
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockOutputStreamEntryPool.java
@@ -23,6 +23,7 @@
import java.time.Clock;
import java.time.ZoneOffset;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
@@ -72,7 +73,8 @@ public class BlockOutputStreamEntryPool implements
KeyMetadataAware {
*/
private int currentStreamIndex;
private final OzoneManagerProtocol omClient;
- private final OmKeyArgs keyArgs;
+ private final OmKeyArgs.Builder keyArgs;
+ private final Map<String, String> metadata = new HashMap<>();
private final XceiverClientFactory xceiverClientFactory;
/**
* A {@link BufferPool} shared between all
@@ -101,8 +103,7 @@ public BlockOutputStreamEntryPool(KeyOutputStream.Builder
b) {
.setDataSize(info.getDataSize())
.setIsMultipartKey(b.isMultipartKey())
.setMultipartUploadID(b.getMultipartUploadID())
- .setMultipartUploadPartNumber(b.getMultipartNumber())
- .build();
+ .setMultipartUploadPartNumber(b.getMultipartNumber());
this.openID = b.getOpenHandler().getId();
this.excludeList = createExcludeList();
@@ -156,7 +157,7 @@ BlockOutputStreamEntry createStreamEntry(OmKeyLocationInfo
subKeyInfo, boolean f
return
new BlockOutputStreamEntry.Builder()
.setBlockID(subKeyInfo.getBlockID())
- .setKey(keyArgs.getKeyName())
+ .setKey(getKeyName())
.setXceiverClientManager(xceiverClientFactory)
.setPipeline(subKeyInfo.getPipeline())
.setConfig(config)
@@ -300,7 +301,7 @@ private void allocateNewBlock(boolean forRetry) throws
IOException {
LOG.debug("Allocating block with {}", excludeList);
}
OmKeyLocationInfo subKeyInfo =
- omClient.allocateBlock(keyArgs, openID, excludeList);
+ omClient.allocateBlock(buildKeyArgs(), openID, excludeList);
addKeyLocationInfo(subKeyInfo, forRetry);
}
@@ -327,9 +328,9 @@ void commitKey(long offset) throws IOException {
// partial key of a large file.
if (keyArgs.getIsMultipartKey()) {
commitUploadPartInfo =
- omClient.commitMultipartUploadPart(keyArgs, openID);
+ omClient.commitMultipartUploadPart(buildKeyArgs(), openID);
} else {
- omClient.commitKey(keyArgs, openID);
+ omClient.commitKey(buildKeyArgs(), openID);
}
} else {
LOG.warn("Closing KeyOutputStream, but key args is null");
@@ -349,13 +350,13 @@ void hsyncKey(long offset) throws IOException {
} else {
if (keyArgs.getLocationInfoList().isEmpty()) {
MetricUtil.captureLatencyNs(clientMetrics::addOMHsyncLatency,
- () -> omClient.hsyncKey(keyArgs, openID));
+ () -> omClient.hsyncKey(buildKeyArgs(), openID));
} else {
ContainerBlockID lastBLockId =
keyArgs.getLocationInfoList().get(keyArgs.getLocationInfoList().size() - 1)
.getBlockID().getContainerBlockID();
if (!lastUpdatedBlockId.equals(lastBLockId)) {
MetricUtil.captureLatencyNs(clientMetrics::addOMHsyncLatency,
- () -> omClient.hsyncKey(keyArgs, openID));
+ () -> omClient.hsyncKey(buildKeyArgs(), openID));
lastUpdatedBlockId = lastBLockId;
}
}
@@ -431,13 +432,15 @@ boolean isEmpty() {
@Override
public Map<String, String> getMetadata() {
- if (keyArgs != null) {
- return this.keyArgs.getMetadata();
- }
- return null;
+ return metadata;
}
long getDataSize() {
return keyArgs.getDataSize();
}
+
+ private OmKeyArgs buildKeyArgs() {
+ keyArgs.addAllMetadata(metadata);
+ return keyArgs.build();
+ }
}
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java
index 395425b069e..dfe0329fbe6 100644
---
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java
@@ -19,9 +19,9 @@
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
import jakarta.annotation.Nonnull;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -36,7 +36,7 @@
* Args for key. Client use this to specify key's attributes on key creation
* (putKey()).
*/
-public final class OmKeyArgs implements Auditable {
+public final class OmKeyArgs extends WithMetadata implements Auditable {
private final String volumeName;
private final String bucketName;
private final String keyName;
@@ -47,14 +47,13 @@ public final class OmKeyArgs implements Auditable {
private final boolean isMultipartKey;
private final String multipartUploadID;
private final int multipartUploadPartNumber;
- private final Map<String, String> metadata;
private final boolean sortDatanodesInPipeline;
private final ImmutableList<OzoneAcl> acls;
private final boolean latestVersionLocation;
private final boolean recursive;
private final boolean headOp;
private final boolean forceUpdateContainerCacheFromSCM;
- private final Map<String, String> tags;
+ private final ImmutableMap<String, String> tags;
// expectedDataGeneration, when used in key creation indicates that a
// key with the same keyName should exist with the given generation.
// For a key commit to succeed, the original key should still be present
with the
@@ -64,6 +63,7 @@ public final class OmKeyArgs implements Auditable {
private Long expectedDataGeneration = null;
private OmKeyArgs(Builder b) {
+ super(b);
this.volumeName = b.volumeName;
this.bucketName = b.bucketName;
this.keyName = b.keyName;
@@ -73,7 +73,6 @@ private OmKeyArgs(Builder b) {
this.isMultipartKey = b.isMultipartKey;
this.multipartUploadID = b.multipartUploadID;
this.multipartUploadPartNumber = b.multipartUploadPartNumber;
- this.metadata = b.metadata;
this.acls = b.acls.build();
this.sortDatanodesInPipeline = b.sortDatanodesInPipeline;
this.latestVersionLocation = b.latestVersionLocation;
@@ -81,7 +80,7 @@ private OmKeyArgs(Builder b) {
this.headOp = b.headOp;
this.forceUpdateContainerCacheFromSCM = b.forceUpdateContainerCacheFromSCM;
this.ownerName = b.ownerName;
- this.tags = b.tags;
+ this.tags = b.tags.build();
this.expectedDataGeneration = b.expectedDataGeneration;
}
@@ -129,10 +128,6 @@ public void setDataSize(long size) {
dataSize = size;
}
- public Map<String, String> getMetadata() {
- return metadata;
- }
-
public void setLocationInfoList(List<OmKeyLocationInfo> locationInfoList) {
this.locationInfoList = locationInfoList;
}
@@ -220,7 +215,7 @@ public KeyArgs toProtobuf() {
/**
* Builder class of OmKeyArgs.
*/
- public static class Builder {
+ public static class Builder extends WithMetadata.Builder {
private String volumeName;
private String bucketName;
private String keyName;
@@ -231,14 +226,13 @@ public static class Builder {
private boolean isMultipartKey;
private String multipartUploadID;
private int multipartUploadPartNumber;
- private final Map<String, String> metadata = new HashMap<>();
private boolean sortDatanodesInPipeline;
private boolean latestVersionLocation;
private final AclListBuilder acls;
private boolean recursive;
private boolean headOp;
private boolean forceUpdateContainerCacheFromSCM;
- private final Map<String, String> tags = new HashMap<>();
+ private final MapBuilder<String, String> tags;
private Long expectedDataGeneration = null;
public Builder() {
@@ -247,9 +241,11 @@ public Builder() {
private Builder(AclListBuilder acls) {
this.acls = acls;
+ this.tags = MapBuilder.empty();
}
public Builder(OmKeyArgs obj) {
+ super(obj);
this.volumeName = obj.volumeName;
this.bucketName = obj.bucketName;
this.keyName = obj.keyName;
@@ -267,8 +263,7 @@ public Builder(OmKeyArgs obj) {
this.forceUpdateContainerCacheFromSCM =
obj.forceUpdateContainerCacheFromSCM;
this.expectedDataGeneration = obj.expectedDataGeneration;
- this.metadata.putAll(obj.metadata);
- this.tags.putAll(obj.tags);
+ this.tags = MapBuilder.of(obj.tags);
this.acls = AclListBuilder.of(obj.acls);
}
@@ -287,6 +282,10 @@ public Builder setKeyName(String key) {
return this;
}
+ public String getKeyName() {
+ return keyName;
+ }
+
public Builder setOwnerName(String owner) {
this.ownerName = owner;
return this;
@@ -297,6 +296,10 @@ public Builder setDataSize(long size) {
return this;
}
+ public long getDataSize() {
+ return dataSize;
+ }
+
public Builder setReplicationConfig(ReplicationConfig replConfig) {
this.replicationConfig = replConfig;
return this;
@@ -307,6 +310,10 @@ public Builder setLocationInfoList(List<OmKeyLocationInfo>
locationInfos) {
return this;
}
+ public List<OmKeyLocationInfo> getLocationInfoList() {
+ return locationInfoList;
+ }
+
public Builder setAcls(List<OzoneAcl> listOfAcls) {
this.acls.addAll(listOfAcls);
return this;
@@ -317,6 +324,10 @@ public Builder setIsMultipartKey(boolean isMultipart) {
return this;
}
+ public boolean getIsMultipartKey() {
+ return isMultipartKey;
+ }
+
public Builder setMultipartUploadID(String uploadID) {
this.multipartUploadID = uploadID;
return this;
@@ -327,20 +338,22 @@ public Builder setMultipartUploadPartNumber(int
multipartUploadPartNumber) {
return this;
}
+ @Override
public Builder addMetadata(String key, String value) {
- this.metadata.put(key, value);
+ super.addMetadata(key, value);
return this;
}
+ @Override
public Builder addAllMetadata(Map<String, String> metadatamap) {
- this.metadata.putAll(metadatamap);
+ super.addAllMetadata(metadatamap);
return this;
}
public Builder addAllMetadataGdpr(Map<String, String> metadatamap) {
addAllMetadata(metadatamap);
- if (Boolean.parseBoolean(metadata.get(OzoneConsts.GDPR_FLAG))) {
- GDPRSymmetricKey.newDefaultInstance().acceptKeyDetails(metadata::put);
+ if (metadatamap != null &&
Boolean.parseBoolean(metadatamap.get(OzoneConsts.GDPR_FLAG))) {
+
GDPRSymmetricKey.newDefaultInstance().acceptKeyDetails(this::addMetadata);
}
return this;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]