diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-10-13 15:46:55 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-10-13 15:56:53 +0200 |
commit | accc6dc69cdc40c4c70d970c48dd1066fb348e6f (patch) | |
tree | b47bcd64c83056fc8b74dcd5a09c77c9e4f7301b /node-repository | |
parent | 1b39a0ad7fbb7243e0e58869973d70c511792252 (diff) |
Do not update node requested event
Diffstat (limited to 'node-repository')
5 files changed, 14 insertions, 74 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java index b43e2ae051f..624492a14f3 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationLockException; -import com.yahoo.config.provision.HostLivenessTracker; import com.yahoo.jdisc.Metric; import com.yahoo.lang.MutableInteger; import com.yahoo.transaction.Mutex; @@ -13,12 +12,10 @@ 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.Agent; -import com.yahoo.vespa.hosted.provision.node.History; import com.yahoo.vespa.service.monitor.ServiceMonitor; import com.yahoo.yolean.Exceptions; import java.time.Duration; -import java.time.Instant; import java.util.List; import java.util.Map; import java.util.Optional; @@ -34,41 +31,18 @@ import static java.util.stream.Collectors.counting; */ public class NodeHealthTracker extends NodeRepositoryMaintainer { - /** Provides information about the status of ready hosts */ - private final HostLivenessTracker hostLivenessTracker; - /** Provides (more accurate) information about the status of active hosts */ private final ServiceMonitor serviceMonitor; - public NodeHealthTracker(HostLivenessTracker hostLivenessTracker, - ServiceMonitor serviceMonitor, NodeRepository nodeRepository, + public NodeHealthTracker(ServiceMonitor serviceMonitor, NodeRepository nodeRepository, Duration interval, Metric metric) { super(nodeRepository, interval, metric); - this.hostLivenessTracker = hostLivenessTracker; this.serviceMonitor = serviceMonitor; } @Override protected double maintain() { - return ( updateReadyNodeLivenessEvents() + updateActiveNodeDownState() ) / 2; - } - - private double updateReadyNodeLivenessEvents() { - // Update node last request events through ZooKeeper to collect request to all config servers. - // We do this here ("lazily") to avoid writing to zk for each config request. - try (Mutex lock = nodeRepository().nodes().lockUnallocated()) { - for (Node node : nodeRepository().nodes().list(Node.State.ready)) { - Optional<Instant> lastLocalRequest = hostLivenessTracker.lastRequestFrom(node.hostname()); - if (lastLocalRequest.isEmpty()) continue; - - if (!node.history().hasEventAfter(History.Event.Type.requested, lastLocalRequest.get())) { - History updatedHistory = node.history() - .with(new History.Event(History.Event.Type.requested, Agent.NodeHealthTracker, lastLocalRequest.get())); - nodeRepository().nodes().write(node.with(updatedHistory), lock); - } - } - } - return 1.0; + return updateActiveNodeDownState(); } /** diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java index dac6ee61ef3..708d8b59eb0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java @@ -5,7 +5,6 @@ import com.yahoo.component.AbstractComponent; import com.yahoo.component.annotation.Inject; import com.yahoo.concurrent.maintenance.Maintainer; import com.yahoo.config.provision.Deployer; -import com.yahoo.config.provision.HostLivenessTracker; import com.yahoo.config.provision.InfraDeployer; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; @@ -33,7 +32,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent { @SuppressWarnings("unused") @Inject public NodeRepositoryMaintenance(NodeRepository nodeRepository, Deployer deployer, InfraDeployer infraDeployer, - HostLivenessTracker hostLivenessTracker, ServiceMonitor serviceMonitor, + ServiceMonitor serviceMonitor, Zone zone, Metric metric, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource, MetricsFetcher metricsFetcher) { @@ -46,7 +45,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent { maintainers.add(infrastructureProvisioner); maintainers.add(new NodeFailer(deployer, nodeRepository, defaults.failGrace, defaults.nodeFailerInterval, defaults.throttlePolicy, metric)); - maintainers.add(new NodeHealthTracker(hostLivenessTracker, serviceMonitor, nodeRepository, defaults.nodeFailureStatusUpdateInterval, metric)); + maintainers.add(new NodeHealthTracker(serviceMonitor, nodeRepository, defaults.nodeFailureStatusUpdateInterval, metric)); maintainers.add(new ExpeditedChangeApplicationMaintainer(deployer, metric, nodeRepository, defaults.expeditedChangeRedeployInterval)); maintainers.add(new ReservationExpirer(nodeRepository, defaults.reservationExpiry, metric)); maintainers.add(new RetiredExpirer(nodeRepository, deployer, metric, defaults.retiredInterval, defaults.retiredExpiry)); 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 14fa2e1c8ff..4aca1cbd056 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 @@ -46,8 +46,10 @@ public class History { private static ImmutableMap<Event.Type, Event> toImmutableMap(Collection<Event> events) { ImmutableMap.Builder<Event.Type, Event> builder = new ImmutableMap.Builder<>(); - for (Event event : events) + for (Event event : events) { + if (event.type() == Event.Type.requested) continue; // TODO (freva): Remove requested event after 8.70 builder.put(event.type(), event); + } return builder.build(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java index b4e304155a6..a5ebc6b3efc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.persistence; +import ai.vespa.http.DomainName; import com.yahoo.component.Version; import com.yahoo.concurrent.UncheckedTimeoutException; import com.yahoo.config.provision.ApplicationId; @@ -484,15 +485,12 @@ public class CuratorDatabaseClient { transaction.onCommitted(() -> { for (var lb : loadBalancers) { if (lb.state() == fromState) continue; + Optional<String> target = lb.instance().flatMap(instance -> instance.hostname().map(DomainName::value).or(instance::ipAddress)); if (fromState == null) { - log.log(Level.INFO, () -> "Creating " + lb.id() + lb.instance() - .map(instance -> " (" + instance.hostname() + ")") - .orElse("") + + log.log(Level.INFO, () -> "Creating " + lb.id() + target.map(t -> " (" + t + ")").orElse("") + " in " + lb.state()); } else { - log.log(Level.INFO, () -> "Moving " + lb.id() + lb.instance() - .map(instance -> " (" + instance.hostname() + ")") - .orElse("") + + log.log(Level.INFO, () -> "Moving " + lb.id() + target.map(t -> " (" + t + ")").orElse("") + " from " + fromState + " to " + lb.state()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index 2d507967370..977d72c11ea 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -109,7 +109,7 @@ public class NodeFailTester { /** Create hostCount hosts, one app with containerCount containers, and one app with contentCount content nodes. */ public static NodeFailTester withTwoApplications(int hostCount, int containerCount, int contentCount) { NodeFailTester tester = new NodeFailTester(); - tester.createHostNodes(hostCount); + tester.tester.makeReadyHosts(hostCount, new NodeResources(2, 8, 20, 10)); // Create tenant host application ClusterSpec clusterNodeAdminApp = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); @@ -136,13 +136,7 @@ public class NodeFailTester { public static NodeFailTester withTwoApplications(int numberOfHosts) { NodeFailTester tester = new NodeFailTester(); - - int nodesPerHost = 3; - List<Node> hosts = tester.createHostNodes(numberOfHosts); - for (int i = 0; i < hosts.size(); i++) { - tester.createReadyNodes(nodesPerHost, i * nodesPerHost, Optional.of("parent" + (i + 1)), - new NodeResources(1, 4, 100, 0.3), NodeType.tenant); - } + tester.tester.makeReadyNodes(numberOfHosts, new NodeResources(4, 16, 400, 10), NodeType.host, 8); // Create applications ClusterSpec clusterNodeAdminApp = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); @@ -227,26 +221,11 @@ public class NodeFailTester { } public NodeHealthTracker createUpdater() { - return new NodeHealthTracker(hostLivenessTracker, serviceMonitor, nodeRepository, Duration.ofMinutes(5), metric); - } - - public void allNodesMakeAConfigRequestExcept(Node ... deadNodeArray) { - allNodesMakeAConfigRequestExcept(List.of(deadNodeArray)); - } - - public void allNodesMakeAConfigRequestExcept(List<Node> deadNodes) { - for (Node node : nodeRepository.nodes().list()) { - if ( ! deadNodes.contains(node)) - hostLivenessTracker.receivedRequestFrom(node.hostname()); - } + return new NodeHealthTracker(serviceMonitor, nodeRepository, Duration.ofMinutes(5), metric); } public Clock clock() { return clock; } - public List<Node> createReadyNodes(int count) { - return createReadyNodes(count, 0); - } - public List<Node> createReadyNodes(int count, NodeResources resources) { return createReadyNodes(count, 0, resources); } @@ -255,22 +234,10 @@ public class NodeFailTester { return createReadyNodes(count, 0, Optional.empty(), hostFlavors.getFlavorOrThrow("default"), nodeType); } - public List<Node> createReadyNodes(int count, int startIndex) { - return createReadyNodes(count, startIndex, "default"); - } - - public List<Node> createReadyNodes(int count, int startIndex, String flavor) { - return createReadyNodes(count, startIndex, Optional.empty(), hostFlavors.getFlavorOrThrow(flavor), NodeType.tenant); - } - public List<Node> createReadyNodes(int count, int startIndex, NodeResources resources) { return createReadyNodes(count, startIndex, Optional.empty(), new Flavor(resources), NodeType.tenant); } - private List<Node> createReadyNodes(int count, int startIndex, Optional<String> parentHostname, NodeResources resources, NodeType nodeType) { - return createReadyNodes(count, startIndex, parentHostname, new Flavor(resources), nodeType); - } - private List<Node> createReadyNodes(int count, int startIndex, Optional<String> parentHostname, Flavor flavor, NodeType nodeType) { List<Node> nodes = new ArrayList<>(count); int lastOctetOfPoolAddress = 0; |