summaryrefslogtreecommitdiffstats
path: root/jrt
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-05-28 20:35:45 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-05-28 20:35:45 +0200
commit8203f3361a8c711fd83e077a50f2b2ad6edaa3e9 (patch)
tree46677683f670a3f27a6620e006bd142812307959 /jrt
parent566e6fece1717a03af4f03eeadb50abff3d13031 (diff)
Keep the spec final.
Create the address when needed in the async connect thread. Implement hash/equal/compareTo for Spec to avoid toString. Use Spec as key and avoid creating it every time.
Diffstat (limited to 'jrt')
-rw-r--r--jrt/src/com/yahoo/jrt/Spec.java39
-rw-r--r--jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java7
-rw-r--r--jrt/tests/com/yahoo/jrt/SlobrokTest.java8
3 files changed, 40 insertions, 14 deletions
diff --git a/jrt/src/com/yahoo/jrt/Spec.java b/jrt/src/com/yahoo/jrt/Spec.java
index 7e4f6d987fa..f4b70bd4f9e 100644
--- a/jrt/src/com/yahoo/jrt/Spec.java
+++ b/jrt/src/com/yahoo/jrt/Spec.java
@@ -3,15 +3,15 @@ package com.yahoo.jrt;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
+import java.util.Objects;
/**
* A Spec is a network address used for either listening or
* connecting.
*/
-public class Spec {
+public class Spec implements Comparable<Spec> {
- private final SocketAddress address;
private final String host;
private final int port;
private final boolean malformed;
@@ -57,13 +57,11 @@ public class Spec {
port = portNum;
malformed = ! correct;
host = correct ? hostStr : null;
- address = correct ? createAddress(host, port) : null;
asString = correct ? createString(host, port) : "MALFORMED";
} else {
malformed = true;
port = 0;
host = null;
- address = null;
asString = "MALFORMED";
}
}
@@ -79,7 +77,6 @@ public class Spec {
this.port = port;
malformed = false;
asString = createString(host, port);
- address = createAddress(host, port);
}
/**
@@ -130,7 +127,7 @@ public class Spec {
* @return socket address
*/
SocketAddress address() {
- return address;
+ return !malformed ? createAddress(host, port) : null;
}
/**
@@ -143,4 +140,34 @@ public class Spec {
return asString;
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Spec spec = (Spec) o;
+ return port == spec.port &&
+ malformed == spec.malformed &&
+ Objects.equals(host, spec.host);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(host, port, malformed);
+ }
+
+ @Override
+ public int compareTo(Spec o) {
+ int cmp = 0;
+ if ((host != null) && (o.host != null)) {
+ cmp = host.compareTo(o.host);
+ } else if (host != null) {
+ return -1;
+ } else if (o.host != null) {
+ return 1;
+ }
+ return (cmp == 0)
+ ? Integer.compare(port, o.port)
+ : cmp;
+
+ }
}
diff --git a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
index 9ed8eafbd30..31d7543304a 100644
--- a/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
+++ b/jrt/src/com/yahoo/jrt/slobrok/api/Mirror.java
@@ -315,12 +315,12 @@ public class Mirror implements IMirror {
public static final class Entry implements Comparable<Entry> {
private final String name;
- private final String spec;
+ private final Spec spec;
private final char [] nameArray;
public Entry(String name, String spec) {
this.name = name;
- this.spec = spec;
+ this.spec = new Spec(spec);
this.nameArray = name.toCharArray();
}
@@ -343,7 +343,8 @@ public class Mirror implements IMirror {
char [] getNameArray() { return nameArray; }
public String getName() { return name; }
- public String getSpec() { return spec; }
+ public Spec getSpec() { return spec; }
+ public String getSpecString() { return spec.toString(); }
}
diff --git a/jrt/tests/com/yahoo/jrt/SlobrokTest.java b/jrt/tests/com/yahoo/jrt/SlobrokTest.java
index 20266b0826a..552780dd0fd 100644
--- a/jrt/tests/com/yahoo/jrt/SlobrokTest.java
+++ b/jrt/tests/com/yahoo/jrt/SlobrokTest.java
@@ -88,14 +88,14 @@ public class SlobrokTest {
err(" { EMPTY }");
}
for (Entry e : actual) {
- err(" {" + e.getName() + ", " + e.getSpec() + "}");
+ err(" {" + e.getName() + ", " + e.getSpecString() + "}");
}
err("expected values:");
if (expect.isEmpty()) {
err(" { EMPTY }");
}
for (Entry e : expect) {
- err(" {" + e.getName() + ", " + e.getSpec() + "}");
+ err(" {" + e.getName() + ", " + e.getSpecString() + "}");
}
}
@@ -119,9 +119,7 @@ public class SlobrokTest {
assertFalse(one.equals(null));
assertFalse(one.equals(register));
assertTrue(one.getName().equals(wantName));
- assertTrue(one.getSpec().equals(mySpec));
- int wantHC = mySpec.hashCode() + wantName.hashCode();
- assertTrue(one.hashCode() == wantHC);
+ assertTrue(one.getSpecString().equals(mySpec));
register.registerName("B/x");
check("B/x", new SpecList().add("B/x", mySpec));