diff options
5 files changed, 35 insertions, 1 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Deployer.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Deployer.java index 2254b6d7747..d379788394e 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/Deployer.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Deployer.java @@ -2,6 +2,7 @@ package com.yahoo.config.provision; import java.time.Duration; +import java.time.Instant; import java.util.Optional; /** @@ -33,4 +34,7 @@ public interface Deployer { */ Optional<Deployment> deployFromLocalActive(ApplicationId application, Duration timeout); + /** Returns the time the current local active session was created, or empty if there is no local active session */ + Optional<Instant> lastDeployTime(ApplicationId application); + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index 581c6e0394e..2562ae4df50 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -232,6 +232,15 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye false /* don't validate as this is already deployed */, version)); } + @Override + public Optional<Instant> lastDeployTime(ApplicationId application) { + Tenant tenant = tenantRepository.getTenant(application.tenant()); + if (tenant == null) return Optional.empty(); + LocalSession activeSession = getActiveSession(tenant, application); + if (activeSession == null) return Optional.empty(); + return Optional.of(Instant.ofEpochSecond(activeSession.getCreateTime())); + } + public ApplicationId activate(Tenant tenant, long sessionId, TimeoutBudget timeoutBudget, 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; |