diff options
author | Jon Bratseth <jonbratseth@yahoo.com> | 2017-11-24 08:02:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-24 08:02:23 +0100 |
commit | 35f91639a590f33012f29da8309baf0917beab3e (patch) | |
tree | 207468e06caa1c4240c9599616cf7b203f293130 /config-model | |
parent | 098d293e09e7e2fe6b104efb5d89b348549579d9 (diff) |
Revert "Revert "Bratseth/select 1 host by index""
Diffstat (limited to 'config-model')
5 files changed, 157 insertions, 77 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java index 5e74a2ebc8a..e6ed91165ca 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/HostResource.java @@ -7,7 +7,9 @@ import com.yahoo.config.provision.Flavor; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -264,4 +266,30 @@ public class HostResource implements Comparable<HostResource> { return this.host.compareTo(other.host); } + /** + * Picks hosts by some mixture of host name and index + * (where the mix of one or the other is decided by the last parameter). + */ + public static List<HostResource> pickHosts(Collection<HostResource> hosts, int count, int targetHostsSelectedByIndex) { + targetHostsSelectedByIndex = Math.min(Math.min(targetHostsSelectedByIndex, count), hosts.size()); + + List<HostResource> hostsSortedByName = new ArrayList<>(hosts); + Collections.sort(hostsSortedByName); + + List<HostResource> hostsSortedByIndex = new ArrayList<>(hosts); + hostsSortedByIndex.sort(Comparator.comparingInt(host -> host.primaryClusterMembership().get().index())); + return pickHosts(hostsSortedByName, hostsSortedByIndex, count, targetHostsSelectedByIndex); + } + public static List<HostResource> pickHosts(List<HostResource> hostsSelectedByName, List<HostResource> hostsSelectedByIndex, + int count, int targetHostsSelectedByIndex) { + hostsSelectedByName = hostsSelectedByName.subList(0, Math.min(count - targetHostsSelectedByIndex, hostsSelectedByName.size())); + hostsSelectedByIndex.removeAll(hostsSelectedByName); + hostsSelectedByIndex = hostsSelectedByIndex.subList(0, Math.min(targetHostsSelectedByIndex, hostsSelectedByIndex.size())); + + List<HostResource> finalHosts = new ArrayList<>(); + finalHosts.addAll(hostsSelectedByName); + finalHosts.addAll(hostsSelectedByIndex); + return finalHosts; + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java index cb8ec205395..f33c86134cb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * Builds the admin model from a version 4 XML tag, or as a default when an admin 3 tag or no admin tag is used. @@ -117,12 +118,11 @@ public class DomAdminV4Builder extends DomAdminBuilderBase { /** Returns the count first containers in the current model having isRetired set to the given value */ private List<HostResource> sortedContainerHostsFrom(ContainerModel model, int count, boolean retired) { - List<HostResource> hosts = new ArrayList<>(); - for (Container container : model.getCluster().getContainers()) - if (retired == container.isRetired()) - hosts.add(container.getHostResource()); - Collections.sort(hosts); - return hosts.subList(0, Math.min(count, hosts.size())); + List<HostResource> hosts = model.getCluster().getContainers().stream() + .filter(container -> retired == container.isRetired()) + .map(Container::getHostResource) + .collect(Collectors.toList()); + return HostResource.pickHosts(hosts, count, 1); } private void createLogserver(Admin admin, Collection<HostResource> hosts) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index 7889b857fff..16b0674fc14 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -10,6 +10,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.lang.MutableInteger; import com.yahoo.vespa.config.content.MessagetyperouteselectorpolicyConfig; import com.yahoo.vespa.config.content.FleetcontrollerConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; @@ -328,9 +329,11 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri } private List<HostResource> drawControllerHosts(int count, StorageGroup rootGroup, Collection<ContainerModel> containers) { - List<HostResource> hosts = drawContentHostsRecursively(count, rootGroup); + List<HostResource> hostsByName = drawContentHostsRecursively(count, false, rootGroup); + List<HostResource> hostsByIndex = drawContentHostsRecursively(count, true, rootGroup); // if (hosts.size() < count) // supply with containers TODO: Currently disabled due to leading to topology change problems // hosts.addAll(drawContainerHosts(count - hosts.size(), containers, new HashSet<>(hosts))); + List<HostResource> hosts = HostResource.pickHosts(hostsByName, hostsByIndex, count, 1); if (hosts.size() % 2 == 0) // ZK clusters of even sizes are less available (even in the size=2 case) hosts = hosts.subList(0, hosts.size()-1); return hosts; @@ -403,20 +406,24 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri */ // Note: This method cannot be changed to draw different nodes without ensuring that it will draw nodes // which overlaps with previously drawn nodes as this will prevent rolling upgrade - private List<HostResource> drawContentHostsRecursively(int count, StorageGroup group) { + private List<HostResource> drawContentHostsRecursively(int count, boolean byIndex, StorageGroup group) { Set<HostResource> hosts = new HashSet<>(); if (group.getNodes().isEmpty()) { int hostsPerSubgroup = (int)Math.ceil((double)count / group.getSubgroups().size()); for (StorageGroup subgroup : group.getSubgroups()) - hosts.addAll(drawContentHostsRecursively(hostsPerSubgroup, subgroup)); + hosts.addAll(drawContentHostsRecursively(hostsPerSubgroup, byIndex, subgroup)); } else { hosts.addAll(group.getNodes().stream() - .filter(node -> ! node.isRetired()) // Avoid retired controllers to avoid surprises on expiry - .map(StorageNode::getHostResource).collect(Collectors.toList())); + .filter(node -> ! node.isRetired()) // Avoid retired controllers to avoid surprises on expiry + .map(StorageNode::getHostResource).collect(Collectors.toList())); } + List<HostResource> sortedHosts = new ArrayList<>(hosts); - Collections.sort(sortedHosts); + if (byIndex) + sortedHosts.sort(Comparator.comparingInt(host -> host.primaryClusterMembership().get().index())); + else // by name + Collections.sort(sortedHosts); sortedHosts = sortedHosts.subList(0, Math.min(count, hosts.size())); return sortedHosts; } diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java index 63d5d37598b..6ea15788cf3 100644 --- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java +++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java @@ -391,16 +391,16 @@ public class ModelProvisioningTest { ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals(3, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("default10", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("default13", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("default16", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("default28", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default31", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default54", clusterControllers.getContainers().get(2).getHostName()); assertEquals(0, cluster.getRootGroup().getNodes().size()); assertEquals(9, cluster.getRootGroup().getSubgroups().size()); assertThat(cluster.getRootGroup().getSubgroups().get(0).getIndex(), is("0")); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().size(), is(3)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getDistributionKey(), is(0)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getConfigId(), is("bar/storage/0")); - assertEquals("default10", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); + assertEquals("default54", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(1).getDistributionKey(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(1).getConfigId(), is("bar/storage/1")); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(2).getDistributionKey(), is(2)); @@ -409,13 +409,13 @@ public class ModelProvisioningTest { assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().size(), is(3)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getDistributionKey(), is(3)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getConfigId(), is("bar/storage/3")); - assertEquals("default13", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); + assertEquals("default51", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(1).getDistributionKey(), is(4)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(1).getConfigId(), is("bar/storage/4")); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(2).getDistributionKey(), is(5)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(2).getConfigId(), is("bar/storage/5")); // ... - assertEquals("default16", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); + assertEquals("default48", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); // ... assertThat(cluster.getRootGroup().getSubgroups().get(8).getIndex(), is("8")); assertThat(cluster.getRootGroup().getSubgroups().get(8).getNodes().size(), is(3)); @@ -430,23 +430,23 @@ public class ModelProvisioningTest { clusterControllers = cluster.getClusterControllers(); assertEquals(3, clusterControllers.getContainers().size()); assertEquals("baz-controllers", clusterControllers.getName()); - assertEquals("default37", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("default38", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("default39", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("default01", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default02", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default27", clusterControllers.getContainers().get(2).getHostName()); assertEquals(0, cluster.getRootGroup().getNodes().size()); assertEquals(27, cluster.getRootGroup().getSubgroups().size()); assertThat(cluster.getRootGroup().getSubgroups().get(0).getIndex(), is("0")); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().size(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getDistributionKey(), is(0)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getConfigId(), is("baz/storage/0")); - assertEquals("default37", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); + assertEquals("default27", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); assertThat(cluster.getRootGroup().getSubgroups().get(1).getIndex(), is("1")); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().size(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getDistributionKey(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getConfigId(), is("baz/storage/1")); - assertEquals("default38", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); + assertEquals("default26", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); // ... - assertEquals("default39", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); + assertEquals("default25", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); // ... assertThat(cluster.getRootGroup().getSubgroups().get(26).getIndex(), is("26")); assertThat(cluster.getRootGroup().getSubgroups().get(26).getNodes().size(), is(1)); @@ -483,9 +483,9 @@ public class ModelProvisioningTest { ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals(3, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("default10", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("default11", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("default12", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("default01", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default02", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default08", clusterControllers.getContainers().get(2).getHostName()); assertEquals(0, cluster.getRootGroup().getNodes().size()); assertEquals(8, cluster.getRootGroup().getSubgroups().size()); assertEquals(8, cluster.distributionBits()); @@ -494,19 +494,19 @@ public class ModelProvisioningTest { assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().size(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getDistributionKey(), is(0)); assertThat(cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getConfigId(), is("bar/storage/0")); - assertEquals("default10", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); + assertEquals("default08", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); // second group assertThat(cluster.getRootGroup().getSubgroups().get(1).getIndex(), is("1")); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().size(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getDistributionKey(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getConfigId(), is("bar/storage/1")); - assertEquals("default11", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); + assertEquals("default07", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); // ... last group assertThat(cluster.getRootGroup().getSubgroups().get(7).getIndex(), is("7")); assertThat(cluster.getRootGroup().getSubgroups().get(7).getNodes().size(), is(1)); assertThat(cluster.getRootGroup().getSubgroups().get(7).getNodes().get(0).getDistributionKey(), is(7)); assertThat(cluster.getRootGroup().getSubgroups().get(7).getNodes().get(0).getConfigId(), is("bar/storage/7")); - assertEquals("default17", cluster.getRootGroup().getSubgroups().get(7).getNodes().get(0).getHostName()); + assertEquals("default01", cluster.getRootGroup().getSubgroups().get(7).getNodes().get(0).getHostName()); } @Test @@ -538,16 +538,51 @@ public class ModelProvisioningTest { ContentCluster cluster = model.getContentClusters().get("bar"); ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals( 8, cluster.distributionBits()); - assertEquals("We get the closest odd numer", 5, clusterControllers.getContainers().size()); + assertEquals("We get the closest odd number", 5, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("default10", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("default11", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("default13", clusterControllers.getContainers().get(2).getHostName()); - assertEquals("default14", clusterControllers.getContainers().get(3).getHostName()); // Should be 16 for perfect distribution ... - assertEquals("default10", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); - assertEquals("default11", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(1).getHostName()); - assertEquals("default13", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); - assertEquals("default16", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); + assertEquals("default01", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default02", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default04", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("default05", clusterControllers.getContainers().get(3).getHostName()); + assertEquals("default07", clusterControllers.getContainers().get(4).getHostName()); + assertEquals("default09", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(0).getHostName()); + assertEquals("default08", cluster.getRootGroup().getSubgroups().get(0).getNodes().get(1).getHostName()); + assertEquals("default06", cluster.getRootGroup().getSubgroups().get(1).getNodes().get(0).getHostName()); + assertEquals("default03", cluster.getRootGroup().getSubgroups().get(2).getNodes().get(0).getHostName()); + } + + @Test + public void testClusterControllersWithGroupSize2() { + String services = + "<?xml version='1.0' encoding='utf-8' ?>\n" + + "<services>" + + " <admin version='4.0'/>" + + " <container version='1.0' id='foo'>" + + " <nodes count='10'/>" + + " </container>" + + " <content version='1.0' id='bar'>" + + " <redundancy>2</redundancy>" + + " <documents>" + + " <document type='type1' mode='index'/>" + + " </documents>" + + " <nodes count='8' groups='4'/>" + + " </content>" + + "</services>"; + + int numberOfHosts = 18; + VespaModelTester tester = new VespaModelTester(); + tester.addHosts(numberOfHosts); + VespaModel model = tester.createModel(services, true); + assertThat(model.getRoot().getHostSystem().getHosts().size(), is(numberOfHosts)); + + // Check content clusters + ContentCluster cluster = model.getContentClusters().get("bar"); + ContainerCluster clusterControllers = cluster.getClusterControllers(); + assertEquals("We get the closest odd number", 3, clusterControllers.getContainers().size()); + assertEquals("bar-controllers", clusterControllers.getName()); + assertEquals("default01", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default03", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default08", clusterControllers.getContainers().get(2).getHostName()); } @Test @@ -604,7 +639,7 @@ public class ModelProvisioningTest { int numberOfHosts = 19; VespaModelTester tester = new VespaModelTester(); tester.addHosts(numberOfHosts); - VespaModel model = tester.createModel(services, true, "default10", "default13", "default16"); + VespaModel model = tester.createModel(services, true, "default09", "default06", "default03"); assertThat(model.getRoot().getHostSystem().getHosts().size(), is(numberOfHosts)); // Check content clusters @@ -612,9 +647,9 @@ public class ModelProvisioningTest { ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals(3, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("Skipping retired default10", "default11", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("Skipping retired default13", "default14", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("Skipping retired default16", "default17", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("Skipping retired default09", "default01", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("Skipping retired default03", "default04", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("Skipping retired default06", "default08", clusterControllers.getContainers().get(2).getHostName()); } @Test @@ -631,15 +666,15 @@ public class ModelProvisioningTest { int numberOfHosts = 10; VespaModelTester tester = new VespaModelTester(); tester.addHosts(numberOfHosts); - VespaModel model = tester.createModel(services, true, "default0"); + VespaModel model = tester.createModel(services, true, "default09"); assertThat(model.getRoot().getHostSystem().getHosts().size(), is(numberOfHosts)); // Check slobroks clusters assertEquals("Includes retired node", 1+3, model.getAdmin().getSlobroks().size()); - assertEquals("default1", model.getAdmin().getSlobroks().get(0).getHostName()); - assertEquals("default2", model.getAdmin().getSlobroks().get(1).getHostName()); - assertEquals("default3", model.getAdmin().getSlobroks().get(2).getHostName()); - assertEquals("Included in addition because it is retired", "default0", model.getAdmin().getSlobroks().get(3).getHostName()); + assertEquals("default01", model.getAdmin().getSlobroks().get(0).getHostName()); + assertEquals("default02", model.getAdmin().getSlobroks().get(1).getHostName()); + assertEquals("default10", model.getAdmin().getSlobroks().get(2).getHostName()); + assertEquals("Included in addition because it is retired", "default09", model.getAdmin().getSlobroks().get(3).getHostName()); } @Test @@ -656,16 +691,16 @@ public class ModelProvisioningTest { int numberOfHosts = 10; VespaModelTester tester = new VespaModelTester(); tester.addHosts(numberOfHosts); - VespaModel model = tester.createModel(services, true, "default3", "default4"); + VespaModel model = tester.createModel(services, true, "default09", "default08"); assertThat(model.getRoot().getHostSystem().getHosts().size(), is(numberOfHosts)); // Check slobroks clusters assertEquals("Includes retired node", 3+2, model.getAdmin().getSlobroks().size()); - assertEquals("default0", model.getAdmin().getSlobroks().get(0).getHostName()); - assertEquals("default1", model.getAdmin().getSlobroks().get(1).getHostName()); - assertEquals("default2", model.getAdmin().getSlobroks().get(2).getHostName()); - assertEquals("Included in addition because it is retired", "default3", model.getAdmin().getSlobroks().get(3).getHostName()); - assertEquals("Included in addition because it is retired", "default4", model.getAdmin().getSlobroks().get(4).getHostName()); + assertEquals("default01", model.getAdmin().getSlobroks().get(0).getHostName()); + assertEquals("default02", model.getAdmin().getSlobroks().get(1).getHostName()); + assertEquals("default10", model.getAdmin().getSlobroks().get(2).getHostName()); + assertEquals("Included in addition because it is retired", "default08", model.getAdmin().getSlobroks().get(3).getHostName()); + assertEquals("Included in addition because it is retired", "default09", model.getAdmin().getSlobroks().get(4).getHostName()); } @Test @@ -685,19 +720,19 @@ public class ModelProvisioningTest { int numberOfHosts = 13; VespaModelTester tester = new VespaModelTester(); tester.addHosts(numberOfHosts); - VespaModel model = tester.createModel(services, true, "default0", "default10", "default11"); + VespaModel model = tester.createModel(services, true, "default12", "default03", "default02"); assertThat(model.getRoot().getHostSystem().getHosts().size(), is(numberOfHosts)); // Check slobroks clusters // ... from cluster default assertEquals("Includes retired node", 3+3, model.getAdmin().getSlobroks().size()); - assertEquals("default1", model.getAdmin().getSlobroks().get(0).getHostName()); - assertEquals("default2", model.getAdmin().getSlobroks().get(1).getHostName()); - assertEquals("Included in addition because it is retired", "default0", model.getAdmin().getSlobroks().get(2).getHostName()); + assertEquals("default04", model.getAdmin().getSlobroks().get(0).getHostName()); + assertEquals("default13", model.getAdmin().getSlobroks().get(1).getHostName()); + assertEquals("Included in addition because it is retired", "default12", model.getAdmin().getSlobroks().get(2).getHostName()); // ... from cluster bar - assertEquals("default12", model.getAdmin().getSlobroks().get(3).getHostName()); - assertEquals("Included in addition because it is retired", "default10", model.getAdmin().getSlobroks().get(4).getHostName()); - assertEquals("Included in addition because it is retired", "default11", model.getAdmin().getSlobroks().get(5).getHostName()); + assertEquals("default01", model.getAdmin().getSlobroks().get(3).getHostName()); + assertEquals("Included in addition because it is retired", "default02", model.getAdmin().getSlobroks().get(4).getHostName()); + assertEquals("Included in addition because it is retired", "default03", model.getAdmin().getSlobroks().get(5).getHostName()); } @Test @@ -828,10 +863,10 @@ public class ModelProvisioningTest { ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals(4, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("default19", clusterControllers.getContainers().get(0).getHostName()); - assertEquals("default20", clusterControllers.getContainers().get(1).getHostName()); - assertEquals("default21", clusterControllers.getContainers().get(2).getHostName()); - assertEquals("default22", clusterControllers.getContainers().get(3).getHostName()); + assertEquals("default04", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default03", clusterControllers.getContainers().get(1).getHostName()); + assertEquals("default02", clusterControllers.getContainers().get(2).getHostName()); + assertEquals("default01", clusterControllers.getContainers().get(3).getHostName()); } @Test @@ -957,7 +992,7 @@ public class ModelProvisioningTest { ContainerCluster clusterControllers = cluster.getClusterControllers(); assertEquals(1, clusterControllers.getContainers().size()); assertEquals("bar-controllers", clusterControllers.getName()); - assertEquals("default0", clusterControllers.getContainers().get(0).getHostName()); + assertEquals("default01", clusterControllers.getContainers().get(0).getHostName()); assertEquals(1, cluster.redundancy().effectiveInitialRedundancy()); // Reduced from 3*3 assertEquals(1, cluster.redundancy().effectiveFinalRedundancy()); // Reduced from 3*4 assertEquals(1, cluster.redundancy().effectiveReadyCopies()); // Reduced from 3*3 diff --git a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java index 901bd7f55b5..b88ba0276c4 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/test/VespaModelTester.java @@ -18,7 +18,6 @@ import com.yahoo.vespa.model.test.utils.ApplicationPackageUtils; import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -29,7 +28,7 @@ import java.util.Optional; * Helper class which sets up a system with multiple hosts. * Usage: * <code> - * VespaModelteser teser = new VespaModelTester(); + * VespaModelteser tester = new VespaModelTester(); * tester.addHosts(count, flavor); * ... add more nodes * VesoaModel model = tester.createModel(servicesString); @@ -43,7 +42,7 @@ public class VespaModelTester { private final ConfigModelRegistry configModelRegistry; private boolean hosted = true; - private Map<String, Collection<Host>> hosts = new HashMap<>(); + private Map<String, Collection<Host>> hostsByFlavor = new HashMap<>(); public VespaModelTester() { this(new NullConfigModelRegistry()); @@ -55,20 +54,31 @@ public class VespaModelTester { /** Adds some hosts of the 'default' flavor to this system */ public Hosts addHosts(int count) { return addHosts("default", count); } + /** Adds some hosts to this system */ public Hosts addHosts(String flavor, int count) { - List<Host> hosts = new ArrayList<>(); - for (int i = 0; i < count; i++) - hosts.add(new com.yahoo.config.model.provision.Host(flavor + i)); - this.hosts.put(flavor.isEmpty() ? "default" : flavor, hosts); - return new Hosts(hosts); + return addHosts(Optional.empty(), flavor, count); } + public void addHosts(Flavor flavor, int count) { + addHosts(Optional.of(flavor), flavor.name(), count); + } + + private Hosts addHosts(Optional<Flavor> flavor, String flavorName, int count) { List<Host> hosts = new ArrayList<>(); + for (int i = 0; i < count; ++i) { - hosts.add(new Host(flavor.name() + i, ImmutableList.of(), Optional.of(flavor))); + // Let host names sort in the opposite order of the order the hosts are added + // This allows us to test index vs. name order selection when subsets of hosts are selected from a cluster + // (for e.g cluster controllers and slobrok nodes) + String hostname = String.format("%s%02d", flavorName, count - i); + hosts.add(new Host(hostname, ImmutableList.of(), flavor)); } - this.hosts.put(flavor.name(), hosts); + this.hostsByFlavor.put(flavorName, hosts); + + if (hosts.size() > 100) + throw new IllegalStateException("The host naming scheme is nameNN. To test more than 100 hosts, change to nameNNN"); + return new Hosts(hosts); } /** Sets whether this sets up a model for a hosted system. Default: true */ @@ -95,7 +105,7 @@ public class VespaModelTester { ApplicationPackage appPkg = modelCreatorWithMockPkg.appPkg; HostProvisioner provisioner = hosted ? - new InMemoryProvisioner(hosts, failOnOutOfCapacity, startIndexForClusters, retiredHostNames) : + new InMemoryProvisioner(hostsByFlavor, failOnOutOfCapacity, startIndexForClusters, retiredHostNames) : new SingleNodeProvisioner(); DeployState deployState = new DeployState.Builder() |