diff options
author | Harald Musum <musum@oath.com> | 2017-12-20 14:52:09 +0100 |
---|---|---|
committer | Harald Musum <musum@oath.com> | 2017-12-20 14:52:09 +0100 |
commit | 46891da4d53024b7af652e17a923a8db10b5b9f0 (patch) | |
tree | 2d0f664e399349bdd21e5fd0b559aa79f30e8bad | |
parent | 2be1c34825fda8bdf9711c1e7522989fe3a8a45e (diff) |
Order config server connect string so that localhost always comes first
-rw-r--r-- | zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java | 32 | ||||
-rw-r--r-- | zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java | 15 |
2 files changed, 36 insertions, 11 deletions
diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java index 15257e11cbe..87f73e9e147 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.curator; import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; +import com.yahoo.net.HostName; import com.yahoo.path.Path; import com.yahoo.vespa.curator.recipes.CuratorCounter; import com.yahoo.vespa.zookeeper.ZooKeeperServer; @@ -21,8 +22,8 @@ import org.apache.curator.framework.state.ConnectionState; import org.apache.curator.framework.state.ConnectionStateListener; import org.apache.curator.retry.ExponentialBackoffRetry; -import java.io.Closeable; import java.time.Duration; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -69,17 +70,28 @@ public class Curator implements AutoCloseable { } private static String createConnectionSpec(ConfigserverConfig config) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < config.zookeeperserver().size(); i++) { + List<String> servers = createAndOrderServerList(config); + System.out.println(servers); + return String.join(",", servers); + } + + private static List<String> createAndOrderServerList(ConfigserverConfig config) { + String hostName = HostName.getLocalhost(); + int configServerCount = config.zookeeperserver().size(); + + System.out.println(config); + List<String> servers = new ArrayList<>(); + + int indexForThisConfigServer = 0; + for (int i = 0; i < configServerCount; i++) { ConfigserverConfig.Zookeeperserver server = config.zookeeperserver(i); - sb.append(server.hostname()); - sb.append(":"); - sb.append(server.port()); - if (i < config.zookeeperserver().size() - 1) { - sb.append(","); - } + servers.add(server.hostname() + ":" + server.port()); + if (server.hostname().equals(hostName)) + indexForThisConfigServer = i; } - return sb.toString(); + // Rotate list of servers so that config server on this host is first in the list + Collections.rotate(servers, configServerCount - indexForThisConfigServer); + return servers; } /** diff --git a/zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java b/zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java index 36205bdaca3..fb747df9021 100644 --- a/zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java +++ b/zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.zookeeper; import com.yahoo.cloud.config.ConfigserverConfig; +import com.yahoo.net.HostName; import com.yahoo.vespa.curator.Curator; import org.apache.curator.test.TestingServer; import org.junit.After; @@ -11,7 +12,7 @@ import org.junit.Test; import java.io.IOException; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** @@ -74,6 +75,18 @@ public class CuratorTest { } } + @Test + public void require_that_server_order_is_correct() { + ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder(); + builder.zookeeperserver(createZKBuilder("localhost", port1)); + builder.zookeeperserver(createZKBuilder(HostName.getLocalhost(), port2)); + try (Curator curator = createCurator(new ConfigserverConfig(builder))) { + assertThat(curator.serverCount(), is(2)); + // host this is running on should come first + assertEquals(HostName.getLocalhost() + ":" + port2 + ",localhost:" + port1, curator.connectionSpec()); + } + } + private ConfigserverConfig createTestConfig() { ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder(); builder.zookeeperserver(createZKBuilder("localhost", port1)); |