diff options
8 files changed, 36 insertions, 17 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java index f19341098f4..647745eba5d 100644 --- a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java +++ b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java @@ -27,6 +27,7 @@ import com.yahoo.config.model.application.provider.MockFileRegistry; import com.yahoo.config.model.provision.HostsXmlProvisioner; import com.yahoo.config.model.provision.SingleNodeProvisioner; import com.yahoo.config.model.test.MockApplicationPackage; +import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Zone; import com.yahoo.io.IOUtils; @@ -92,6 +93,7 @@ public class DeployState implements ConfigDefinitionStore { private final Reindexing reindexing; private final ExecutorService executor; private final OnnxModelCost onnxModelCost; + private final Set<ClusterSpec.Id> restartingClusters; public static DeployState createTestState() { return new Builder().build(); @@ -127,7 +129,8 @@ public class DeployState implements ConfigDefinitionStore { Optional<DockerImage> wantedDockerImageRepo, Reindexing reindexing, Optional<ValidationOverrides> validationOverrides, - OnnxModelCost onnxModelCost) { + OnnxModelCost onnxModelCost, + Set<ClusterSpec.Id> restartingClusters) { this.logger = deployLogger; this.fileRegistry = fileRegistry; this.executor = executor; @@ -156,6 +159,7 @@ public class DeployState implements ConfigDefinitionStore { this.wantedDockerImageRepo = wantedDockerImageRepo; this.reindexing = reindexing; this.onnxModelCost = onnxModelCost; + this.restartingClusters = Set.copyOf(restartingClusters); } public static HostProvisioner getDefaultModelHostProvisioner(ApplicationPackage applicationPackage) { @@ -311,6 +315,8 @@ public class DeployState implements ConfigDefinitionStore { public OnnxModelCost onnxModelCost() { return onnxModelCost; } + public Set<ClusterSpec.Id> restartingClusters() { return restartingClusters; } + public boolean isHostedTenantApplication(ApplicationType type) { boolean isTesterApplication = getProperties().applicationId().instance().isTester(); return isHosted() && type == ApplicationType.DEFAULT && !isTesterApplication; @@ -340,6 +346,7 @@ public class DeployState implements ConfigDefinitionStore { private Reindexing reindexing = null; private Optional<ValidationOverrides> validationOverrides = Optional.empty(); private OnnxModelCost onnxModelCost = OnnxModelCost.disabled(); + private Set<ClusterSpec.Id> restartingClusters = Set.of(); public Builder() {} @@ -459,6 +466,11 @@ public class DeployState implements ConfigDefinitionStore { public Builder onnxModelCost(OnnxModelCost instance) { this.onnxModelCost = instance; return this; } + public Builder restartingClusters(Set<ClusterSpec.Id> restartingClusters) { + this.restartingClusters = Set.copyOf(restartingClusters); + return this; + } + public DeployState build() { return build(new ValidationParameters()); } @@ -492,7 +504,8 @@ public class DeployState implements ConfigDefinitionStore { wantedDockerImageRepo, reindexing, validationOverrides, - onnxModelCost); + onnxModelCost, + restartingClusters); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java index 65572d07cc2..1b9d4004b5d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java @@ -198,7 +198,8 @@ public class VespaModelFactory implements ModelFactory { .now(clock.instant()) .wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion()) .wantedDockerImageRepo(modelContext.wantedDockerImageRepo()) - .onnxModelCost(modelContext.onnxModelCost()); + .onnxModelCost(modelContext.onnxModelCost()) + .restartingClusters(modelContext.restartingClusters()); modelContext.previousModel().ifPresent(builder::previousModel); modelContext.reindexing().ifPresent(builder::reindexing); return builder.build(validationParameters); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index ed7646b3066..f36836092b8 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -50,6 +50,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.logging.Level; import java.util.stream.Collectors; import static com.yahoo.vespa.model.container.docproc.DocprocChains.DOCUMENT_TYPE_MANAGER_CLASS; @@ -151,8 +152,10 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat registerApplicationBundles(deployState); registerUserConfiguredFiles(deployState); createEndpoints(deployState); - if (onnxModelCostCalculator.restartOnDeploy()) + if (onnxModelCostCalculator.restartOnDeploy() || deployState.restartingClusters().contains(id())) { + deployState.getDeployLogger().log(Level.INFO, "Deferring config change until restart for cluster '" + id() + "'"); setDeferChangesUntilRestart(true); + } } private void registerApplicationBundles(DeployState deployState) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index aeb6c030a49..799e0bd62e8 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -166,7 +166,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> private String hostClusterId = null; private String jvmGCOptions = null; - private volatile boolean deferChangesUntilRestart = false; + private boolean deferChangesUntilRestart = false; private boolean clientsLegacyMode; private List<Client> clients = List.of(); 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 22b2b581b44..c5449475136 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 @@ -22,6 +22,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.CloudAccount; import com.yahoo.config.provision.ClusterSpec; +import com.yahoo.config.provision.ClusterSpec.Id; import com.yahoo.config.provision.DataplaneToken; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; @@ -39,6 +40,7 @@ import java.io.File; import java.net.URI; import java.security.cert.X509Certificate; import java.time.Duration; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.Set; @@ -67,6 +69,7 @@ public class ModelContextImpl implements ModelContext { private final ModelContext.Properties properties; private final Optional<File> appDir; private final OnnxModelCost onnxModelCost; + private final Set<ClusterSpec.Id> restartingClusters; private final Optional<DockerImage> wantedDockerImageRepository; @@ -94,6 +97,7 @@ public class ModelContextImpl implements ModelContext { ModelContext.Properties properties, Optional<File> appDir, OnnxModelCost onnxModelCost, + Collection<Id> restartingClusters, Optional<DockerImage> wantedDockerImageRepository, Version modelVespaVersion, Version wantedNodeVespaVersion) { @@ -112,6 +116,7 @@ public class ModelContextImpl implements ModelContext { this.modelVespaVersion = modelVespaVersion; this.wantedNodeVespaVersion = wantedNodeVespaVersion; this.onnxModelCost = onnxModelCost; + this.restartingClusters = Set.copyOf(restartingClusters); } @Override @@ -148,6 +153,9 @@ public class ModelContextImpl implements ModelContext { public Optional<? extends Reindexing> reindexing() { return reindexing; } @Override + public Set<ClusterSpec.Id> restartingClusters() { return restartingClusters; } + + @Override public ModelContext.Properties properties() { return properties; } @Override 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 64ccd910120..02e49e3990c 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 @@ -118,12 +118,13 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { modelContextProperties, Optional.empty(), onnxModelCost, + zkClient.readActivationTriggers().restartingClusters(), wantedDockerImageRepository, modelFactory.version(), wantedNodeVespaVersion); MetricUpdater applicationMetricUpdater = metrics.getOrCreateMetricUpdater(Metrics.createDimensions(applicationId)); ServerCache serverCache = new ServerCache(configDefinitionRepo, zkClient.getUserConfigDefinitions()); - return new Application(withDeferredConfigForRestartingClusters(modelFactory.createModel(modelContext)), + return new Application(modelFactory.createModel(modelContext), serverCache, applicationGeneration, modelFactory.version(), @@ -170,15 +171,4 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { zkClient.readDataplaneTokens()); } - private Model withDeferredConfigForRestartingClusters(Model model) { - if ( ! (model instanceof VespaModel vespaModel)) return model; - for (ClusterSpec.Id cluster : zkClient.readActivationTriggers().restartingClusters()) { - ApplicationContainerCluster containerCluster = vespaModel.getContainerClusters().get(cluster.value()); - if (containerCluster != null) containerCluster.setDeferChangesUntilRestart(true); - ContentCluster contentCluster = vespaModel.getContentClusters().get(cluster.value()); - if (contentCluster != null) contentCluster.setDeferChangesUntilRestart(true); - } - return model; - } - } 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 fd8728ac655..894cedd0a34 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 @@ -128,6 +128,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P createModelContextProperties(modelFactory.version(), applicationPackage), getAppDir(applicationPackage), onnxModelCost, + Set.of(), // Known after preparation and validation, passed from activated models builder only. wantedDockerImageRepository, modelVersion, wantedNodeVespaVersion); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java index 3289cc71357..27d82e90197 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java @@ -16,6 +16,7 @@ import com.yahoo.config.model.application.provider.MockFileRegistry; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.test.MockApplicationPackage; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ClusterSpec.Id; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.SecretStoreProvider; import com.yahoo.vespa.config.server.deploy.ModelContextImpl; @@ -80,6 +81,7 @@ public class ModelContextImplTest { List.of()), Optional.empty(), OnnxModelCost.disabled(), + List.of(Id.from("foobar")), Optional.empty(), new Version(7), new Version(8)); @@ -88,6 +90,7 @@ public class ModelContextImplTest { assertFalse(context.previousModel().isPresent()); assertTrue(context.getFileRegistry() instanceof MockFileRegistry); assertTrue(context.configDefinitionRepo() instanceof StaticConfigDefinitionRepo); + assertEquals(Set.of(Id.from("foobar")), context.restartingClusters()); assertEquals(ApplicationId.defaultId(), context.properties().applicationId()); assertTrue(context.properties().configServerSpecs().isEmpty()); assertTrue(context.properties().multitenant()); |