From a942f5a40ac365197576ad5f7abb4988d98b7e9c Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Wed, 28 Apr 2021 11:00:47 +0200 Subject: Prefer NodeList operations where possible --- .../com/yahoo/vespa/hosted/provision/NodeList.java | 7 ++++++- .../vespa/hosted/provision/autoscale/MetricsDb.java | 5 +---- .../hosted/provision/autoscale/MetricsResponse.java | 2 +- .../provision/autoscale/MetricsV2MetricsFetcher.java | 3 +-- .../hosted/provision/lb/SharedLoadBalancerService.java | 16 ++++++++-------- .../vespa/hosted/provision/maintenance/Expirer.java | 8 +++----- .../hosted/provision/maintenance/FailedExpirer.java | 7 +++---- .../provision/maintenance/MaintenanceDeployment.java | 9 +++++---- .../com/yahoo/vespa/hosted/provision/node/History.java | 2 +- .../vespa/hosted/provision/provisioning/Activator.java | 18 ++++++------------ .../hosted/provision/provisioning/NodeAllocation.java | 2 +- .../vespa/hosted/provision/NodeRepositoryTest.java | 5 +---- .../maintenance/DynamicProvisioningMaintainerTest.java | 3 +-- .../provision/maintenance/FailedExpirerTest.java | 7 ++----- .../provision/maintenance/LoadBalancerExpirerTest.java | 9 ++++----- .../provision/maintenance/RetiredExpirerTest.java | 12 +++++------- .../vespa/hosted/provision/os/OsVersionsTest.java | 4 ++-- .../provisioning/DynamicDockerAllocationTest.java | 8 +++----- .../provisioning/DynamicDockerProvisionTest.java | 18 ++++++++---------- .../provisioning/InPlaceResizeProvisionTest.java | 12 +++++------- .../provision/provisioning/ProvisioningTest.java | 12 ++++++------ .../provision/provisioning/ProvisioningTester.java | 13 ++----------- 22 files changed, 75 insertions(+), 107 deletions(-) (limited to 'node-repository') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java index 8a35febc9a7..5ec9ebfa0ad 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java @@ -149,7 +149,7 @@ public class NodeList extends AbstractFilteringList { return matching(node -> node.allocation().isPresent() && node.allocation().get().owner().instance().isTester()); } - /** Returns the subset of nodes matching the given node type(s) */ + /** Returns the subset of nodes matching any of the given node type(s) */ public NodeList nodeType(NodeType first, NodeType... rest) { if (rest.length == 0) { return matching(node -> node.type() == first); @@ -220,6 +220,11 @@ public class NodeList extends AbstractFilteringList { .findFirst()); } + /** Returns the hostnames of nodes in this */ + public Set hostnames() { + return stream().map(Node::hostname).collect(Collectors.toUnmodifiableSet()); + } + /** * Returns the cluster spec of the nodes in this, without any group designation * diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java index 593b73e008e..5ec1aac7d2d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsDb.java @@ -4,9 +4,7 @@ package com.yahoo.vespa.hosted.provision.autoscale; import com.yahoo.collections.Pair; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterSpec; -import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; -import com.yahoo.vespa.hosted.provision.NodeRepository; import java.time.Clock; import java.time.Duration; @@ -14,7 +12,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; /** * An in-memory time-series database of node metrics. @@ -40,7 +37,7 @@ public interface MetricsDb { List getNodeTimeseries(Duration period, Set hostnames); default List getNodeTimeseries(Duration period, NodeList nodes) { - return getNodeTimeseries(period, nodes.stream().map(Node::hostname).collect(Collectors.toSet())); + return getNodeTimeseries(period, nodes.hostnames()); } /** Returns all cluster level metric snapshots for a given cluster */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java index 210388db7b8..665155ecf68 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsResponse.java @@ -59,7 +59,7 @@ public class MetricsResponse { private void consumeNode(Inspector nodeObject, NodeList applicationNodes, NodeRepository nodeRepository) { String hostname = nodeObject.field("hostname").asString(); - Optional node = applicationNodes.stream().filter(n -> n.hostname().equals(hostname)).findAny(); + Optional node = applicationNodes.node(hostname); if (node.isEmpty()) return; // Node is not part of this cluster any more ListMap nodeValues = new ListMap<>(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java index 5c45e4a3737..7d870bd678d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/MetricsV2MetricsFetcher.java @@ -55,8 +55,7 @@ public class MetricsV2MetricsFetcher extends AbstractComponent implements Metric Optional metricsV2Container = applicationNodes.container() .matching(node -> expectedUp(node)) - .stream() - .findFirst(); + .first(); if (metricsV2Container.isEmpty()) { return CompletableFuture.completedFuture(MetricsResponse.empty()); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java index d370681a087..33a3c138d70 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/lb/SharedLoadBalancerService.java @@ -6,10 +6,10 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.IP; -import java.util.ArrayList; import java.util.Comparator; import java.util.Objects; import java.util.Optional; @@ -34,23 +34,23 @@ public class SharedLoadBalancerService implements LoadBalancerService { @Override public LoadBalancerInstance create(LoadBalancerSpec spec, boolean force) { - var proxyNodes = nodeRepository.nodes().list().nodeType(NodeType.proxy).sortedBy(hostnameComparator); + NodeList proxyNodes = nodeRepository.nodes().list().nodeType(NodeType.proxy).sortedBy(hostnameComparator); if (proxyNodes.size() == 0) { throw new IllegalStateException("Missing proxy nodes in node repository"); } - var firstProxyNode = proxyNodes.first().get(); - var networkNames = proxyNodes.stream() - .flatMap(node -> node.ipConfig().primary().stream()) - .map(SharedLoadBalancerService::withPrefixLength) - .collect(Collectors.toSet()); + Node firstProxyNode = proxyNodes.first().get(); + Set networks = proxyNodes.stream() + .flatMap(node -> node.ipConfig().primary().stream()) + .map(SharedLoadBalancerService::withPrefixLength) + .collect(Collectors.toSet()); return new LoadBalancerInstance( HostName.from(firstProxyNode.hostname()), Optional.empty(), Set.of(4080, 4443), - networkNames, + networks, spec.reals() ); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java index b720bf004ff..2443a12d198 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Expirer.java @@ -3,13 +3,13 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.History; import java.time.Duration; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Collectors; /** * Superclass of expiry tasks which moves nodes from some state to the dirty state. @@ -41,13 +41,11 @@ public abstract class Expirer extends NodeRepositoryMaintainer { @Override protected boolean maintain() { - List expired = nodeRepository().nodes().list(fromState).stream() - .filter(this::isExpired) - .collect(Collectors.toList()); + NodeList expired = nodeRepository().nodes().list(fromState).matching(this::isExpired); if ( ! expired.isEmpty()) { log.info(fromState + " expirer found " + expired.size() + " expired nodes: " + expired); - expire(expired); + expire(expired.asList()); } metric.add("expired." + fromState, expired.size(), null); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java index e2316f96c16..17bd4b9174c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java @@ -68,10 +68,9 @@ public class FailedExpirer extends NodeRepositoryMaintainer { @Override protected boolean maintain() { - List remainingNodes = nodeRepository.nodes().list(Node.State.failed).stream() - .filter(node -> node.type() == NodeType.tenant || - node.type() == NodeType.host) - .collect(Collectors.toList()); + List remainingNodes = new ArrayList<>(nodeRepository.nodes().list(Node.State.failed) + .nodeType(NodeType.tenant, NodeType.host) + .asList()); recycleIf(remainingNodes, node -> node.allocation().isEmpty()); recycleIf(remainingNodes, node -> diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java index 2e5a772efd9..3b16ecbcaa9 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java @@ -168,10 +168,11 @@ class MaintenanceDeployment implements Closeable { if ( ! deployment.prepare()) return false; if (verifyTarget) { expectedNewNode = - nodeRepository.nodes().list(Node.State.reserved).owner(application).stream() - .filter(n -> !n.hostname().equals(node.hostname())) - .filter(n -> n.allocation().get().membership().cluster().id().equals(node.allocation().get().membership().cluster().id())) - .findAny(); + nodeRepository.nodes().list(Node.State.reserved) + .owner(application) + .cluster(node.allocation().get().membership().cluster().id()) + .except(node) + .first(); if (expectedNewNode.isEmpty()) return false; if (!expectedNewNode.get().hasParent(toHost.hostname())) return false; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/History.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/History.java index b5780cd86a0..af549b8bcec 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/History.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/History.java @@ -118,7 +118,7 @@ public class History { StringBuilder b = new StringBuilder("history: "); for (Event e : events.values()) b.append(e).append(", "); - b.setLength(b.length() -2); // remove last comma + b.setLength(b.length() - 2); // remove last comma return b.toString(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java index 77b6639858e..6d06dc31a42 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java @@ -78,8 +78,8 @@ class Activator { throw new IllegalArgumentException("Activation of " + application + " failed. " + "Could not find all requested hosts." + "\nRequested: " + hosts + - "\nReserved: " + toHostNames(reserved) + - "\nActive: " + toHostNames(oldActive) + + "\nReserved: " + reserved.hostnames() + + "\nActive: " + oldActive.hostnames() + "\nThis might happen if the time from reserving host to activation takes " + "longer time than reservation expiry (the hosts will then no longer be reserved)"); @@ -158,17 +158,15 @@ class Activator { .collect(Collectors.toUnmodifiableSet()); } - private static void validateParentHosts(ApplicationId application, NodeList nodes, NodeList potentialChildren) { + private static void validateParentHosts(ApplicationId application, NodeList allNodes, NodeList potentialChildren) { Set parentHostnames = potentialChildren.stream() .map(Node::parentHostname) .flatMap(Optional::stream) .collect(Collectors.toSet()); - Set nonActiveHosts = nodes.asList().stream() - .filter(node -> parentHostnames.contains(node.hostname())) - .filter(node -> node.state() != Node.State.active) - .map(Node::hostname) - .collect(Collectors.toSet()); + Set nonActiveHosts = allNodes.not().state(Node.State.active) + .matching(node -> parentHostnames.contains(node.hostname())) + .hostnames(); if (nonActiveHosts.size() > 0) { long numActive = parentHostnames.size() - nonActiveHosts.size(); @@ -195,10 +193,6 @@ class Activator { } } - private Set toHostNames(NodeList nodes) { - return nodes.stream().map(Node::hostname).collect(Collectors.toSet()); - } - private boolean containsAll(Set hosts, NodeList nodes) { Set notFoundHosts = new HashSet<>(hosts); for (Node node : nodes) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java index b401bcfc03f..b5579451a0e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java @@ -322,8 +322,8 @@ class NodeAllocation { // Infrastructure hosts have fixed indices, starting at 1 Set currentIndices = allNodes.nodeType(hostType) + .hostnames() .stream() - .map(Node::hostname) // TODO(mpolden): Use cluster index instead of parsing hostname, once all // config servers have been replaced once and have switched // to compact indices diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java index 567e71c7f9e..351f9fe44ee 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java @@ -14,7 +14,6 @@ import java.time.Instant; import java.util.List; import java.util.Set; import java.util.function.Predicate; -import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -281,9 +280,7 @@ public class NodeRepositoryTest { } private static Set filterNodes(NodeRepositoryTester tester, Predicate filter) { - return tester.nodeRepository().nodes().list().matching(filter).stream() - .map(Node::hostname) - .collect(Collectors.toSet()); + return tester.nodeRepository().nodes().list().matching(filter).hostnames(); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java index b761f743687..dcfa9f5e3db 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/DynamicProvisioningMaintainerTest.java @@ -90,8 +90,7 @@ public class DynamicProvisioningMaintainerTest { assertTrue("No IP addresses assigned", Stream.of(host4, host41).map(node -> node.ipConfig().primary()).allMatch(Set::isEmpty)); tester.maintainer.maintain(); - assertEquals(Set.of("host4", "host4-1"), - tester.nodeRepository.nodes().list(Node.State.failed).stream().map(Node::hostname).collect(Collectors.toSet())); + assertEquals(Set.of("host4", "host4-1"), tester.nodeRepository.nodes().list(Node.State.failed).hostnames()); } @Test diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index db0dac3edb8..6ec4853dbca 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -339,12 +339,9 @@ public class FailedExpirerTest { } public void assertNodesIn(Node.State state, String... hostnames) { - assertEquals(Stream.of(hostnames).collect(Collectors.toSet()), - nodeRepository.nodes() - .list(state).stream() - .map(Node::hostname) - .collect(Collectors.toSet())); + assertEquals(Set.of(hostnames), nodeRepository.nodes().list(state).hostnames()); } + } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java index 4d19c2c1d41..7690365f244 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Supplier; -import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -134,10 +133,10 @@ public class LoadBalancerExpirerTest { } private void removeNodesOf(ApplicationId application, ClusterSpec.Id cluster) { - var nodes = tester.nodeRepository().nodes().list().owner(application).stream() - .filter(node -> node.allocation().isPresent()) - .filter(node -> node.allocation().get().membership().cluster().id().equals(cluster)) - .collect(Collectors.toList()); + var nodes = tester.nodeRepository().nodes().list() + .owner(application) + .cluster(cluster) + .asList(); nodes = tester.nodeRepository().nodes().deallocate(nodes, Agent.system, getClass().getSimpleName()); tester.nodeRepository().nodes().setReady(nodes, Agent.system, getClass().getSimpleName()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index 5043529507f..02d8c94941b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -173,7 +173,7 @@ public class RetiredExpirerTest { public void config_server_reprovisioning() throws OrchestrationException { NodeList configServers = tester.makeConfigServers(3, "default", Version.emptyVersion); var cfg1 = new HostName("cfg1"); - assertEquals(Set.of(cfg1.s(), "cfg2", "cfg3"), configServers.stream().map(Node::hostname).collect(Collectors.toSet())); + assertEquals(Set.of(cfg1.s(), "cfg2", "cfg3"), configServers.hostnames()); var configServerApplication = new ConfigServerApplication(); var duperModel = new MockDuperModel().support(configServerApplication); @@ -249,12 +249,10 @@ public class RetiredExpirerTest { // There are now 2 retired config servers left retiredExpirer.run(); assertEquals(3, tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.config).size()); - var retiredHostnames = tester.nodeRepository() - .nodes().list(() -> {}) - .stream() - .filter(n -> n.allocation().map(allocation -> allocation.membership().retired()).orElse(false)) - .map(Node::hostname) - .collect(Collectors.toSet()); + Set retiredHostnames = tester.nodeRepository() + .nodes().list() + .matching(n -> n.allocation().map(allocation -> allocation.membership().retired()).orElse(false)) + .hostnames(); assertEquals(Set.of("cfg2", "cfg3"), retiredHostnames); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java index 1a81511e698..333b1bb3558 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java @@ -310,8 +310,8 @@ public class OsVersionsTest { versions.setTarget(NodeType.host, version2, totalBudget, false); versions.resumeUpgradeOf(NodeType.host, true); NodeList nonFailingHosts = hostNodes.get().except(failedHost); - assertTrue("Wanted version is set", nonFailingHosts.except(failedHost).stream() - .allMatch(node -> node.status().osVersion().wanted().isPresent())); + assertTrue("Wanted version is set", nonFailingHosts.stream() + .allMatch(node -> node.status().osVersion().wanted().isPresent())); setCurrentVersion(nonFailingHosts.asList(), version2); assertEquals(10, hostNodes.get().except(failedHost).onOsVersion(version2).size()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java index 0c1466e7bf0..8d9e79218d4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java @@ -35,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -524,10 +523,9 @@ public class DynamicDockerAllocationTest { private List findSpareCapacity(ProvisioningTester tester) { NodeList nodes = tester.nodeRepository().nodes().list(State.values()); - return nodes.stream() - .filter(n -> n.type() == NodeType.host) - .filter(n -> nodes.childrenOf(n).size() == 0) // Nodes without children - .collect(Collectors.toList()); + return nodes.nodeType(NodeType.host) + .matching(host -> nodes.childrenOf(host).size() == 0) // Hosts without children + .asList(); } private FlavorsConfig flavorsConfig() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java index a6e67f2747c..f5cf9dbb471 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java @@ -77,9 +77,8 @@ public class DynamicDockerProvisionTest { // Total of 8 nodes should now be in node-repo, 4 active hosts and 4 active nodes assertEquals(8, tester.nodeRepository().nodes().list().size()); assertEquals(4, tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.host).size()); - assertEquals(List.of("host-100-1", "host-101-1", "host-102-1", "host-103-1"), - tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.tenant).stream() - .map(Node::hostname).sorted().collect(Collectors.toList())); + assertEquals(Set.of("host-100-1", "host-101-1", "host-102-1", "host-103-1"), + tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.tenant).hostnames()); // Deploy new application ApplicationId application2 = ProvisioningTester.applicationId(); @@ -88,10 +87,9 @@ public class DynamicDockerProvisionTest { // Total of 12 nodes should now be in node-repo, 4 active hosts and 8 active nodes assertEquals(12, tester.nodeRepository().nodes().list().size()); assertEquals(4, tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.host).size()); - assertEquals(List.of("host-100-1", "host-100-2", "host-101-1", "host-101-2", "host-102-1", "host-102-2", - "host-103-1", "host-103-2"), - tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.tenant).stream() - .map(Node::hostname).sorted().collect(Collectors.toList())); + assertEquals(Set.of("host-100-1", "host-100-2", "host-101-1", "host-101-2", "host-102-1", "host-102-2", + "host-103-1", "host-103-2"), + tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.tenant).hostnames()); // Deploy new exclusive application ApplicationId application3 = ProvisioningTester.applicationId(); @@ -165,19 +163,19 @@ public class DynamicDockerProvisionTest { mockHostProvisioner(hostProvisioner, "large", 3, null); // Provision shared hosts prepareAndActivate(application1, clusterSpec("mycluster"), 4, 1, resources); - Set initialNodes = tester.nodeRepository().nodes().list().owner(application1).stream().collect(Collectors.toSet()); + NodeList initialNodes = tester.nodeRepository().nodes().list().owner(application1); assertEquals(4, initialNodes.size()); // Redeploy same application with exclusive=true mockHostProvisioner(hostProvisioner, "large", 3, application1); prepareAndActivate(application1, clusterSpec("mycluster", true), 4, 1, resources); assertEquals(8, tester.nodeRepository().nodes().list().owner(application1).size()); - assertEquals(initialNodes, tester.nodeRepository().nodes().list().owner(application1).retired().stream().collect(Collectors.toSet())); + assertEquals(initialNodes, tester.nodeRepository().nodes().list().owner(application1).retired()); // Redeploy without exclusive again is no-op prepareAndActivate(application1, clusterSpec("mycluster"), 4, 1, resources); assertEquals(8, tester.nodeRepository().nodes().list().owner(application1).size()); - assertEquals(initialNodes, tester.nodeRepository().nodes().list().owner(application1).retired().stream().collect(Collectors.toSet())); + assertEquals(initialNodes, tester.nodeRepository().nodes().list().owner(application1).retired()); } @Test diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java index 4fd51f38fb6..8f07e57a26b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java @@ -20,7 +20,6 @@ import org.junit.Test; import java.util.Collection; import java.util.HashSet; import java.util.Set; -import java.util.stream.Collectors; import static com.yahoo.config.provision.NodeResources.DiskSpeed.fast; import static com.yahoo.config.provision.NodeResources.StorageType.local; @@ -96,7 +95,7 @@ public class InPlaceResizeProvisionTest { .prepare(container1, 4, 1, smallResources) .prepare(container2, 4, 1, mediumResources) .activate(); - Set container1Hostnames = listCluster(container1).stream().map(Node::hostname).collect(Collectors.toSet()); + Set container1Hostnames = listCluster(container1).hostnames(); assertSizeAndResources(container1, 4, new NodeResources(2, 4, 80, 1, fast, local)); assertSizeAndResources(container2, 4, new NodeResources(4, 8, 160, 1, fast, local)); @@ -104,7 +103,7 @@ public class InPlaceResizeProvisionTest { .prepare(container1, 4, 1, mediumResources) .prepare(container2, 4, 1, smallResources) .activate(); - assertEquals(container1Hostnames, listCluster(container1).stream().map(Node::hostname).collect(Collectors.toSet())); + assertEquals(container1Hostnames, listCluster(container1).hostnames()); assertSizeAndResources(container1, 4, new NodeResources(4, 8, 160, 1, fast, local)); assertSizeAndResources(container2, 4, new NodeResources(2, 4, 80, 1, fast, local)); assertEquals("No nodes are retired", 0, tester.getNodes(app, Node.State.active).retired().size()); @@ -115,11 +114,11 @@ public class InPlaceResizeProvisionTest { addParentHosts(6, largeResources.with(fast).with(local)); new PrepareHelper(tester, app).prepare(container1, 4, 1, mediumResources).activate(); - Set initialHostnames = listCluster(container1).stream().map(Node::hostname).collect(Collectors.toSet()); + Set initialHostnames = listCluster(container1).hostnames(); new PrepareHelper(tester, app) .prepare(container1, 6, 1, largeResources).activate(); - assertTrue(listCluster(container1).stream().map(Node::hostname).collect(Collectors.toSet()).containsAll(initialHostnames)); + assertTrue(listCluster(container1).hostnames().containsAll(initialHostnames)); assertSizeAndResources(container1, 6, new NodeResources(8, 16, 320, 1, fast, local)); assertEquals("No nodes are retired", 0, tester.getNodes(app, Node.State.active).retired().size()); } @@ -144,8 +143,7 @@ public class InPlaceResizeProvisionTest { // 2 of the nodes will be increased in-place and 2 will be allocated to the new hosts. addParentHosts(2, new NodeResources(8, 16, 320, 8, fast, local)); - Set initialHostnames = listCluster(container1).stream().map(Node::hostname) - .collect(Collectors.collectingAndThen(Collectors.toSet(), HashSet::new)); + Set initialHostnames = new HashSet<>(listCluster(container1).hostnames()); new PrepareHelper(tester, app).prepare(container1, 4, 1, largeResources).activate(); NodeList appNodes = tester.getNodes(app, Node.State.active); assertEquals(6, appNodes.size()); // 4 nodes with large resources + 2 retired nodes with medium resources diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index d6ceef81b04..cd89cea60e3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -106,14 +106,14 @@ public class ProvisioningTest { NodeList previouslyActive = tester.getNodes(application1, Node.State.active); NodeList previouslyInactive = tester.getNodes(application1, Node.State.inactive); tester.remove(application1); - assertEquals(tester.toHostNames(previouslyActive.not().container()), - tester.toHostNames(tester.nodeRepository().nodes().list(Node.State.inactive).owner(application1))); + assertEquals(previouslyActive.not().container().hostnames(), + tester.nodeRepository().nodes().list(Node.State.inactive).owner(application1).hostnames()); assertTrue(tester.nodeRepository().nodes().list(Node.State.dirty).asList().containsAll(previouslyActive.container().asList())); assertEquals(0, tester.getNodes(application1, Node.State.active).size()); assertTrue(tester.nodeRepository().applications().get(application1).isEmpty()); // other application is unaffected - assertEquals(state1App2.hostNames(), tester.toHostNames(tester.nodeRepository().nodes().list(Node.State.active).owner(application2))); + assertEquals(state1App2.hostNames(), tester.nodeRepository().nodes().list(Node.State.active).owner(application2).hostnames()); // fail a node from app2 and make sure it does not get inactive nodes from first HostSpec failed = tester.removeOne(state1App2.allHosts); @@ -706,7 +706,7 @@ public class ProvisioningTest { tester.activate(application, tester.prepare(application, cluster, capacityCanFail)); assertEquals(0, tester.nodeRepository().nodes().list(Node.State.active).owner(application).retired().size()); - tester.patchNode(tester.nodeRepository().nodes().list().owner(application).stream().findAny().orElseThrow(), n -> n.withWantToRetire(true, Agent.system, tester.clock().instant())); + tester.patchNode(tester.nodeRepository().nodes().list().owner(application).first().orElseThrow(), n -> n.withWantToRetire(true, Agent.system, tester.clock().instant())); tester.activate(application, tester.prepare(application, cluster, capacityCanFail)); assertEquals(1, tester.nodeRepository().nodes().list(Node.State.active).owner(application).retired().size()); assertEquals(6, tester.nodeRepository().nodes().list(Node.State.active).owner(application).size()); @@ -807,11 +807,11 @@ public class ProvisioningTest { assertEquals(10, list.state(Node.State.active).nodeType(NodeType.host).size()); // Pick out 5 random nodes and retire those - Set retiredHostnames = list.shuffle(new Random()).stream().map(Node::hostname).limit(5).collect(Collectors.toSet()); + Set retiredHostnames = list.shuffle(new Random()).first(5).hostnames(); tester.patchNodes(node -> retiredHostnames.contains(node.hostname()), node -> node.withWantToRetire(true, Agent.system, tester.clock().instant())); tester.prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); - assertEquals(retiredHostnames, tester.nodeRepository().nodes().list().retired().stream().map(Node::hostname).collect(Collectors.toSet())); + assertEquals(retiredHostnames, tester.nodeRepository().nodes().list().retired().hostnames()); Set unretiredHostnames = retiredHostnames.stream().limit(2).collect(Collectors.toSet()); tester.patchNodes(node -> unretiredHostnames.contains(node.hostname()), node -> node.withWantToRetire(false, Agent.system, tester.clock().instant())); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index f987d796a3a..d2140055a63 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -156,7 +156,7 @@ public class ProvisioningTester { } public List patchNodes(Predicate filter, UnaryOperator patcher) { - return patchNodes(nodeRepository.nodes().list().stream().filter(filter).collect(Collectors.toList()), patcher); + return patchNodes(nodeRepository.nodes().list().matching(filter).asList(), patcher); } public List patchNodes(List nodes, UnaryOperator patcher) { @@ -180,14 +180,9 @@ public class ProvisioningTester { } public List prepare(ApplicationId application, ClusterSpec cluster, Capacity capacity) { - Set reservedBefore = toHostNames(nodeRepository.nodes().list(Node.State.reserved).owner(application)); - Set inactiveBefore = toHostNames(nodeRepository.nodes().list(Node.State.inactive).owner(application)); List hosts1 = provisioner.prepare(application, cluster, capacity, provisionLogger); List hosts2 = provisioner.prepare(application, cluster, capacity, provisionLogger); assertEquals("Prepare is idempotent", hosts1, hosts2); - Set newlyActivated = toHostNames(nodeRepository.nodes().list(Node.State.reserved).owner(application)); - newlyActivated.removeAll(reservedBefore); - newlyActivated.removeAll(inactiveBefore); return hosts1; } @@ -223,7 +218,7 @@ public class ProvisioningTester { provisioner.activate(hosts, new ActivationContext(0), new ApplicationTransaction(lock, transaction)); transaction.commit(); } - assertEquals(toHostNames(hosts), toHostNames(nodeRepository.nodes().list(Node.State.active).owner(application))); + assertEquals(toHostNames(hosts), nodeRepository.nodes().list(Node.State.active).owner(application).hostnames()); return hosts; } @@ -264,10 +259,6 @@ public class ProvisioningTester { return hosts.stream().map(HostSpec::hostname).collect(Collectors.toSet()); } - public Set toHostNames(NodeList nodes) { - return nodes.stream().map(Node::hostname).collect(Collectors.toSet()); - } - /** * Asserts that each active node in this application has a restart count equaling the * number of matches to the given filters -- cgit v1.2.3