summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/Deployer.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java9
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainer.java13
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java6
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;