diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-05-07 22:01:35 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-05-07 22:04:34 +0200 |
commit | 72e079d83f14d02398bdb230895fac93736ef610 (patch) | |
tree | 31b23415da6b8fb7f3764cbc003e4894bfb7a32e /config | |
parent | 3b74f23bd3c773a8924fe9f23aaf4f9563168c8f (diff) |
Use AbstractUtf8Array in interface and a more flexible implementation to reduce amount of copying.
Diffstat (limited to 'config')
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 |