summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-05-07 22:01:35 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-05-07 22:04:34 +0200
commit72e079d83f14d02398bdb230895fac93736ef610 (patch)
tree31b23415da6b8fb7f3764cbc003e4894bfb7a32e /config
parent3b74f23bd3c773a8924fe9f23aaf4f9563168c8f (diff)
Use AbstractUtf8Array in interface and a more flexible implementation to reduce amount of copying.
Diffstat (limited to 'config')
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/ConfigPayload.java17
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/ConfigResponse.java4
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/JRTServerConfigRequestV3.java8
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/Payload.java15
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/protocol/SlimeConfigResponse.java14
5 files changed, 35 insertions, 23 deletions
diff --git a/config/src/main/java/com/yahoo/vespa/config/ConfigPayload.java b/config/src/main/java/com/yahoo/vespa/config/ConfigPayload.java
index 8153179e49c..94f07a52641 100644
--- a/config/src/main/java/com/yahoo/vespa/config/ConfigPayload.java
+++ b/config/src/main/java/com/yahoo/vespa/config/ConfigPayload.java
@@ -5,16 +5,18 @@ import com.yahoo.config.ConfigInstance;
import com.yahoo.config.codegen.InnerCNode;
import com.yahoo.config.subscription.ConfigInstanceSerializer;
import com.yahoo.config.subscription.ConfigInstanceUtil;
+import com.yahoo.io.Utf8ByteWriter;
import com.yahoo.slime.JsonDecoder;
import com.yahoo.slime.JsonFormat;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeFormat;
-import com.yahoo.text.Utf8Array;
+import com.yahoo.text.AbstractUtf8Array;
+import com.yahoo.text.Utf8PartialArray;
import com.yahoo.text.Utf8String;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
/**
* A config payload.
@@ -79,19 +81,20 @@ public class ConfigPayload {
return !slime.get().valid() || slime.get().children() == 0;
}
- public Utf8Array toUtf8Array(boolean compact) {
- ByteArrayOutputStream os = new ByteArrayOutputStream(10000);
+ public AbstractUtf8Array toUtf8Array(boolean compact) {
+ Utf8ByteWriter os = new Utf8ByteWriter(8192);
try {
new JsonFormat(compact).encode(os, slime);
os.close();
} catch (IOException e) {
e.printStackTrace();
}
- return new Utf8Array(os.toByteArray());
+ ByteBuffer buf = os.getBuf();
+ return new Utf8PartialArray(buf.array(), buf.arrayOffset() + buf.position(), buf.remaining());
}
- public static ConfigPayload fromUtf8Array(Utf8Array payload) {
- return new ConfigPayload(new JsonDecoder().decode(new Slime(), payload.getBytes()));
+ public static ConfigPayload fromUtf8Array(AbstractUtf8Array payload) {
+ return new ConfigPayload(new JsonDecoder().decode(new Slime(), payload.wrap()));
}
public <ConfigType extends ConfigInstance> ConfigType toInstance(Class<ConfigType> clazz, String configId) {
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/ConfigResponse.java b/config/src/main/java/com/yahoo/vespa/config/protocol/ConfigResponse.java
index 31e280e708c..f6fce56c227 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/ConfigResponse.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/ConfigResponse.java
@@ -1,7 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.protocol;
-import com.yahoo.text.Utf8Array;
+import com.yahoo.text.AbstractUtf8Array;
import java.io.IOException;
import java.io.OutputStream;
@@ -16,7 +16,7 @@ import java.io.OutputStream;
*/
public interface ConfigResponse {
- Utf8Array getPayload();
+ AbstractUtf8Array getPayload();
long getGeneration();
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/JRTServerConfigRequestV3.java b/config/src/main/java/com/yahoo/vespa/config/protocol/JRTServerConfigRequestV3.java
index 53a2f4019f9..441ceb428af 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/JRTServerConfigRequestV3.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/JRTServerConfigRequestV3.java
@@ -14,6 +14,7 @@ import com.yahoo.vespa.config.util.ConfigUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.nio.ByteBuffer;
import java.util.Optional;
import java.util.logging.Logger;
@@ -99,7 +100,12 @@ public class JRTServerConfigRequestV3 implements JRTServerConfigRequest {
}
request.returnValues().add(createResponseValue(byteArrayOutputStream));
if (changedConfigAndNewGeneration) {
- request.returnValues().add(new DataValue(responsePayload.getData().getBytes()));
+ ByteBuffer buf = responsePayload.getData().wrap();
+ if (buf.hasArray() && buf.remaining() == buf.array().length) {
+ request.returnValues().add(new DataValue(buf.array()));
+ } else {
+ request.returnValues().add(new DataValue(buf));
+ }
} else {
request.returnValues().add(new DataValue(new byte[0]));
}
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/Payload.java b/config/src/main/java/com/yahoo/vespa/config/protocol/Payload.java
index 13f9602f70c..f0b8640c3f6 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/Payload.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/Payload.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.protocol;
+import com.yahoo.text.AbstractUtf8Array;
import com.yahoo.text.Utf8Array;
import com.yahoo.text.Utf8String;
import com.yahoo.vespa.config.ConfigPayload;
@@ -16,7 +17,7 @@ import java.util.Objects;
*/
public class Payload {
- private final Utf8Array data;
+ private final AbstractUtf8Array data;
private final CompressionInfo compressionInfo;
private final static LZ4PayloadCompressor compressor = new LZ4PayloadCompressor();
@@ -25,7 +26,7 @@ public class Payload {
this.compressionInfo = CompressionInfo.create(CompressionType.UNCOMPRESSED, data.getByteLength());
}
- private Payload(Utf8Array payload, CompressionInfo compressionInfo) {
+ private Payload(AbstractUtf8Array payload, CompressionInfo compressionInfo) {
Objects.requireNonNull(payload, "Payload");
Objects.requireNonNull(compressionInfo, "CompressionInfo");
this.data = payload;
@@ -46,26 +47,26 @@ public class Payload {
}
/** Creates an uncompressed payload from an Utf8Array */
- public static Payload from(Utf8Array payload) {
+ public static Payload from(AbstractUtf8Array payload) {
return new Payload(payload, CompressionInfo.uncompressed());
}
- public static Payload from(Utf8Array payload, CompressionInfo compressionInfo) {
+ public static Payload from(AbstractUtf8Array payload, CompressionInfo compressionInfo) {
return new Payload(payload, compressionInfo);
}
- public Utf8Array getData() { return data; }
+ public AbstractUtf8Array getData() { return data; }
/** Returns a copy of this payload where the data is compressed using the given compression */
public Payload withCompression(CompressionType requestedCompression) {
CompressionType responseCompression = compressionInfo.getCompressionType();
if (requestedCompression == CompressionType.UNCOMPRESSED && responseCompression == CompressionType.LZ4) {
- byte[] buffer = compressor.decompress(data.getBytes(), compressionInfo.getUncompressedSize());
+ byte[] buffer = compressor.decompress(data.wrap(), compressionInfo.getUncompressedSize());
Utf8Array data = new Utf8Array(buffer);
CompressionInfo info = CompressionInfo.create(CompressionType.UNCOMPRESSED, compressionInfo.getUncompressedSize());
return Payload.from(data, info);
} else if (requestedCompression == CompressionType.LZ4 && responseCompression == CompressionType.UNCOMPRESSED) {
- Utf8Array data = new Utf8Array(compressor.compress(this.data.getBytes()));
+ Utf8Array data = new Utf8Array(compressor.compress(this.data.wrap()));
CompressionInfo info = CompressionInfo.create(CompressionType.LZ4, this.data.getByteLength());
return Payload.from(data, info);
} else {
diff --git a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeConfigResponse.java b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeConfigResponse.java
index 1fec7e17d06..1ccf6e367fc 100644
--- a/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeConfigResponse.java
+++ b/config/src/main/java/com/yahoo/vespa/config/protocol/SlimeConfigResponse.java
@@ -1,11 +1,12 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.protocol;
-import com.yahoo.text.Utf8Array;
+import com.yahoo.text.AbstractUtf8Array;
import com.yahoo.vespa.config.ConfigPayload;
import java.io.IOException;
import java.io.OutputStream;
+import java.nio.ByteBuffer;
/**
* Class for serializing config responses based on {@link com.yahoo.slime.Slime} implementing the {@link ConfigResponse} interface.
@@ -14,7 +15,7 @@ import java.io.OutputStream;
*/
public class SlimeConfigResponse implements ConfigResponse {
- private final Utf8Array payload;
+ private final AbstractUtf8Array payload;
private final CompressionInfo compressionInfo;
private final long generation;
private final boolean applyOnRestart;
@@ -22,13 +23,13 @@ public class SlimeConfigResponse implements ConfigResponse {
public static SlimeConfigResponse fromConfigPayload(ConfigPayload payload, long generation,
boolean applyOnRestart, String configMd5) {
- Utf8Array data = payload.toUtf8Array(true);
+ AbstractUtf8Array data = payload.toUtf8Array(true);
return new SlimeConfigResponse(data, generation, applyOnRestart,
configMd5,
CompressionInfo.create(CompressionType.UNCOMPRESSED, data.getByteLength()));
}
- public SlimeConfigResponse(Utf8Array payload,
+ public SlimeConfigResponse(AbstractUtf8Array payload,
long generation,
boolean applyOnRestart,
String configMd5,
@@ -41,7 +42,7 @@ public class SlimeConfigResponse implements ConfigResponse {
}
@Override
- public Utf8Array getPayload() {
+ public AbstractUtf8Array getPayload() {
return payload;
}
@@ -60,7 +61,8 @@ public class SlimeConfigResponse implements ConfigResponse {
@Override
public void serialize(OutputStream os, CompressionType type) throws IOException {
- os.write(Payload.from(payload, compressionInfo).withCompression(type).getData().getBytes());
+ ByteBuffer buf = Payload.from(payload, compressionInfo).withCompression(type).getData().wrap();
+ os.write(buf.array(), buf.arrayOffset()+buf.position(), buf.remaining());
}
@Override