diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-05-02 13:39:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-02 13:39:42 +0200 |
commit | 5807a4cd298a2a09793f66096acdc9c7c62deebf (patch) | |
tree | 42f1b345c0cc8572ab6bdc9f4d38f7e7dc4c1bfc | |
parent | 8fbeda84a2808e0960d3cb55a6c6daeadfd76c2a (diff) | |
parent | 7e1972e4d8cfd85944cdea941844ec0efe1a04af (diff) |
Merge pull request #5765 from vespa-engine/bratseth/skip-old-config-models-reboustness
Don't require an existing model when preparing
4 files changed, 43 insertions, 61 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java index c2b4d2f9e62..a73fc95eb05 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java @@ -33,7 +33,6 @@ import java.util.Set; * and other queries against the model. * * @author Harald Musum - * @since 2010-12-08 */ public class Application implements ModelResult { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java index 7d46152dd4d..b4346498f0c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationSet.java @@ -1,6 +1,7 @@ // 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.application; import com.yahoo.config.model.api.HostInfo; +import com.yahoo.config.model.api.Model; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Version; @@ -33,27 +34,39 @@ public final class ApplicationSet { latestVersion = applications.keySet().stream().max((a, b) -> a.compareTo(b)).get(); } + /** + * Returns the specified version, or the latest if not specified, or if the given version is not + * available and the latest is a permissible substitution. + * + * @throws VersionDoesNotExistException if the specified version is not available and the latest version is not + * a permissible substitution + */ public Application getForVersionOrLatest(Optional<Version> optionalVersion, Instant now) { - return resolveForVersion(optionalVersion.orElse(latestVersion), now); + Version version = optionalVersion.orElse(latestVersion); + return resolveForVersion(version, now) + .orElseThrow(() -> new VersionDoesNotExistException(applicationId + " has no model for Vespa version " + version)); } - private Application resolveForVersion(Version vespaVersion, Instant now) { + private Optional<Application> resolveForVersion(Version vespaVersion, Instant now) { Application application = applications.get(vespaVersion); if (application != null) - return application; + return Optional.of(application); // Does the latest version specify we can use it regardless? Application latest = applications.get(latestVersion); if (latest.getModel().allowModelVersionMismatch(now)) - return latest; + return Optional.of(latest); - throw new VersionDoesNotExistException(String.format("No application with vespa version %s exists", vespaVersion.toString())); + return Optional.empty(); } - public ApplicationId getId() { - return applicationId; + /** Returns the application for the given version, if available */ + public Optional<Application> get(Version version) { + return Optional.ofNullable(applications.get(version)); } + public ApplicationId getId() { return applicationId; } + public static ApplicationSet fromList(List<Application> applications) { return new ApplicationSet(applications); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java index 2f05c1a2259..1aaddfce6fc 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java @@ -74,19 +74,13 @@ public class ModelContextImpl implements ModelContext { } @Override - public ApplicationPackage applicationPackage() { - return applicationPackage; - } + public ApplicationPackage applicationPackage() { return applicationPackage; } @Override - public Optional<Model> previousModel() { - return previousModel; - } + public Optional<Model> previousModel() { return previousModel; } @Override - public Optional<ApplicationPackage> permanentApplicationPackage() { - return permanentApplicationPackage; - } + public Optional<ApplicationPackage> permanentApplicationPackage() { return permanentApplicationPackage; } /** * Returns the host provisioner to use, or empty to use the default provisioner, @@ -94,34 +88,22 @@ public class ModelContextImpl implements ModelContext { */ // TODO: Don't allow empty here but create the right provisioner when this is set up instead @Override - public Optional<HostProvisioner> hostProvisioner() { - return hostProvisioner; - } + public Optional<HostProvisioner> hostProvisioner() { return hostProvisioner; } @Override - public DeployLogger deployLogger() { - return deployLogger; - } + public DeployLogger deployLogger() { return deployLogger; } @Override - public ConfigDefinitionRepo configDefinitionRepo() { - return configDefinitionRepo; - } + public ConfigDefinitionRepo configDefinitionRepo() { return configDefinitionRepo; } @Override - public FileRegistry getFileRegistry() { - return fileRegistry; - } + public FileRegistry getFileRegistry() { return fileRegistry; } @Override - public ModelContext.Properties properties() { - return properties; - } + public ModelContext.Properties properties() { return properties; } @Override - public Optional<File> appDir() { - return appDir; - } + public Optional<File> appDir() { return appDir; } @Override public Version modelVespaVersion() { return modelVespaVersion; } @@ -129,9 +111,6 @@ public class ModelContextImpl implements ModelContext { @Override public Version wantedNodeVespaVersion() { return wantedNodeVespaVersion; } - /** - * @author Ulf Lilleengen - */ public static class Properties implements ModelContext.Properties { private final ApplicationId applicationId; @@ -159,34 +138,22 @@ public class ModelContextImpl implements ModelContext { } @Override - public boolean multitenant() { - return multitenant; - } + public boolean multitenant() { return multitenant; } @Override - public ApplicationId applicationId() { - return applicationId; - } + public ApplicationId applicationId() { return applicationId; } @Override - public List<ConfigServerSpec> configServerSpecs() { - return configServerSpecs; - } + public List<ConfigServerSpec> configServerSpecs() { return configServerSpecs; } @Override - public HostName loadBalancerName() { - return loadBalancerName; - } + public HostName loadBalancerName() { return loadBalancerName; } @Override - public boolean hostedVespa() { - return hostedVespa; - } + public boolean hostedVespa() { return hostedVespa; } @Override - public Zone zone() { - return zone; - } + public Zone zone() { return zone; } @Override public Set<Rotation> rotations() { return rotations; } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java index d7b84d75b5c..0d9346101e9 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/PreparedModelsBuilder.java @@ -15,6 +15,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.Version; import com.yahoo.log.LogLevel; +import com.yahoo.vespa.config.server.application.Application; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.host.HostValidator; import com.yahoo.vespa.config.server.application.PermanentApplicationPackage; @@ -89,17 +90,14 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P FileDistributionProvider fileDistributionProvider = fileDistributionFactory.createProvider(context.getServerDBSessionDir()); // Use empty on non-hosted systems, use already allocated hosts if available, create connection to a host provisioner otherwise - Optional<HostProvisioner> hostProvisioner = createHostProvisioner(allocatedHosts); - Optional<Model> previousModel = currentActiveApplicationSet - .map(set -> set.getForVersionOrLatest(Optional.of(modelVersion), now).getModel()); ModelContext modelContext = new ModelContextImpl( applicationPackage, - previousModel, + modelOf(modelVersion), permanentApplicationPackage.applicationPackage(), logger, configDefinitionRepo, fileDistributionProvider.getFileRegistry(), - hostProvisioner, + createHostProvisioner(allocatedHosts), properties, getAppDir(applicationPackage), new com.yahoo.component.Version(modelVersion.toString()), @@ -112,6 +110,11 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P return new PreparedModelsBuilder.PreparedModelResult(modelVersion, result.getModel(), fileDistributionProvider, result.getConfigChangeActions()); } + private Optional<Model> modelOf(Version version) { + if ( ! currentActiveApplicationSet.isPresent()) return Optional.empty(); + return currentActiveApplicationSet.get().get(version).map(Application::getModel); + } + // This method is an excellent demonstration of what happens when one is too liberal with Optional // -bratseth, who had to write the below :-\ private Optional<HostProvisioner> createHostProvisioner(Optional<AllocatedHosts> allocatedHosts) { |