diff options
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()); } } |