diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-06-28 21:30:11 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-06-28 21:30:11 +0200 |
commit | 14e13623fe3dbaaefdae61daacd34a974efbb14f (patch) | |
tree | 43432841b12de4b8dc0f5983cacbc7f06d02764e /node-repository | |
parent | d9be160582d3488c944907f6958e09b9ab1555b8 (diff) |
Application deployments inhibits periodic redeploys for a while
Why?
1) Too many redeploys are unecessary and have a cost
2) If restartOnDeploy is turned on, we may end up not able to
respect it to make sure config is actually deployed if a periodic
redeploy follows right after an application deploy.
Diffstat (limited to 'node-repository')
3 files changed, 22 insertions, 1 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java index 1d894f80eca..fff768b1e40 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java @@ -10,6 +10,7 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.time.Duration; +import java.time.Instant; import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; @@ -53,6 +54,8 @@ public abstract class ApplicationMaintainer extends Maintainer { deploymentExecutor.execute(() -> deployWithLock(application)); } + protected Deployer deployer() { return deployer; } + /** Block in this method until the next application should be maintained */ protected abstract void throttle(int applicationCount); @@ -78,7 +81,6 @@ public abstract class ApplicationMaintainer extends Maintainer { if ( ! isActive(application)) return; // became inactive since deployment was requested Optional<Deployment> deployment = deployer.deployFromLocalActive(application); if ( ! deployment.isPresent()) return; // this will be done at another config server - deployment.get().activate(); } catch (RuntimeException e) { log.log(Level.WARNING, "Exception on maintenance redeploy", e); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java index cdc5ecf77ec..4729ff1a39a 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java @@ -1,12 +1,15 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.maintenance; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Deployer; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.time.Duration; +import java.time.Instant; import java.util.List; +import java.util.Optional; /** * The application maintainer regularly redeploys all applications to make sure the node repo and application @@ -29,6 +32,16 @@ public class PeriodicApplicationMaintainer extends ApplicationMaintainer { } @Override + protected void deploy(ApplicationId application) { + Optional<Instant> lastDeploy = deployer().lastDeployTime(application); + if (lastDeploy.isPresent() && + lastDeploy.get().isAfter(nodeRepository().clock().instant().minus(interval()))) + return; // Don't deploy if a regular deploy just happened + + super.deploy(application); + } + + @Override protected List<Node> nodesNeedingMaintenance() { return nodeRepository().getNodes(Node.State.active); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java index c880c66abc7..c622f6ffb8b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java @@ -13,6 +13,7 @@ import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import java.time.Duration; +import java.time.Instant; import java.util.Collections; import java.util.List; import java.util.Map; @@ -55,6 +56,11 @@ public class MockDeployer implements Deployer { return Optional.of(new MockDeployment(provisioner, applications.get(id))); } + @Override + public Optional<Instant> lastDeployTime(ApplicationId application) { + return Optional.empty(); // not implemented + } + public class MockDeployment implements Deployment { private final NodeRepositoryProvisioner provisioner; |