aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2017-12-20 14:52:09 +0100
committerHarald Musum <musum@oath.com>2017-12-20 14:52:09 +0100
commit46891da4d53024b7af652e17a923a8db10b5b9f0 (patch)
tree2d0f664e399349bdd21e5fd0b559aa79f30e8bad
parent2be1c34825fda8bdf9711c1e7522989fe3a8a45e (diff)
Order config server connect string so that localhost always comes first
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java32
-rw-r--r--zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java15
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));