summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@verizonmedia.com>2020-03-09 13:33:11 +0000
committerHenning Baldersheim <balder@verizonmedia.com>2020-03-09 13:33:11 +0000
commit6dafbbe4a7321279fc8eb5bd86be62f72fff80a0 (patch)
tree9d3fc26dd512c185cf2acc801efa2318ca74fe95
parente58c309c1efc4028bf853c41004ddf369546c7fb (diff)
void creating strings when not needed.
Do not depend on toString(), use toUtf8 instead.
-rw-r--r--component/src/main/java/com/yahoo/component/Version.java64
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java2
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java4
-rw-r--r--messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java9
-rwxr-xr-xmessagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java3
5 files changed, 46 insertions, 36 deletions
diff --git a/component/src/main/java/com/yahoo/component/Version.java b/component/src/main/java/com/yahoo/component/Version.java
index 51ff6ad5dbd..8f159fc8064 100644
--- a/component/src/main/java/com/yahoo/component/Version.java
+++ b/component/src/main/java/com/yahoo/component/Version.java
@@ -3,6 +3,7 @@ package com.yahoo.component;
import com.yahoo.text.Utf8;
import com.yahoo.text.Utf8Array;
+import com.yahoo.text.Utf8String;
import java.nio.ByteBuffer;
@@ -28,18 +29,18 @@ import java.nio.ByteBuffer;
*/
public final class Version implements Comparable<Version> {
- private int major = 0;
- private int minor = 0;
- private int micro = 0;
- private String qualifier = "";
- private String stringValue;
+ private final int major;
+ private final int minor;
+ private final int micro;
+ private final String qualifier;
+ private final Utf8Array utf8;
/** The empty version */
public static final Version emptyVersion = new Version();
/** Creates an empty version */
public Version() {
- this(0, 0, 0, null);
+ this(0, 0, 0, "");
}
/**
@@ -50,7 +51,7 @@ public final class Version implements Comparable<Version> {
* negative.
*/
public Version(int major) {
- this(major, 0, 0, null);
+ this(major, 0, 0, "");
}
/**
@@ -62,7 +63,7 @@ public final class Version implements Comparable<Version> {
* negative.
*/
public Version(int major, int minor) {
- this(major, minor, 0, null);
+ this(major, minor, 0, "");
}
/**
@@ -75,7 +76,7 @@ public final class Version implements Comparable<Version> {
* negative.
*/
public Version(int major, int minor, int micro) {
- this(major, minor, micro, null);
+ this(major, minor, micro, "");
}
/**
@@ -93,8 +94,8 @@ public final class Version implements Comparable<Version> {
this.major = major;
this.minor = minor;
this.micro = micro;
- if (qualifier != null) this.qualifier = qualifier;
- stringValue = toStringValue();
+ this.qualifier = (qualifier != null) ? qualifier : "";
+ utf8 = new Utf8String(toString());
verify();
}
@@ -120,19 +121,19 @@ public final class Version implements Comparable<Version> {
public Version(String versionString) {
if (! "".equals(versionString)) {
String[] components=versionString.split("\\."); // Split on dot
-
- if (components.length > 0)
- major = Integer.parseInt(components[0]);
- if (components.length > 1)
- minor = Integer.parseInt(components[1]);
- if (components.length > 2)
- micro = Integer.parseInt(components[2]);
- if (components.length > 3)
- qualifier = components[3];
+ major = (components.length > 0) ? Integer.parseInt(components[0]) : 0;
+ minor = (components.length > 1) ? Integer.parseInt(components[1]) : 0;
+ micro = (components.length > 2) ? Integer.parseInt(components[2]) : 0;
+ qualifier = (components.length > 3) ? components[3] : "";
if (components.length > 4)
throw new IllegalArgumentException("Too many components in '" + versionString + "'");
+ } else {
+ major = 0;
+ minor = 0;
+ micro = 0;
+ qualifier = "";
}
- stringValue = toStringValue();
+ utf8 = new Utf8String(versionString);
verify();
}
@@ -178,16 +179,21 @@ public final class Version implements Comparable<Version> {
minor = readInt(bb);
if (bb.remaining() > 0) {
micro = readInt(bb);
- if (bb.remaining() > 0) {
- qualifier = Utf8.toString(bb);
- }
+ qualifier = (bb.remaining() > 0) ? Utf8.toString(bb) : "";
+ } else {
+ micro = 0;
+ qualifier = "";
}
+ } else {
+ minor = 0;
+ micro = 0;
+ qualifier = "";
}
} else {
throw new IllegalArgumentException("Empty version specification");
}
+ utf8 = versionString;
- stringValue = versionString.toString();
verify();
}
@@ -270,10 +276,14 @@ public final class Version implements Comparable<Version> {
* The string representation of a Version specified here is a part of the API and will never change.
*/
@Override
- public String toString() { return stringValue; }
+ public String toString() { return toStringValue(); }
+
+ public Utf8Array toUtf8() {
+ return utf8 != null ? utf8 : new Utf8String(toString());
+ }
@Override
- public int hashCode() { return stringValue.hashCode(); }
+ public int hashCode() { return major*3 + minor*5 + micro*7 + qualifier.hashCode()*11; }
/** Returns whether this equals the empty version */
public boolean isEmpty() { return this.equals(emptyVersion); }
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java
index adf889a7b6f..0fd52e9bdbc 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCNetwork.java
@@ -473,7 +473,7 @@ public class RPCNetwork implements Network, MethodHandler {
synchronized (this) {
if (version == null) {
hasError = true;
- } else if (version.compareTo(this.version) < 0) {
+ } else if (version.isBefore(this.version)) {
this.version = version;
}
if (--pending == 0) {
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java
index 952bcdcfe04..ccded0e8d1b 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV1.java
@@ -64,7 +64,7 @@ public class RPCSendV1 extends RPCSend {
long timeRemaining, byte[] payload, int traceLevel) {
Request req = new Request(METHOD_NAME);
Values v = req.parameters();
- v.add(new StringValue(version.toString()));
+ v.add(new StringValue(version.toUtf8()));
v.add(new StringValue(route.toString()));
v.add(new StringValue(address.getSessionName()));
v.add(new Int8Value(msg.getRetryEnabled() ? (byte)1 : (byte)0));
@@ -140,7 +140,7 @@ public class RPCSendV1 extends RPCSend {
eMessages[i] = error.getMessage();
eServices[i] = error.getService() != null ? error.getService() : "";
}
- ret.add(new StringValue(version.toString()));
+ ret.add(new StringValue(version.toUtf8()));
ret.add(new DoubleValue(reply.getRetryDelay()));
ret.add(new Int32Array(eCodes));
ret.add(new StringArray(eMessages));
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java
index 09f7bbb15de..bb243651447 100644
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCSendV2.java
@@ -21,7 +21,6 @@ import com.yahoo.slime.BinaryFormat;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
-import com.yahoo.text.Utf8;
import com.yahoo.text.Utf8Array;
/**
@@ -88,7 +87,7 @@ public class RPCSendV2 extends RPCSend {
Slime slime = new Slime();
Cursor root = slime.setObject();
- root.setString(VERSION_F, version.toString());
+ root.setString(VERSION_F, version.toUtf8().getBytes());
root.setString(ROUTE_F, route.toString());
root.setString(SESSION_F, address.getSessionName());
root.setString(PROTOCOL_F, msg.getProtocol().toString());
@@ -162,7 +161,7 @@ public class RPCSendV2 extends RPCSend {
p.retryEnabled = root.field(USERETRY_F).asBool();
p.retry = (int)root.field(RETRY_F).asLong();
p.timeRemaining = root.field(TIMEREMAINING_F).asLong();
- p.protocolName = new Utf8Array(Utf8.toBytes(root.field(PROTOCOL_F).asString()));
+ p.protocolName = new Utf8Array(root.field(PROTOCOL_F).asUtf8());
p.payload = root.field(BLOB_F).asData();
p.traceLevel = (int)root.field(TRACELEVEL_F).asLong();
return p;
@@ -177,9 +176,9 @@ public class RPCSendV2 extends RPCSend {
Slime slime = new Slime();
Cursor root = slime.setObject();
- root.setString(VERSION_F, version.toString());
+ root.setString(VERSION_F, version.toUtf8().getBytes());
root.setDouble(RETRYDELAY_F, reply.getRetryDelay());
- root.setString(PROTOCOL_F, reply.getProtocol().toString());
+ root.setString(PROTOCOL_F, reply.getProtocol().getBytes());
root.setData(BLOB_F, payload);
if (reply.getTrace().getLevel() > 0) {
root.setString(TRACE_F, reply.getTrace().getRoot().encode());
diff --git a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java
index fe248c6b8df..53c0c855116 100755
--- a/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java
+++ b/messagebus/src/main/java/com/yahoo/messagebus/network/rpc/RPCTarget.java
@@ -8,6 +8,7 @@ import com.yahoo.jrt.Spec;
import com.yahoo.jrt.Supervisor;
import com.yahoo.jrt.Target;
import com.yahoo.log.LogLevel;
+import com.yahoo.text.Utf8Array;
import java.util.LinkedList;
import java.util.List;
@@ -133,7 +134,7 @@ public class RPCTarget implements RequestWaiter {
synchronized (this) {
targetInvoked = false;
if (req.checkReturnTypes("s")) {
- String str = req.returnValues().get(0).asString();
+ Utf8Array str = req.returnValues().get(0).asUtf8Array();
try {
version = new Version(str);
if (shouldLog) {