diff options
author | Jon Bratseth <bratseth@oath.com> | 2020-12-12 18:51:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-12 18:51:58 +0100 |
commit | 1a5f1b49f221a50379006f39b5386d0723f1410b (patch) | |
tree | e8999c5477b457c7044fd7c579c12d9f091a7607 | |
parent | c5bb55c8f86e5157b5297a43ffb0596f17ffa24c (diff) | |
parent | 8e745bf4703982bcdae23ff86bfd978dc80bc3aa (diff) |
Merge pull request #15796 from vespa-engine/mpolden/set-previous-model
Set previous model in ActivatedModelsBuilder
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 { |