diff options
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted')
3 files changed, 16 insertions, 9 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java index e5e5ce27cf1..cb82585fe01 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java @@ -280,8 +280,8 @@ public class Nodes { } public List<Node> deallocateRecursively(String hostname, Agent agent, String reason) { - Node nodeToDirty = node(hostname).orElseThrow(() -> - new IllegalArgumentException("Could not deallocate " + hostname + ": Node not found")); + Node nodeToDirty = node(hostname).orElseThrow(() -> new IllegalArgumentException("Could not deallocate " + + hostname + ": Node not found")); List<Node> nodesToDirty = (nodeToDirty.type().isHost() ? @@ -289,7 +289,6 @@ public class Nodes { Stream.of(nodeToDirty)) .filter(node -> node.state() != Node.State.dirty) .collect(Collectors.toList()); - List<String> hostnamesNotAllowedToDirty = nodesToDirty.stream() .filter(node -> node.state() != Node.State.provisioned) .filter(node -> node.state() != Node.State.failed) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java index 7d15a2b30b1..4dc199dd7b2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java @@ -17,7 +17,9 @@ import com.yahoo.config.provision.ProvisionLogger; import com.yahoo.config.provision.Provisioner; import com.yahoo.config.provision.Zone; import com.yahoo.transaction.Mutex; +import com.yahoo.vespa.flags.FetchVector; import com.yahoo.vespa.flags.FlagSource; +import com.yahoo.vespa.flags.Flags; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; @@ -62,7 +64,8 @@ public class NodeRepositoryProvisioner implements Provisioner { @Inject public NodeRepositoryProvisioner(NodeRepository nodeRepository, Zone zone, - ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) { + ProvisionServiceProvider provisionServiceProvider, + FlagSource flagSource) { this.nodeRepository = nodeRepository; this.allocationOptimizer = new AllocationOptimizer(nodeRepository); this.capacityPolicies = new CapacityPolicies(nodeRepository); @@ -113,7 +116,10 @@ public class NodeRepositoryProvisioner implements Provisioner { : requested.minResources().nodeResources(); nodeSpec = NodeSpec.from(requested.type()); } - return asSortedHosts(preparer.prepare(application, cluster, nodeSpec, groups), resources); + var reuseIndexes = Flags.REUSE_NODE_INDEXES.bindTo(nodeRepository.flagSource()) + .with(FetchVector.Dimension.ZONE_ID, zone.systemLocalValue()) + .value(); + return asSortedHosts(preparer.prepare(application, cluster, nodeSpec, groups, reuseIndexes), resources); } @Override diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java index 838d6751d09..a6f16d3d65e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java @@ -34,9 +34,10 @@ class Preparer { } /** Prepare all required resources for the given application and cluster */ - public List<Node> prepare(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, int wantedGroups) { + public List<Node> prepare(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, int wantedGroups, + boolean reuseIndexes) { try { - var nodes = prepareNodes(application, cluster, requestedNodes, wantedGroups); + var nodes = prepareNodes(application, cluster, requestedNodes, wantedGroups, reuseIndexes); prepareLoadBalancer(application, cluster, requestedNodes); return nodes; } @@ -55,13 +56,14 @@ class Preparer { // Note: This operation may make persisted changes to the set of reserved and inactive nodes, // but it may not change the set of active nodes, as the active nodes must stay in sync with the // active config model which is changed on activate - private List<Node> prepareNodes(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, int wantedGroups) { + private List<Node> prepareNodes(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, + int wantedGroups, boolean reuseIndexes) { NodesAndHosts<LockedNodeList> allNodesAndHosts = groupPreparer.createNodesAndHostUnlocked(); NodeList appNodes = allNodesAndHosts.nodes().owner(application); List<Node> surplusNodes = findNodesInRemovableGroups(appNodes, cluster, wantedGroups); List<Integer> usedIndices = appNodes.cluster(cluster.id()).mapToList(node -> node.allocation().get().membership().index()); - NodeIndices indices = new NodeIndices(usedIndices, ! cluster.type().isContent()); + NodeIndices indices = new NodeIndices(usedIndices, reuseIndexes || ! cluster.type().isContent()); List<Node> acceptedNodes = new ArrayList<>(); for (int groupIndex = 0; groupIndex < wantedGroups; groupIndex++) { |