diff options
4 files changed, 18 insertions, 106 deletions
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index bce487f7eb1..78aec5285cf 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.flags; import com.yahoo.component.Vtag; import com.yahoo.vespa.defaults.Defaults; -import com.yahoo.vespa.flags.custom.NodeMaintainerDurations; import com.yahoo.vespa.flags.custom.PreprovisionCapacity; import java.util.List; @@ -112,9 +111,9 @@ public class Flags { "Takes effect at redeployment", APPLICATION_ID); - public static final UnboundJacksonFlag<NodeMaintainerDurations> NODE_MAINTAINER_DURATIONS = defineJacksonFlag( - "node-maintainer-durations", new NodeMaintainerDurations(), NodeMaintainerDurations.class, - "Provides overrides for durations in NodeRepositoryMaintenance", + public static final UnboundIntFlag REBOOT_INTERVAL_IN_DAYS = defineIntFlag( + "reboot-interval-in-days", 30, + "The reboot interval in days.", "Takes effect on start of config server / controller"); public static final UnboundBooleanFlag ENABLE_DYNAMIC_PROVISIONING = defineFeatureFlag( diff --git a/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java b/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java deleted file mode 100644 index 18a041c33d4..00000000000 --- a/flags/src/main/java/com/yahoo/vespa/flags/custom/NodeMaintainerDurations.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.flags.custom; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonCreator; - -import java.time.Duration; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -/** - * {@code NodeRepositoryMaintenance} depends on various durations, e.g. the reboot interval. This class - * defines a serialization format for specifying such durations as a JSON object with keys matching - * the name (reboot_interval) and with the value being the duration in second as an integer. - * - * @author hakonhall - */ -public class NodeMaintainerDurations { - @JsonAnySetter - private final Map<String, Long> durations = new HashMap<>(); - - @JsonCreator - public NodeMaintainerDurations() {} - - public NodeMaintainerDurations(Map<String, Long> durations) { this.durations.putAll(durations); } - - @JsonAnyGetter - private Map<String, Long> getDurations() { return durations; } - - public Optional<Duration> getDuration(String durationName) { - return Optional.ofNullable(durations.get(durationName)).map(Duration::ofSeconds); - } -} diff --git a/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java b/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java deleted file mode 100644 index d9a2a6fa017..00000000000 --- a/flags/src/test/java/com/yahoo/vespa/flags/NodeMaintainerDurationsTest.java +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.flags; - -import com.yahoo.test.json.JsonTestHelper; -import com.yahoo.vespa.flags.custom.NodeMaintainerDurations; -import org.junit.Test; - -import java.time.Duration; -import java.util.Map; -import java.util.Optional; - -import static org.junit.Assert.assertEquals; - -/** - * @author hakonhall - */ -public class NodeMaintainerDurationsTest { - @Test - public void testSerialization() { - String flagValueJson = "{ \"reboot_interval\": 3, \"fail_grace\": 7}"; - var rawFlag = JsonNodeRawFlag.fromJson(flagValueJson); - var serializer = new JacksonSerializer<>(NodeMaintainerDurations.class); - var durations = serializer.deserialize(rawFlag); - assertEquals(Optional.of(Duration.ofSeconds(3)), durations.getDuration("reboot_interval")); - assertEquals(Optional.of(Duration.ofSeconds(7)), durations.getDuration("fail_grace")); - assertEquals(Optional.empty(), durations.getDuration("non-existing")); - - RawFlag serializedRawFlag = serializer.serialize(durations); - JsonTestHelper.assertJsonEquals(flagValueJson, serializedRawFlag.asJson()); - } - - @Test - public void testFlag() { - InMemoryFlagSource flagSource = new InMemoryFlagSource(); - var durations = new NodeMaintainerDurations(Map.of("reboot_interval", 3L, "fail_grace", 7L)); - flagSource.withJacksonFlag(Flags.NODE_MAINTAINER_DURATIONS.id(), durations, NodeMaintainerDurations.class); - NodeMaintainerDurations resolvedDurations = Flags.NODE_MAINTAINER_DURATIONS.bindTo(flagSource).value(); - assertEquals(Optional.of(Duration.ofSeconds(3)), resolvedDurations.getDuration("reboot_interval")); - assertEquals(Optional.of(Duration.ofSeconds(7)), resolvedDurations.getDuration("fail_grace")); - assertEquals(Optional.empty(), resolvedDurations.getDuration("non-existing")); - } -} 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 5ecde542bb6..c6eab53174b 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 @@ -11,7 +11,6 @@ import com.yahoo.config.provision.Zone; import com.yahoo.jdisc.Metric; import com.yahoo.vespa.flags.FlagSource; import com.yahoo.vespa.flags.Flags; -import com.yahoo.vespa.flags.custom.NodeMaintainerDurations; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.provisioning.ProvisionServiceProvider; import com.yahoo.vespa.orchestrator.Orchestrator; @@ -50,7 +49,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { private final CapacityReportMaintainer capacityReportMaintainer; private final OsUpgradeActivator osUpgradeActivator; private final Rebalancer rebalancer; - private final NodeMaintainerDurations flagDurations; @SuppressWarnings("unused") @Inject @@ -67,26 +65,25 @@ public class NodeRepositoryMaintenance extends AbstractComponent { HostLivenessTracker hostLivenessTracker, ServiceMonitor serviceMonitor, Zone zone, Clock clock, Orchestrator orchestrator, Metric metric, ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) { - this.flagDurations = Flags.NODE_MAINTAINER_DURATIONS.bindTo(flagSource).value(); DefaultTimes defaults = new DefaultTimes(zone); - nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, durationOverride("fail_grace").orElse(defaults.failGrace), clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric); - periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, durationOverride("periodic_redeploy_interval").orElse(defaults.periodicRedeployInterval)); - operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, durationOverride("operator_change_redeploy_interval").orElse(defaults.operatorChangeRedeployInterval)); - reservationExpirer = new ReservationExpirer(nodeRepository, clock, durationOverride("reservation_expiry").orElse(defaults.reservationExpiry)); - retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, durationOverride("retired_interval").orElse(defaults.retiredInterval), durationOverride("retired_expiry").orElse(defaults.retiredExpiry)); - inactiveExpirer = new InactiveExpirer(nodeRepository, clock, durationOverride("inactive_expiry").orElse(defaults.inactiveExpiry)); - failedExpirer = new FailedExpirer(nodeRepository, zone, clock, durationOverride("failed_expirer_interval").orElse(defaults.failedExpirerInterval)); - dirtyExpirer = new DirtyExpirer(nodeRepository, clock, durationOverride("dirty_expiry").orElse(defaults.dirtyExpiry)); - provisionedExpirer = new ProvisionedExpirer(nodeRepository, clock, durationOverride("provisioned_expiry").orElse(defaults.provisionedExpiry)); - nodeRebooter = new NodeRebooter(nodeRepository, clock, durationOverride("reboot_interval").orElse(defaults.rebootInterval)); - metricsReporter = new MetricsReporter(nodeRepository, metric, orchestrator, serviceMonitor, periodicApplicationMaintainer::pendingDeployments, durationOverride("metrics_interval").orElse(defaults.metricsInterval)); - infrastructureProvisioner = new InfrastructureProvisioner(nodeRepository, infraDeployer, durationOverride("infrastructure_provision_interval").orElse(defaults.infrastructureProvisionInterval)); + nodeFailer = new NodeFailer(deployer, hostLivenessTracker, serviceMonitor, nodeRepository, defaults.failGrace, clock, orchestrator, throttlePolicyFromEnv().orElse(defaults.throttlePolicy), metric); + periodicApplicationMaintainer = new PeriodicApplicationMaintainer(deployer, nodeRepository, defaults.redeployMaintainerInterval, defaults.periodicRedeployInterval); + operatorChangeApplicationMaintainer = new OperatorChangeApplicationMaintainer(deployer, nodeRepository, defaults.operatorChangeRedeployInterval); + reservationExpirer = new ReservationExpirer(nodeRepository, clock, defaults.reservationExpiry); + retiredExpirer = new RetiredExpirer(nodeRepository, orchestrator, deployer, clock, defaults.retiredInterval, defaults.retiredExpiry); + inactiveExpirer = new InactiveExpirer(nodeRepository, clock, defaults.inactiveExpiry); + failedExpirer = new FailedExpirer(nodeRepository, zone, clock, defaults.failedExpirerInterval); + dirtyExpirer = new DirtyExpirer(nodeRepository, clock, defaults.dirtyExpiry); + provisionedExpirer = new ProvisionedExpirer(nodeRepository, clock, defaults.provisionedExpiry); + nodeRebooter = new NodeRebooter(nodeRepository, clock, Duration.ofDays(Flags.REBOOT_INTERVAL_IN_DAYS.bindTo(flagSource).value())); + metricsReporter = new MetricsReporter(nodeRepository, metric, orchestrator, serviceMonitor, periodicApplicationMaintainer::pendingDeployments, defaults.metricsInterval); + infrastructureProvisioner = new InfrastructureProvisioner(nodeRepository, infraDeployer, defaults.infrastructureProvisionInterval); loadBalancerExpirer = provisionServiceProvider.getLoadBalancerService().map(lbService -> - new LoadBalancerExpirer(nodeRepository, durationOverride("load_balancer_expirer_interval").orElse(defaults.loadBalancerExpirerInterval), lbService)); + new LoadBalancerExpirer(nodeRepository, defaults.loadBalancerExpirerInterval, lbService)); dynamicProvisioningMaintainer = provisionServiceProvider.getHostProvisioner().map(hostProvisioner -> - new DynamicProvisioningMaintainer(nodeRepository, durationOverride("host_provisioner_interval").orElse(defaults.dynamicProvisionerInterval), hostProvisioner, flagSource)); - capacityReportMaintainer = new CapacityReportMaintainer(nodeRepository, metric, durationOverride("capacity_report_interval").orElse(defaults.capacityReportInterval)); + new DynamicProvisioningMaintainer(nodeRepository, defaults.dynamicProvisionerInterval, hostProvisioner, flagSource)); + capacityReportMaintainer = new CapacityReportMaintainer(nodeRepository, metric, defaults.capacityReportInterval); osUpgradeActivator = new OsUpgradeActivator(nodeRepository, defaults.osUpgradeActivatorInterval); rebalancer = new Rebalancer(nodeRepository, provisionServiceProvider.getHostResourcesCalculator(), provisionServiceProvider.getHostProvisioner(), metric, clock, defaults.rebalancerInterval); @@ -115,11 +112,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { rebalancer.deconstruct(); } - private Optional<Duration> durationOverride(String durationName) { - return Optional.ofNullable(System.getenv(envPrefix + durationName)).map(Long::parseLong).map(Duration::ofSeconds) - .or(() -> flagDurations.getDuration(durationName)); - } - private static Optional<NodeFailer.ThrottlePolicy> throttlePolicyFromEnv() { String policyName = System.getenv(envPrefix + "throttle_policy"); try { @@ -150,7 +142,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { private final Duration failedExpirerInterval; private final Duration dirtyExpiry; private final Duration provisionedExpiry; - private final Duration rebootInterval; private final Duration capacityReportInterval; private final Duration metricsInterval; private final Duration retiredInterval; @@ -170,7 +161,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent { operatorChangeRedeployInterval = Duration.ofMinutes(1); failedExpirerInterval = Duration.ofMinutes(10); provisionedExpiry = Duration.ofHours(4); - rebootInterval = Duration.ofDays(30); capacityReportInterval = Duration.ofMinutes(10); metricsInterval = Duration.ofMinutes(1); infrastructureProvisionInterval = Duration.ofMinutes(1); |