summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2020-12-12 18:51:58 +0100
committerGitHub <noreply@github.com>2020-12-12 18:51:58 +0100
commit1a5f1b49f221a50379006f39b5386d0723f1410b (patch)
treee8999c5477b457c7044fd7c579c12d9f091a7607
parentc5bb55c8f86e5157b5297a43ffb0596f17ffa24c (diff)
parent8e745bf4703982bcdae23ff86bfd978dc80bc3aa (diff)
Merge pull request #15796 from vespa-engine/mpolden/set-previous-model
Set previous model in ActivatedModelsBuilder
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java15
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java22
2 files changed, 27 insertions, 10 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
index 9e104461b33..0a81c408ef4 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java
@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet;
import com.yahoo.component.Version;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.model.api.ConfigDefinitionRepo;
+import com.yahoo.config.model.api.Model;
import com.yahoo.config.model.api.ModelContext;
import com.yahoo.config.model.api.ModelFactory;
import com.yahoo.config.model.api.Provisioned;
@@ -18,6 +19,7 @@ import com.yahoo.vespa.config.server.GlobalComponentRegistry;
import com.yahoo.vespa.config.server.ServerCache;
import com.yahoo.vespa.config.server.application.Application;
import com.yahoo.vespa.config.server.application.ApplicationCuratorDatabase;
+import com.yahoo.vespa.config.server.application.ApplicationSet;
import com.yahoo.vespa.config.server.application.PermanentApplicationPackage;
import com.yahoo.vespa.config.server.deploy.ModelContextImpl;
import com.yahoo.vespa.config.server.monitoring.MetricUpdater;
@@ -33,6 +35,7 @@ import com.yahoo.vespa.config.server.tenant.TenantRepository;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.flags.FlagSource;
+import java.util.Comparator;
import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
@@ -50,6 +53,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
private final TenantName tenant;
private final long applicationGeneration;
private final SessionZooKeeperClient zkClient;
+ private final Optional<ApplicationSet> currentActiveApplicationSet;
private final PermanentApplicationPackage permanentApplicationPackage;
private final ConfigDefinitionRepo configDefinitionRepo;
private final Metrics metrics;
@@ -60,6 +64,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
public ActivatedModelsBuilder(TenantName tenant,
long applicationGeneration,
SessionZooKeeperClient zkClient,
+ Optional<ApplicationSet> currentActiveApplicationSet,
GlobalComponentRegistry globalComponentRegistry) {
super(globalComponentRegistry.getModelFactoryRegistry(),
globalComponentRegistry.getConfigserverConfig(),
@@ -68,6 +73,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
this.tenant = tenant;
this.applicationGeneration = applicationGeneration;
this.zkClient = zkClient;
+ this.currentActiveApplicationSet = currentActiveApplicationSet;
this.permanentApplicationPackage = globalComponentRegistry.getPermanentApplicationPackage();
this.configDefinitionRepo = globalComponentRegistry.getStaticConfigDefinitionRepo();
this.metrics = globalComponentRegistry.getMetrics();
@@ -90,7 +96,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
Provisioned provisioned = new Provisioned();
ModelContext modelContext = new ModelContextImpl(
applicationPackage,
- Optional.empty(),
+ modelOf(modelFactory.version()),
permanentApplicationPackage.applicationPackage(),
new SilentDeployLogger(),
configDefinitionRepo,
@@ -115,13 +121,18 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> {
applicationId);
}
+ private Optional<Model> modelOf(Version version) {
+ if (currentActiveApplicationSet.isEmpty()) return Optional.empty();
+ return currentActiveApplicationSet.get().get(version).map(Application::getModel);
+ }
+
private static <T> Optional<T> getForVersionOrLatest(Map<Version, T> map, Version version) {
if (map.isEmpty()) {
return Optional.empty();
}
T value = map.get(version);
if (value == null) {
- value = map.get(map.keySet().stream().max((a, b) -> a.compareTo(b)).get());
+ value = map.get(map.keySet().stream().max(Comparator.naturalOrder()).get());
}
return Optional.of(value);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java
index dfe4055d844..fc0a887cf0e 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java
@@ -370,8 +370,10 @@ public class SessionRepository {
if (session.applicationSet().isPresent()) {
return session.applicationSet().get();
}
-
- ApplicationSet applicationSet = loadApplication(session);
+ Optional<Long> activeSessionId = getActiveSessionId(session.getApplicationId());
+ Optional<ApplicationSet> previousApplicationSet = activeSessionId.filter(session::isNewerThan)
+ .flatMap(this::getApplicationSet);
+ ApplicationSet applicationSet = loadApplication(session, previousApplicationSet);
RemoteSession activated = session.activated(applicationSet);
long sessionId = activated.getSessionId();
remoteSessionCache.put(sessionId, activated);
@@ -412,13 +414,14 @@ public class SessionRepository {
}
}
- private ApplicationSet loadApplication(Session session) {
+ private ApplicationSet loadApplication(Session session, Optional<ApplicationSet> previousApplicationSet) {
log.log(Level.FINE, () -> "Loading application for " + session);
SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(session.getSessionId());
ApplicationPackage applicationPackage = sessionZooKeeperClient.loadApplicationPackage();
ActivatedModelsBuilder builder = new ActivatedModelsBuilder(session.getTenantName(),
session.getSessionId(),
sessionZooKeeperClient,
+ previousApplicationSet,
componentRegistry);
// Read hosts allocated on the config server instance which created this
SettableOptional<AllocatedHosts> allocatedHosts = new SettableOptional<>(applicationPackage.getAllocatedHosts());
@@ -559,15 +562,18 @@ public class SessionRepository {
}
public Optional<ApplicationSet> getActiveApplicationSet(ApplicationId appId) {
- Optional<ApplicationSet> currentActiveApplicationSet = Optional.empty();
+ return applicationRepo.activeSessionOf(appId).flatMap(this::getApplicationSet);
+ }
+
+ private Optional<ApplicationSet> getApplicationSet(long sessionId) {
+ Optional<ApplicationSet> applicationSet = Optional.empty();
try {
- long currentActiveSessionId = applicationRepo.requireActiveSessionOf(appId);
- RemoteSession currentActiveSession = getRemoteSession(currentActiveSessionId);
- currentActiveApplicationSet = Optional.ofNullable(ensureApplicationLoaded(currentActiveSession));
+ RemoteSession session = getRemoteSession(sessionId);
+ applicationSet = Optional.ofNullable(ensureApplicationLoaded(session));
} catch (IllegalArgumentException e) {
// Do nothing if we have no currently active session
}
- return currentActiveApplicationSet;
+ return applicationSet;
}
private void copyApp(File sourceDir, File destinationDir) throws IOException {