private List<Container> createNodesFromHosts(DeployLogger deployLogger, Map<HostResource, ClusterMembership> hosts, ContainerCluster cluster) { List<Container> nodes = new ArrayList<>(); for (Map.Entry<HostResource, ClusterMembership> entry : hosts.entrySet()) { String id = "container." + entry.getValue().index(); Container container = new Container(cluster, id, entry.getValue().retired(), entry.getValue().index(), cluster.isHostedVespa()); container.setHostResource(entry.getKey()); container.initService(deployLogger); nodes.add(container); } return nodes; }
/** Returns the subset of nodes which are not retired */ public NodeList nonretired() { return filter(node -> ! node.allocation().get().membership().retired()); }
/** Returns the subset of nodes which are retired */ public NodeList retired() { return filter(node -> node.allocation().get().membership().retired()); }
private boolean isInactiveOrRetired(Node node) { boolean isInactive = node.state().equals(Node.State.inactive); boolean isRetired = false; if (node.allocation().isPresent()) { isRetired = node.allocation().get().membership().retired(); } return isInactive || isRetired; }
@Override protected void maintain() { List<Node> activeNodes = nodeRepository().getNodes(Node.State.active); Map<ApplicationId, List<Node>> retiredNodesByApplication = activeNodes.stream() .filter(node -> node.allocation().isPresent()) .filter(node -> node.allocation().get().membership().retired()) .collect(Collectors.groupingBy(node -> node.allocation().get().owner())); for (Map.Entry<ApplicationId, List<Node>> entry : retiredNodesByApplication.entrySet()) { ApplicationId application = entry.getKey(); List<Node> retiredNodes = entry.getValue(); try { Optional<Deployment> deployment = deployer.deployFromLocalActive(application); if ( ! deployment.isPresent()) continue; // this will be done at another config server List<Node> nodesToRemove = retiredNodes.stream().filter(this::canRemove).collect(Collectors.toList()); if (nodesToRemove.isEmpty()) { continue; } nodeRepository().setRemovable(application, nodesToRemove); deployment.get().activate(); String nodeList = nodesToRemove.stream().map(Node::hostname).collect(Collectors.joining(", ")); log.info("Redeployed " + application + " to deactivate retired nodes: " + nodeList); } catch (RuntimeException e) { String nodeList = retiredNodes.stream().map(Node::hostname).collect(Collectors.joining(", ")); log.log(Level.WARNING, "Exception trying to deactivate retired nodes from " + application + ": " + nodeList, e); } } }
/** * Returns the input nodes with the changes resulting from applying the settings in hosts to the given list of nodes. */ private List<Node> updateFrom(Collection<HostSpec> hosts, List<Node> nodes) { List<Node> updated = new ArrayList<>(); for (Node node : nodes) { HostSpec hostSpec = getHost(node.hostname(), hosts); node = hostSpec.membership().get().retired() ? node.retire(nodeRepository.clock().instant()) : node.unretire(); node = node.with(node.allocation().get().with(hostSpec.membership().get())); if (hostSpec.flavor().isPresent()) // Docker nodes may change flavor node = node.with(hostSpec.flavor().get()); updated.add(node); } return updated; }
int currentRetiredCount = (int) nodes.stream().filter(node -> node.node.allocation().get().membership().retired()).count(); int deltaRetiredCount = requestedNodes.idealRetiredCount(nodes.size(), currentRetiredCount) - currentRetiredCount; if ( ! node.node.allocation().get().membership().retired() && node.node.state().equals(Node.State.active)) { node.node = node.node.retire(Agent.application, nodeRepository.clock().instant()); if ( node.node.allocation().get().membership().retired() && hasCompatibleFlavor(node.node)) { node.node = node.node.unretire(); if (++deltaRetiredCount == 0) break;
/** * Returns a copy of this node which is retired. * If the node was already retired it is returned as-is. */ public Node retire(Agent agent, Instant retiredAt) { Allocation allocation = requireAllocation("Cannot retire"); if (allocation.membership().retired()) return this; return new Builder(this) .withAllocation(allocation.retire()) .withHistoryEvent(History.Event.Type.retired, agent, retiredAt) .build(); }
private void toSlime(ClusterMembership membership, Cursor object) { object.setString("clustertype", membership.cluster().type().name()); object.setString("clusterid", membership.cluster().id().value()); object.setString("group", String.valueOf(membership.cluster().group().get().index())); object.setLong("index", membership.index()); object.setBool("retired", membership.retired()); }
private static StorageNode createStorageNode(DeployState deployState, ContentCluster parent, HostResource hostResource, StorageGroup parentGroup, ClusterMembership clusterMembership) { StorageNode sNode = new StorageNode(parent.getStorageNodes(), null, clusterMembership.index(), clusterMembership.retired()); sNode.setHostResource(hostResource); sNode.initService(deployState.getDeployLogger()); // TODO: Supplying null as XML is not very nice PersistenceEngine provider = parent.getPersistence().create(deployState, sNode, parentGroup, null); Distributor d = new Distributor(parent.getDistributorNodes(), clusterMembership.index(), null, provider); d.setHostResource(sNode.getHostResource()); d.initService(deployState.getDeployLogger()); return sNode; } }