aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-12-20 15:15:16 +0100
committerGitHub <noreply@github.com>2017-12-20 15:15:16 +0100
commita8662ee3e07e3608eea25d8312080ca4e12e865a (patch)
tree5186929388b309dfbe24662bd7e0472089021282
parentd7987cfa2f23783e55255814451c7417110c9499 (diff)
parent873529690dfe5b37bacb3c8ee42f8bec7f771d15 (diff)
Merge pull request #4504 from vespa-engine/hmusum/order-zookeeper-server-list-so-localhost-comes-first
Hmusum/order zookeeper server list so localhost comes first
-rw-r--r--zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java30
-rw-r--r--zkfacade/src/test/java/com/yahoo/vespa/zookeeper/CuratorTest.java17
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..a9d099fea31 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,26 @@ 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);
+ return String.join(",", servers);
+ }
+
+ private static List<String> createAndOrderServerList(ConfigserverConfig config) {
+ String hostName = HostName.getLocalhost();
+ int configServerCount = config.zookeeperserver().size();
+ 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
+ if (indexForThisConfigServer != 0)
+ 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..396555d5e3a 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,8 +12,8 @@ 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.assertThat;
+import static org.junit.Assert.assertTrue;
/**
* Sets up actual ZooKeeper servers and verifies we can talk to them.
@@ -74,6 +75,20 @@ 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));
+ builder.zookeeperserver(createZKBuilder("localhost", 1234));
+ builder.zookeeperserver(createZKBuilder("localhost", 6789));
+ try (Curator curator = createCurator(new ConfigserverConfig(builder))) {
+ assertThat(curator.serverCount(), is(4));
+ // host this is running on should come first
+ assertTrue(curator.connectionSpec().startsWith(HostName.getLocalhost() + ":" + port2 + ",localhost:1234"));
+ }
+ }
+
private ConfigserverConfig createTestConfig() {
ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder();
builder.zookeeperserver(createZKBuilder("localhost", port1));