summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java5
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java14
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java6
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java16
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java3
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/WantedStateTest.java2
-rw-r--r--jrt/src/com/yahoo/jrt/Acceptor.java2
-rw-r--r--jrt/src/com/yahoo/jrt/Connection.java3
-rw-r--r--jrt/src/com/yahoo/jrt/Spec.java49
-rw-r--r--jrt/tests/com/yahoo/jrt/SpecTest.java16
10 files changed, 50 insertions, 66 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
index d846bba1ad1..d8bb1546831 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RpcServer.java
@@ -16,6 +16,7 @@ import com.yahoo.jrt.slobrok.api.BackOffPolicy;
import com.yahoo.jrt.slobrok.api.Register;
import com.yahoo.jrt.slobrok.api.SlobrokList;
import com.yahoo.log.LogLevel;
+import com.yahoo.net.HostName;
import com.yahoo.vdslib.state.ClusterState;
import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
@@ -110,8 +111,8 @@ public class RpcServer {
slobroks.append(" )");
SlobrokList slist = new SlobrokList();
slist.setup(slobrokConnectionSpecs);
- Spec spec = Spec.fromLocalHostName(acceptor.port());
- log.log(LogLevel.INFO, "Connecting to slobrok at " + spec + " using connection spec " + slobroks);
+ Spec spec = new Spec(HostName.getLocalhost(), acceptor.port());
+ log.log(LogLevel.INFO, "Registering " + spec + " with slobrok at " + slobroks);
if (slobrokBackOffPolicy != null) {
register = new Register(supervisor, slist, spec, slobrokBackOffPolicy);
} else {
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java
index 65661d99d4a..2b37d29e2ec 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java
@@ -1,8 +1,13 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.clustercontroller.core;
-import com.yahoo.jrt.*;
+import com.yahoo.jrt.ErrorCode;
+import com.yahoo.jrt.Request;
+import com.yahoo.jrt.Spec;
import com.yahoo.jrt.StringValue;
+import com.yahoo.jrt.Supervisor;
+import com.yahoo.jrt.Target;
+import com.yahoo.jrt.Transport;
import com.yahoo.vdslib.state.Node;
import com.yahoo.vdslib.state.NodeState;
import com.yahoo.vdslib.state.NodeType;
@@ -10,13 +15,14 @@ import com.yahoo.vdslib.state.State;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Logger;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
public class DatabaseTest extends FleetControllerTest {
private static Logger log = Logger.getLogger(DatabaseTest.class.getName());
@@ -36,7 +42,7 @@ public class DatabaseTest extends FleetControllerTest {
if (supervisor == null) {
supervisor = new Supervisor(new Transport());
}
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("setNodeState");
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java
index 03eddd86615..d4cb988a986 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java
@@ -44,7 +44,7 @@ public class MasterElectionTest extends FleetControllerTest {
this.options.zooKeeperSessionTimeout = 10 * timeoutMS;
this.options.zooKeeperServerAddress = zooKeeperServer.getAddress();
this.options.slobrokConnectionSpecs = new String[1];
- this.options.slobrokConnectionSpecs[0] = Spec.fromLocalHostName(slobrok.port()).toString();
+ this.options.slobrokConnectionSpecs[0] = "tcp/localhost:" + slobrok.port();
this.options.fleetControllerCount = count;
for (int i=0; i<count; ++i) {
FleetControllerOptions nodeOptions = options.clone();
@@ -60,7 +60,7 @@ public class MasterElectionTest extends FleetControllerTest {
options.zooKeeperSessionTimeout = 10 * timeoutMS;
options.zooKeeperServerAddress = zooKeeperServer.getAddress();
options.slobrokConnectionSpecs = new String[1];
- options.slobrokConnectionSpecs[0] = Spec.fromLocalHostName(slobrok.port()).toString();
+ options.slobrokConnectionSpecs[0] = "tcp/localhost:" + slobrok.port(); // Spec.fromLocalHostName(slobrok.port()).toString();
options.fleetControllerIndex = fleetControllerIndex;
options.fleetControllerCount = fleetControllerCount;
return options;
@@ -353,7 +353,7 @@ public class MasterElectionTest extends FleetControllerTest {
List<Target> connections = new ArrayList<Target>();
for (FleetController fleetController : fleetControllers) {
int rpcPort = fleetController.getRpcPort();
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
connections.add(connection);
}
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java
index 33145644d23..04449b45679 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java
@@ -57,7 +57,7 @@ public class RpcServerTest extends FleetControllerTest {
startingTest("RpcServerTest::testRebinding");
Slobrok slobrok = new Slobrok();
String slobrokConnectionSpecs[] = new String[1];
- slobrokConnectionSpecs[0] = Spec.fromLocalHostName(slobrok.port()).toString();
+ slobrokConnectionSpecs[0] = "tcp/localhost:" + slobrok.port();
RpcServer server = new RpcServer(timer, new Object(), "mycluster", 0, new BackOff());
server.setSlobrokConnectionSpecs(slobrokConnectionSpecs, 0);
int portUsed = server.getPort();
@@ -127,7 +127,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(Spec.fromLocalHostName(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("getSystemState");
@@ -145,7 +145,7 @@ public class RpcServerTest extends FleetControllerTest {
if (supervisor == null) {
supervisor = new Supervisor(new Transport());
}
- Target connection = supervisor.connect(Spec.fromLocalHostName(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Node node = new Node(nodeType, nodeIndex);
@@ -193,7 +193,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("getNodeState");
@@ -498,7 +498,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("setNodeState");
@@ -543,7 +543,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("setNodeState");
@@ -580,7 +580,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
Request req = new Request("getMaster");
@@ -604,7 +604,7 @@ public class RpcServerTest extends FleetControllerTest {
int rpcPort = fleetController.getRpcPort();
supervisor = new Supervisor(new Transport());
- Target connection = supervisor.connect(new Spec(rpcPort));
+ Target connection = supervisor.connect(new Spec("localhost", rpcPort));
assertTrue(connection.isValid());
// Possibly do request multiple times if we haven't lost slobrok contact first times yet.
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java
index 194b51aa440..e2191c9f739 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java
@@ -1,7 +1,6 @@
// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.clustercontroller.core;
-import com.yahoo.jrt.Spec;
import com.yahoo.log.LogLevel;
import org.junit.Test;
@@ -35,7 +34,7 @@ public class StateGatherTest extends FleetControllerTest {
options.nodeStateRequestTimeoutLatestPercentage = 80;
setUpFleetController(true, options);
String connectionSpecs[] = new String[1];
- connectionSpecs[0] = Spec.fromLocalHostName(slobrok.port()).toString();
+ connectionSpecs[0] = "tcp/localhost:" + slobrok.port();
DummyVdsNodeOptions dummyOptions = new DummyVdsNodeOptions();
DummyVdsNode dnode = new DummyVdsNode(timer, dummyOptions, connectionSpecs, this.options.clusterName, true, 0);
DummyVdsNode snode = new DummyVdsNode(timer, dummyOptions, connectionSpecs, this.options.clusterName, false, 0);
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/WantedStateTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/WantedStateTest.java
index 8065d701f6b..3c4084d304c 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/WantedStateTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/WantedStateTest.java
@@ -32,7 +32,7 @@ public class WantedStateTest extends FleetControllerTest {
public void setWantedState(DummyVdsNode node, State state, String reason) {
NodeState ns = new NodeState(node.getType(), state);
if (reason != null) ns.setDescription(reason);
- Target connection = supervisor.connect(new Spec(fleetController.getRpcPort()));
+ Target connection = supervisor.connect(new Spec("localhost", fleetController.getRpcPort()));
Request req = new Request("setNodeState");
req.parameters().add(new StringValue(node.getSlobrokName()));
req.parameters().add(new StringValue(ns.serialize()));
diff --git a/jrt/src/com/yahoo/jrt/Acceptor.java b/jrt/src/com/yahoo/jrt/Acceptor.java
index 0f40c6c8e55..7316f8c620b 100644
--- a/jrt/src/com/yahoo/jrt/Acceptor.java
+++ b/jrt/src/com/yahoo/jrt/Acceptor.java
@@ -47,7 +47,7 @@ public class Acceptor {
if (spec.port() != 0) {
serverChannel.socket().setReuseAddress(true);
}
- serverChannel.socket().bind(spec.listenAddress(), 500);
+ serverChannel.socket().bind(spec.address(), 500);
} catch (Exception e) {
if (serverChannel != null) {
try { serverChannel.socket().close(); } catch (Exception x) {}
diff --git a/jrt/src/com/yahoo/jrt/Connection.java b/jrt/src/com/yahoo/jrt/Connection.java
index 24efdf46087..3e28b5d1d6c 100644
--- a/jrt/src/com/yahoo/jrt/Connection.java
+++ b/jrt/src/com/yahoo/jrt/Connection.java
@@ -162,8 +162,9 @@ class Connection extends Target {
setLostReason(new IllegalArgumentException("jrt: malformed or missing spec"));
return this;
}
+
try {
- channel = SocketChannel.open(spec.connectAddress());
+ channel = SocketChannel.open(spec.address());
} catch (Exception e) {
setLostReason(e);
}
diff --git a/jrt/src/com/yahoo/jrt/Spec.java b/jrt/src/com/yahoo/jrt/Spec.java
index d40e773df68..e20bb9109dc 100644
--- a/jrt/src/com/yahoo/jrt/Spec.java
+++ b/jrt/src/com/yahoo/jrt/Spec.java
@@ -2,8 +2,6 @@
package com.yahoo.jrt;
-import com.yahoo.net.HostName;
-
import java.net.InetSocketAddress;
import java.net.SocketAddress;
@@ -61,24 +59,22 @@ public class Spec {
}
/**
- * Create a Spec from a port number.
+ * Create a Spec that will produce a wildcard address with address, and the
+ * hostname of the localhost with connectAddress.
*
- * @param port port number
+ * WARNING: Do not use omit host if connecting (to localhost) - use Spec("localhost", port) instead.
+ * Why? Because the SocketAddress obtained from spec is independent on whether to use the address
+ * for listening socket or connecting socket. A listening socket without host means the wildcard address
+ * is used. But when using the wildcard address for connecting, Java ends up getting the canonical
+ * hostname for localhost, which may not be reachable if on WiFi-only, see HostName.getLocalhost for details.
+ *
+ * @param port
*/
public Spec(int port) {
this.port = port;
}
/**
- * Creates a Spec with the hostname of the current/local host and given port
- *
- * @param port port number
- */
- public static Spec fromLocalHostName(int port) {
- return new Spec(HostName.getLocalhost(), port);
- }
-
- /**
* Obtain the host name of this address
*
* @return host name
@@ -112,34 +108,15 @@ public class Spec {
*
* @return listening socket address
*/
- SocketAddress listenAddress() {
- return address(host);
- }
-
- /**
- * Resolve the connect socket address for this Spec. If this Spec is
- * malformed, this method will return null.
- *
- * Why is this different than listenAddress()? If no host is given, a SocketAddress will be bound
- * to the wildcard address (INADDR_ANY or 0.0.0.0 assuming IPv4) by InetSocketAddress. A wildcard
- * address used to connect (at least SocketChannel::open) is interpreted as InetAddress::getLocalHost,
- * which is wrong for the reasons stated in HostName::getLocalhost.
- *
- * @return connect socket address
- */
- SocketAddress connectAddress() {
- return address(HostName.getLocalhost());
- }
-
- private SocketAddress address(String hostOverride) {
+ SocketAddress address() {
if (malformed) {
return null;
}
if (address == null) {
- if (hostOverride == null) {
- address = new InetSocketAddress(port);
+ if (host == null) {
+ return new InetSocketAddress(port);
} else {
- address = new InetSocketAddress(hostOverride, port);
+ return new InetSocketAddress(host, port);
}
}
return address;
diff --git a/jrt/tests/com/yahoo/jrt/SpecTest.java b/jrt/tests/com/yahoo/jrt/SpecTest.java
index ec88f164a7a..d15b8f95d30 100644
--- a/jrt/tests/com/yahoo/jrt/SpecTest.java
+++ b/jrt/tests/com/yahoo/jrt/SpecTest.java
@@ -17,7 +17,7 @@ public class SpecTest extends junit.framework.TestCase {
assertFalse(spec.malformed());
assertEquals(457, spec.port());
assertNull(spec.host());
- assertTrue(addr.equals(spec.listenAddress()));
+ assertTrue(addr.equals(spec.address()));
}
public void testHostPort() {
@@ -29,7 +29,7 @@ public class SpecTest extends junit.framework.TestCase {
assertFalse(spec.malformed());
assertEquals(457, spec.port());
assertEquals(host, spec.host());
- assertTrue(addr.equals(spec.listenAddress()));
+ assertTrue(addr.equals(spec.address()));
}
public void testBogusHostPort() {
@@ -41,7 +41,7 @@ public class SpecTest extends junit.framework.TestCase {
assertFalse(spec.malformed());
assertEquals(457, spec.port());
assertEquals(host, spec.host());
- assertTrue(addr.equals(spec.listenAddress()));
+ assertTrue(addr.equals(spec.address()));
}
public void testSpec1() {
@@ -52,7 +52,7 @@ public class SpecTest extends junit.framework.TestCase {
assertFalse(spec.malformed());
assertEquals(8080, spec.port());
assertEquals("localhost", spec.host());
- assertTrue(addr.equals(spec.listenAddress()));
+ assertTrue(addr.equals(spec.address()));
}
public void testSpec2() {
@@ -63,7 +63,7 @@ public class SpecTest extends junit.framework.TestCase {
assertFalse(spec.malformed());
assertEquals(8080, spec.port());
assertNull(spec.host());
- assertTrue(addr.equals(spec.listenAddress()));
+ assertTrue(addr.equals(spec.address()));
}
public void testBogusSpec1() {
@@ -73,7 +73,7 @@ public class SpecTest extends junit.framework.TestCase {
assertTrue(spec.malformed());
assertEquals(0, spec.port());
assertNull(spec.host());
- assertNull(spec.listenAddress());
+ assertNull(spec.address());
}
public void testBogusSpec2() {
@@ -83,7 +83,7 @@ public class SpecTest extends junit.framework.TestCase {
assertTrue(spec.malformed());
assertEquals(0, spec.port());
assertNull(spec.host());
- assertNull(spec.listenAddress());
+ assertNull(spec.address());
}
public void testBogusSpec3() {
@@ -93,6 +93,6 @@ public class SpecTest extends junit.framework.TestCase {
assertTrue(spec.malformed());
assertEquals(0, spec.port());
assertNull(spec.host());
- assertNull(spec.listenAddress());
+ assertNull(spec.address());
}
}