summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2020-09-25 13:15:23 +0200
committerGitHub <noreply@github.com>2020-09-25 13:15:23 +0200
commit058e37f658cf010c5bcf8da31d503845a8f5d7e5 (patch)
tree0b0270f6461aa7fa24cd96cad8cf45b005339866 /configserver
parent4209883f5e426652f22697a0bcec3e1dd2ef016f (diff)
parent27c498346fcf15c999f5c93ddf8e9e36e055a2b8 (diff)
Merge pull request #14556 from vespa-engine/freva/internal-restart
Internal restart on internal deployments
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java68
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java5
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java158
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java8
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java4
9 files changed, 139 insertions, 116 deletions
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 a9247373043..57502973873 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
@@ -64,7 +64,10 @@ import com.yahoo.vespa.config.server.tenant.TenantRepository;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.Lock;
import com.yahoo.vespa.defaults.Defaults;
+import com.yahoo.vespa.flags.BooleanFlag;
+import com.yahoo.vespa.flags.FetchVector;
import com.yahoo.vespa.flags.FlagSource;
+import com.yahoo.vespa.flags.Flags;
import com.yahoo.vespa.flags.InMemoryFlagSource;
import com.yahoo.vespa.orchestrator.Orchestrator;
@@ -127,6 +130,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
private final LogRetriever logRetriever;
private final TesterClient testerClient;
private final Metric metric;
+ private final BooleanFlag deployWithInternalRestart;
@Inject
public ApplicationRepository(TenantRepository tenantRepository,
@@ -176,6 +180,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
this.clock = Objects.requireNonNull(clock);
this.testerClient = Objects.requireNonNull(testerClient);
this.metric = Objects.requireNonNull(metric);
+ this.deployWithInternalRestart = Flags.DEPLOY_WITH_INTERNAL_RESTART.bindTo(flagSource);
}
public static class Builder {
@@ -279,27 +284,29 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
bootstrapping.set(false);
}
- public PrepareResult prepare(Tenant tenant, long sessionId, PrepareParams prepareParams, Instant now) {
+ public PrepareResult prepare(Tenant tenant, long sessionId, PrepareParams prepareParams) {
+ DeployHandlerLogger logger = DeployHandlerLogger.forPrepareParams(prepareParams);
+ Deployment deployment = prepare(tenant, sessionId, prepareParams, logger);
+ return new PrepareResult(sessionId, deployment.configChangeActions(), logger);
+ }
+
+ private Deployment prepare(Tenant tenant, long sessionId, PrepareParams prepareParams, DeployHandlerLogger logger) {
validateThatLocalSessionIsNotActive(tenant, sessionId);
LocalSession session = getLocalSession(tenant, sessionId);
ApplicationId applicationId = prepareParams.getApplicationId();
- Optional<ApplicationSet> currentActiveApplicationSet = getCurrentActiveApplicationSet(tenant, applicationId);
- DeployHandlerLogger logger = DeployHandlerLogger.forApplication(applicationId, prepareParams.isVerbose());
- try (ActionTimer timer = timerFor(applicationId, "deployment.prepareMillis")) {
- SessionRepository sessionRepository = tenant.getSessionRepository();
- ConfigChangeActions actions = sessionRepository.prepareLocalSession(session, logger, prepareParams,
- currentActiveApplicationSet, tenant.getPath(), now);
- logConfigChangeActions(actions, logger);
- log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Session " + sessionId + " prepared successfully. ");
- return new PrepareResult(sessionId, actions, logger);
- }
+ Deployment deployment = Deployment.unprepared(session, this, hostProvisioner, tenant, prepareParams, logger, clock);
+ deployment.prepare();
+
+ logConfigChangeActions(deployment.configChangeActions(), logger);
+ log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Session " + sessionId + " prepared successfully. ");
+ return deployment;
}
- public PrepareResult deploy(CompressedApplicationInputStream in, PrepareParams prepareParams, Instant now) {
+ public PrepareResult deploy(CompressedApplicationInputStream in, PrepareParams prepareParams) {
File tempDir = uncheck(() -> Files.createTempDirectory("deploy")).toFile();
PrepareResult prepareResult;
try {
- prepareResult = deploy(decompressApplication(in, tempDir), prepareParams, now);
+ prepareResult = deploy(decompressApplication(in, tempDir), prepareParams);
} finally {
cleanupTempDirectory(tempDir);
}
@@ -307,34 +314,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams) {
- return deploy(applicationPackage, prepareParams, Instant.now());
- }
-
- public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams, Instant now) {
- if (prepareParams.internalRestart() && hostProvisioner.isEmpty())
- throw new IllegalArgumentException("Internal restart not supported without HostProvisioner");
-
ApplicationId applicationId = prepareParams.getApplicationId();
long sessionId = createSession(applicationId, prepareParams.getTimeoutBudget(), applicationPackage);
Tenant tenant = getTenant(applicationId);
- PrepareResult result = prepare(tenant, sessionId, prepareParams, now);
- activate(tenant, sessionId, prepareParams.getTimeoutBudget(), prepareParams.force());
-
- if (prepareParams.internalRestart() && !result.configChangeActions().getRestartActions().isEmpty()) {
- Set<String> hostnames = result.configChangeActions().getRestartActions().getEntries().stream()
- .flatMap(entry -> entry.getServices().stream())
- .map(ServiceInfo::getHostName)
- .collect(Collectors.toUnmodifiableSet());
-
- hostProvisioner.get().restart(applicationId, HostFilter.from(hostnames, Set.of(), Set.of(), Set.of()));
- result.deployLogger().log(Level.INFO, String.format("Scheduled service restart of %d nodes: %s",
- hostnames.size(), hostnames.stream().sorted().collect(Collectors.joining(", "))));
-
- ConfigChangeActions newActions = new ConfigChangeActions(new RestartActions(), result.configChangeActions().getRefeedActions());
- return new PrepareResult(result.sessionId(), newActions, result.deployLogger());
- }
+ DeployHandlerLogger logger = DeployHandlerLogger.forPrepareParams(prepareParams);
+ Deployment deployment = prepare(tenant, sessionId, prepareParams, logger);
+ deployment.activate();
- return result;
+ return new PrepareResult(sessionId, deployment.configChangeActions(), logger);
}
/**
@@ -395,9 +382,10 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
SessionRepository sessionRepository = tenant.getSessionRepository();
LocalSession newSession = sessionRepository.createSessionFromExisting(activeSession, logger, true, timeoutBudget);
sessionRepository.addLocalSession(newSession);
+ boolean internalRestart = deployWithInternalRestart.with(FetchVector.Dimension.APPLICATION_ID, application.serializedForm()).value();
- return Optional.of(Deployment.unprepared(newSession, this, hostProvisioner, tenant, timeout, clock,
- false /* don't validate as this is already deployed */, bootstrap));
+ return Optional.of(Deployment.unprepared(newSession, this, hostProvisioner, tenant, logger, timeout, clock,
+ false /* don't validate as this is already deployed */, bootstrap, internalRestart));
}
@Override
@@ -420,7 +408,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
private Deployment deployment(LocalSession session, Tenant tenant, Duration timeout, boolean force) {
- return Deployment.prepared(session, this, hostProvisioner, tenant, timeout, clock, false, force);
+ return Deployment.prepared(session, this, hostProvisioner, tenant, logger, timeout, clock, false, force);
}
public Transaction deactivateCurrentActivateNew(Session active, LocalSession prepared, boolean force) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java
index b6cd22d78b4..110c6464eba 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java
@@ -8,6 +8,7 @@ import com.yahoo.config.provision.TenantName;
import com.yahoo.log.LogLevel;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Slime;
+import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
import java.util.logging.Level;
@@ -60,4 +61,8 @@ public class DeployHandlerLogger implements DeployLogger {
public static DeployHandlerLogger forTenant(TenantName tenantName, boolean verbose) {
return new DeployHandlerLogger(TenantRepository.logPre(tenantName), verbose);
}
+
+ public static DeployHandlerLogger forPrepareParams(PrepareParams prepareParams) {
+ return forApplication(prepareParams.getApplicationId(), prepareParams.isVerbose());
+ }
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
index 6c111ff0131..81712f256fe 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
@@ -1,31 +1,34 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.deploy;
-import com.yahoo.component.Version;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
import com.yahoo.config.application.api.DeployLogger;
+import com.yahoo.config.model.api.ServiceInfo;
import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.AthenzDomain;
-import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.HostFilter;
import com.yahoo.config.provision.Provisioner;
-import java.util.logging.Level;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.ApplicationRepository.ActionTimer;
import com.yahoo.vespa.config.server.TimeoutBudget;
import com.yahoo.vespa.config.server.application.ApplicationSet;
+import com.yahoo.vespa.config.server.configchange.ConfigChangeActions;
+import com.yahoo.vespa.config.server.configchange.RestartActions;
import com.yahoo.vespa.config.server.http.InternalServerException;
import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.session.RemoteSession;
import com.yahoo.vespa.config.server.session.Session;
-import com.yahoo.vespa.config.server.session.SilentDeployLogger;
import com.yahoo.vespa.config.server.tenant.Tenant;
import com.yahoo.vespa.curator.Lock;
import java.time.Clock;
import java.time.Duration;
import java.util.Optional;
+import java.util.Set;
+import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import static com.yahoo.vespa.curator.Curator.CompletionWaiter;
@@ -44,82 +47,59 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
/** The session containing the application instance to activate */
private final LocalSession session;
private final ApplicationRepository applicationRepository;
- private final Optional<Provisioner> hostProvisioner;
+ private final Supplier<PrepareParams> params;
+ private final Optional<Provisioner> provisioner;
private final Tenant tenant;
- private final Duration timeout;
+ private final DeployLogger logger;
private final Clock clock;
- private final DeployLogger logger = new SilentDeployLogger();
-
- /** The repository part of docker image this application should run on. Version is separate from image repo */
- final Optional<DockerImage> dockerImageRepository;
-
- /** The Vespa version this application should run on */
- private final Version version;
-
- /** True if this deployment is done to bootstrap the config server */
- private final boolean isBootstrap;
- /** The (optional) Athenz domain this application should use */
- private final Optional<AthenzDomain> athenzDomain;
+ private boolean prepared;
+ private ConfigChangeActions configChangeActions;
- private boolean prepared = false;
-
- /** Whether this model should be validated (only takes effect if prepared=false) */
- private final boolean validate;
-
- /** Whether activation of this model should be forced */
- private final boolean force;
-
- private Deployment(LocalSession session, ApplicationRepository applicationRepository,
- Optional<Provisioner> hostProvisioner, Tenant tenant, Duration timeout,
- Clock clock, boolean prepared, boolean validate, boolean isBootstrap, boolean force) {
+ private Deployment(LocalSession session, ApplicationRepository applicationRepository, Supplier<PrepareParams> params,
+ Optional<Provisioner> provisioner, Tenant tenant, DeployLogger logger, Clock clock, boolean prepared) {
this.session = session;
this.applicationRepository = applicationRepository;
- this.hostProvisioner = hostProvisioner;
+ this.params = params;
+ this.provisioner = provisioner;
this.tenant = tenant;
- this.timeout = timeout;
+ this.logger = logger;
this.clock = clock;
this.prepared = prepared;
- this.validate = validate;
- this.dockerImageRepository = session.getDockerImageRepository();
- this.version = session.getVespaVersion();
- this.isBootstrap = isBootstrap;
- this.athenzDomain = session.getAthenzDomain();
- this.force = force;
}
public static Deployment unprepared(LocalSession session, ApplicationRepository applicationRepository,
- Optional<Provisioner> hostProvisioner, Tenant tenant,
- Duration timeout, Clock clock, boolean validate, boolean isBootstrap) {
- return new Deployment(session, applicationRepository, hostProvisioner, tenant, timeout, clock, false,
- validate, isBootstrap, false);
+ Optional<Provisioner> provisioner, Tenant tenant, PrepareParams params, DeployLogger logger, Clock clock) {
+ return new Deployment(session, applicationRepository, () -> params, provisioner, tenant, logger, clock, false);
+ }
+
+ public static Deployment unprepared(LocalSession session, ApplicationRepository applicationRepository,
+ Optional<Provisioner> provisioner, Tenant tenant, DeployLogger logger,
+ Duration timeout, Clock clock, boolean validate, boolean isBootstrap, boolean internalRestart) {
+ Supplier<PrepareParams> params = createPrepareParams(clock, timeout, session, isBootstrap, !validate, false, internalRestart);
+ return new Deployment(session, applicationRepository, params, provisioner, tenant, logger, clock, false);
}
public static Deployment prepared(LocalSession session, ApplicationRepository applicationRepository,
- Optional<Provisioner> hostProvisioner, Tenant tenant,
+ Optional<Provisioner> provisioner, Tenant tenant, DeployLogger logger,
Duration timeout, Clock clock, boolean isBootstrap, boolean force) {
- return new Deployment(session, applicationRepository, hostProvisioner, tenant,
- timeout, clock, true, true, isBootstrap, force);
+ Supplier<PrepareParams> params = createPrepareParams(clock, timeout, session, isBootstrap, false, force, false);
+ return new Deployment(session, applicationRepository, params, provisioner, tenant, logger, clock, true);
}
/** Prepares this. This does nothing if this is already prepared */
@Override
public void prepare() {
if (prepared) return;
- ApplicationId applicationId = session.getApplicationId();
- try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.prepareMillis")) {
- TimeoutBudget timeoutBudget = new TimeoutBudget(clock, timeout);
+ PrepareParams params = this.params.get();
+ if (params.internalRestart() && provisioner.isEmpty())
+ throw new IllegalArgumentException("Internal restart not supported without Provisioner");
- PrepareParams.Builder params = new PrepareParams.Builder().applicationId(applicationId)
- .timeoutBudget(timeoutBudget)
- .ignoreValidationErrors(!validate)
- .vespaVersion(version.toString())
- .isBootstrap(isBootstrap);
- dockerImageRepository.ifPresent(params::dockerImageRepository);
- athenzDomain.ifPresent(params::athenzDomain);
+ ApplicationId applicationId = params.getApplicationId();
+ try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.prepareMillis")) {
Optional<ApplicationSet> activeApplicationSet = applicationRepository.getCurrentActiveApplicationSet(tenant, applicationId);
- tenant.getSessionRepository().prepareLocalSession(session, logger, params.build(), activeApplicationSet,
- tenant.getPath(), clock.instant());
+ this.configChangeActions = tenant.getSessionRepository().prepareLocalSession(
+ session, logger, params, activeApplicationSet, tenant.getPath(), clock.instant());
this.prepared = true;
}
}
@@ -130,16 +110,17 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
prepare();
validateSessionStatus(session);
+ PrepareParams params = this.params.get();
ApplicationId applicationId = session.getApplicationId();
try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.activateMillis")) {
- TimeoutBudget timeoutBudget = new TimeoutBudget(clock, timeout);
+ TimeoutBudget timeoutBudget = params.getTimeoutBudget();
if ( ! timeoutBudget.hasTimeLeft()) throw new RuntimeException("Timeout exceeded when trying to activate '" + applicationId + "'");
RemoteSession previousActiveSession;
CompletionWaiter waiter;
try (Lock lock = tenant.getApplicationRepo().lock(applicationId)) {
previousActiveSession = applicationRepository.getActiveSession(applicationId);
- waiter = applicationRepository.activate(session, previousActiveSession, applicationId, force);
+ waiter = applicationRepository.activate(session, previousActiveSession, applicationId, params.force());
}
catch (RuntimeException e) {
throw e;
@@ -150,10 +131,24 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
waiter.awaitCompletion(timeoutBudget.timeLeft());
log.log(Level.INFO, session.logPre() + "Session " + session.getSessionId() + " activated successfully using " +
- hostProvisioner.map(provisioner -> provisioner.getClass().getSimpleName()).orElse("no host provisioner") +
+ provisioner.map(provisioner -> provisioner.getClass().getSimpleName()).orElse("no host provisioner") +
". Config generation " + session.getMetaData().getGeneration() +
(previousActiveSession != null ? ". Based on session " + previousActiveSession.getSessionId() : "") +
". File references: " + applicationRepository.getFileReferences(applicationId));
+
+ if (params.internalRestart() && !configChangeActions.getRestartActions().isEmpty()) {
+ Set<String> hostnames = configChangeActions.getRestartActions().getEntries().stream()
+ .flatMap(entry -> entry.getServices().stream())
+ .map(ServiceInfo::getHostName)
+ .collect(Collectors.toUnmodifiableSet());
+
+ provisioner.get().restart(applicationId, HostFilter.from(hostnames, Set.of(), Set.of(), Set.of()));
+ log.log(Level.INFO, String.format("Scheduled service restart of %d nodes: %s",
+ hostnames.size(), hostnames.stream().sorted().collect(Collectors.joining(", "))));
+
+ this.configChangeActions = new ConfigChangeActions(new RestartActions(), configChangeActions.getRefeedActions());
+ }
+
return session.getMetaData().getGeneration();
}
}
@@ -165,12 +160,21 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
*/
@Override
public void restart(HostFilter filter) {
- hostProvisioner.get().restart(session.getApplicationId(), filter);
+ provisioner.get().restart(session.getApplicationId(), filter);
}
/** Exposes the session of this for testing only */
public LocalSession session() { return session; }
+ /**
+ * @return config change actions that need to be performed as result of prepare
+ * @throws IllegalArgumentException if called without being prepared by this
+ */
+ public ConfigChangeActions configChangeActions() {
+ if (configChangeActions != null) return configChangeActions;
+ throw new IllegalArgumentException("No config change actions: " + (prepared ? "was already prepared" : "not yet prepared"));
+ }
+
private void validateSessionStatus(LocalSession localSession) {
long sessionId = localSession.getSessionId();
if (Session.Status.NEW.equals(localSession.getStatus())) {
@@ -180,4 +184,36 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
}
}
+ /**
+ * @param clock system clock
+ * @param timeout total timeout duration of prepare + activate
+ * @param session the local session for this deployment
+ * @param isBootstrap true if this deployment is done to bootstrap the config server
+ * @param ignoreValidationErrors whether this model should be validated
+ * @param force whether activation of this model should be forced
+ */
+ private static Supplier<PrepareParams> createPrepareParams(
+ Clock clock, Duration timeout, LocalSession session,
+ boolean isBootstrap, boolean ignoreValidationErrors, boolean force, boolean internalRestart) {
+
+ // Supplier because shouldn't/cant create this before validateSessionStatus() for prepared deployments
+ // memoized because we want to create this once for unprepared deployments
+ return Suppliers.memoize(() -> {
+ TimeoutBudget timeoutBudget = new TimeoutBudget(clock, timeout);
+
+ PrepareParams.Builder params = new PrepareParams.Builder()
+ .applicationId(session.getApplicationId())
+ .vespaVersion(session.getVespaVersion().toString())
+ .timeoutBudget(timeoutBudget)
+ .ignoreValidationErrors(ignoreValidationErrors)
+ .isBootstrap(isBootstrap)
+ .force(force)
+ .internalRestart(internalRestart);
+ session.getDockerImageRepository().ifPresent(params::dockerImageRepository);
+ session.getAthenzDomain().ifPresent(params::athenzDomain);
+
+ return params.build();
+ });
+ }
+
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
index d6badb8a9a2..9ea96b97af3 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
@@ -13,11 +13,9 @@ import com.yahoo.vespa.config.server.application.CompressedApplicationInputStrea
import com.yahoo.vespa.config.server.http.SessionHandler;
import com.yahoo.vespa.config.server.http.Utils;
import com.yahoo.vespa.config.server.session.PrepareParams;
-import com.yahoo.vespa.config.server.tenant.Tenant;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
import java.time.Duration;
-import java.time.Instant;
import static com.yahoo.vespa.config.server.application.CompressedApplicationInputStream.createFromCompressedStream;
import static com.yahoo.vespa.config.server.http.Utils.checkThatTenantExists;
@@ -56,7 +54,7 @@ public class ApplicationApiHandler extends SessionHandler {
TenantName tenantName = validateTenant(request);
PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout);
CompressedApplicationInputStream compressedStream = createFromCompressedStream(request.getData(), request.getHeader(contentTypeHeader));
- PrepareResult result = applicationRepository.deploy(compressedStream, prepareParams, Instant.now());
+ PrepareResult result = applicationRepository.deploy(compressedStream, prepareParams);
return new SessionPrepareAndActivateResponse(result, request, prepareParams.getApplicationId(), zone);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java
index 4cb07e37f28..258af35be6f 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java
@@ -14,7 +14,6 @@ import com.yahoo.vespa.config.server.http.SessionHandler;
import com.yahoo.vespa.config.server.http.Utils;
import java.time.Duration;
-import java.time.Instant;
/**
* A handler that prepares a session given by an id in the request. v2 of application API
@@ -41,7 +40,7 @@ public class SessionPrepareHandler extends SessionHandler {
TenantName tenantName = tenant.getName();
long sessionId = getSessionIdV2(request);
PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout);
- PrepareResult result = applicationRepository.prepare(tenant, sessionId, prepareParams, Instant.now());
+ PrepareResult result = applicationRepository.prepare(tenant, sessionId, prepareParams);
return new SessionPrepareResponse(result, tenantName, request);
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
index 0a49a19d728..e90ef38a92f 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
@@ -559,7 +559,7 @@ public class ApplicationRepositoryTest {
long firstSession = result.sessionId();
long sessionId = applicationRepository.createSession(applicationId(), timeoutBudget, testAppJdiscOnly);
- applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams(), clock.instant());
+ applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams());
exceptionRule.expect(RuntimeException.class);
exceptionRule.expectMessage(containsString("Timeout exceeded when trying to activate 'test1.testapp'"));
applicationRepository.activate(applicationRepository.getTenant(applicationId()), sessionId, new TimeoutBudget(clock, Duration.ofSeconds(0)), false);
@@ -584,7 +584,7 @@ public class ApplicationRepositoryTest {
PrepareResult result2 = deployApp(testAppJdiscOnly);
result2.sessionId();
- applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId2, prepareParams(), clock.instant());
+ applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId2, prepareParams());
exceptionRule.expect(ActivationConflictException.class);
exceptionRule.expectMessage(containsString("tenant:test1 app:testapp:default Cannot activate session 3 because the currently active session (4) has changed since session 3 was created (was 2 at creation time)"));
applicationRepository.activate(applicationRepository.getTenant(applicationId()), sessionId2, timeoutBudget, false);
@@ -597,7 +597,7 @@ public class ApplicationRepositoryTest {
exceptionRule.expect(IllegalStateException.class);
exceptionRule.expectMessage(containsString("Session is active: 2"));
- applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams(), clock.instant());
+ applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams());
exceptionRule.expect(IllegalStateException.class);
exceptionRule.expectMessage(containsString("tenant:test1 app:testapp:default Session 2 is already active"));
@@ -705,7 +705,7 @@ public class ApplicationRepositoryTest {
}
private PrepareResult prepareAndActivate(File application) {
- return applicationRepository.deploy(application, prepareParams(), Instant.now());
+ return applicationRepository.deploy(application, prepareParams());
}
private PrepareResult deployApp(File applicationPackage) {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
index 3b6e6c00d8b..7553583e70c 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
@@ -160,7 +160,7 @@ public class DeployTester {
paramsBuilder.applicationId(applicationId)
.timeoutBudget(new TimeoutBudget(clock, Duration.ofSeconds(60)));
- return applicationRepository.deploy(new File(applicationPath), paramsBuilder.build(), now);
+ return applicationRepository.deploy(new File(applicationPath), paramsBuilder.build());
}
public AllocatedHosts getAllocatedHostsOf(ApplicationId applicationId) {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
index 4ac1d633e75..511717acfc0 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
@@ -141,8 +141,7 @@ public class SessionActiveHandlerTest {
testApp);
applicationRepository.prepare(tenant,
sessionId,
- new PrepareParams.Builder().applicationId(applicationId()).build(),
- componentRegistry.getClock().instant());
+ new PrepareParams.Builder().applicationId(applicationId()).build());
actResponse = handler.handle(createTestRequest(pathPrefix, HttpRequest.Method.PUT, Cmd.ACTIVE, sessionId, subPath));
LocalSession session = applicationRepository.getActiveLocalSession(tenant, applicationId());
metaData = session.getMetaData();
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
index 0bc23b4d442..712242a69e6 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
@@ -36,10 +36,8 @@ class MaintainerTester {
private final Curator curator;
private final TenantRepository tenantRepository;
private final ApplicationRepository applicationRepository;
- private final Clock clock;
MaintainerTester(Clock clock, TemporaryFolder temporaryFolder) throws IOException {
- this.clock = clock;
this.curator = new MockCurator();
InMemoryProvisioner hostProvisioner = new InMemoryProvisioner(true, "host0", "host1", "host2", "host3", "host4");
ProvisionerAdapter provisioner = new ProvisionerAdapter(hostProvisioner);
@@ -68,7 +66,7 @@ class MaintainerTester {
}
void deployApp(File applicationPath, PrepareParams.Builder prepareParams) {
- applicationRepository.deploy(applicationPath, prepareParams.ignoreValidationErrors(true).build(), clock.instant());
+ applicationRepository.deploy(applicationPath, prepareParams.ignoreValidationErrors(true).build());
}
Curator curator() { return curator; }