diff options
author | Harald Musum <musum@verizonmedia.com> | 2021-09-09 16:36:17 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-09 16:44:44 +0200 |
commit | 7e3e48d33f7aa5be56994d8db429b64da810074b (patch) | |
tree | 369fb9683c99026a8ed8c0e7d4008299dd703198 /configserver | |
parent | 058ccda824fc228c5b004a603deacf808c20779f (diff) | |
parent | b07ee7625027c5756985a482848b8d3fcf55b9bc (diff) |
Merge pull request #19051 from vespa-engine/balder/wire-in-executor-for-model-building
Wire in the executor up to TenantRepository
Diffstat (limited to 'configserver')
9 files changed, 48 insertions, 16 deletions
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 414782a43f4..ea0cba511cd 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 @@ -6,7 +6,6 @@ import com.yahoo.component.Version; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; -import com.yahoo.config.model.api.ApplicationRoles; import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.api.ContainerEndpoint; @@ -23,7 +22,6 @@ import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostName; -import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.secretstore.SecretStore; @@ -41,6 +39,7 @@ import java.security.cert.X509Certificate; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ExecutorService; import java.util.function.ToIntFunction; import static com.yahoo.vespa.config.server.ConfigServerSpec.fromConfig; @@ -59,6 +58,7 @@ public class ModelContextImpl implements ModelContext { private final DeployLogger deployLogger; private final ConfigDefinitionRepo configDefinitionRepo; private final FileRegistry fileRegistry; + private final ExecutorService executor; private final HostProvisioner hostProvisioner; private final Provisioned provisioned; private final Optional<? extends Reindexing> reindexing; @@ -85,6 +85,7 @@ public class ModelContextImpl implements ModelContext { DeployLogger deployLogger, ConfigDefinitionRepo configDefinitionRepo, FileRegistry fileRegistry, + ExecutorService executor, Optional<? extends Reindexing> reindexing, HostProvisioner hostProvisioner, Provisioned provisioned, @@ -99,6 +100,7 @@ public class ModelContextImpl implements ModelContext { this.deployLogger = deployLogger; this.configDefinitionRepo = configDefinitionRepo; this.fileRegistry = fileRegistry; + this.executor = executor; this.reindexing = reindexing; this.hostProvisioner = hostProvisioner; this.provisioned = provisioned; @@ -138,6 +140,11 @@ public class ModelContextImpl implements ModelContext { public FileRegistry getFileRegistry() { return fileRegistry; } @Override + public ExecutorService getExecutor() { + return executor; + } + + @Override public Optional<? extends Reindexing> reindexing() { return reindexing; } @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 ffb4550caf0..b9728a4dd43 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,7 +5,6 @@ import com.google.common.collect.ImmutableSet; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.component.Version; import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.config.model.api.Model; import com.yahoo.config.model.api.ModelContext; @@ -29,20 +28,17 @@ import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; import com.yahoo.vespa.config.server.session.SessionZooKeeperClient; import com.yahoo.vespa.config.server.session.SilentDeployLogger; -import com.yahoo.vespa.config.server.tenant.ApplicationRolesStore; import com.yahoo.vespa.config.server.tenant.ContainerEndpointsCache; import com.yahoo.vespa.config.server.tenant.EndpointCertificateMetadataStore; import com.yahoo.vespa.config.server.tenant.EndpointCertificateRetriever; -import com.yahoo.vespa.config.server.tenant.TenantListener; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.flags.FlagSource; -import java.security.cert.X509Certificate; import java.util.Comparator; -import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ExecutorService; import java.util.logging.Level; import java.util.logging.Logger; @@ -65,11 +61,13 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { private final Curator curator; private final FlagSource flagSource; private final SecretStore secretStore; + private final ExecutorService executor; public ActivatedModelsBuilder(TenantName tenant, long applicationGeneration, SessionZooKeeperClient zkClient, Optional<ApplicationSet> currentActiveApplicationSet, + ExecutorService executor, Curator curator, Metrics metrics, PermanentApplicationPackage permanentApplicationPackage, @@ -80,11 +78,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { Zone zone, ModelFactoryRegistry modelFactoryRegistry, ConfigDefinitionRepo configDefinitionRepo) { - super(modelFactoryRegistry, - configserverConfig, - zone, - hostProvisionerProvider, - new SilentDeployLogger()); + super(modelFactoryRegistry, configserverConfig, zone, hostProvisionerProvider, new SilentDeployLogger()); this.tenant = tenant; this.applicationGeneration = applicationGeneration; this.zkClient = zkClient; @@ -95,6 +89,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { this.curator = curator; this.flagSource = flagSource; this.secretStore = secretStore; + this.executor = executor; } @Override @@ -116,6 +111,7 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { new SilentDeployLogger(), configDefinitionRepo, getForVersionOrLatest(applicationPackage.getFileRegistries(), modelFactory.version()).orElse(new MockFileRegistry()), + executor, new ApplicationCuratorDatabase(tenant, curator).readReindexingStatus(applicationId), createStaticProvisioner(applicationPackage, modelContextProperties.applicationId(), provisioned), provisioned, 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 e5ef6dd38c7..1a8092d36b3 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 @@ -38,6 +38,7 @@ import java.time.Duration; import java.time.Instant; import java.util.List; import java.util.Optional; +import java.util.concurrent.ExecutorService; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -57,11 +58,13 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P private final Optional<ApplicationSet> currentActiveApplicationSet; private final ModelContext.Properties properties; private final Curator curator; + private final ExecutorService executor; public PreparedModelsBuilder(ModelFactoryRegistry modelFactoryRegistry, PermanentApplicationPackage permanentApplicationPackage, ConfigDefinitionRepo configDefinitionRepo, FileRegistry fileRegistry, + ExecutorService executor, HostProvisionerProvider hostProvisionerProvider, Curator curator, HostValidator<ApplicationId> hostValidator, @@ -79,6 +82,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P this.params = params; this.currentActiveApplicationSet = currentActiveApplicationSet; this.properties = properties; + this.executor = executor; } @Override @@ -100,6 +104,7 @@ public class PreparedModelsBuilder extends ModelsBuilder<PreparedModelsBuilder.P deployLogger(), configDefinitionRepo, fileRegistry, + executor, new ApplicationCuratorDatabase(applicationId.tenant(), curator).readReindexingStatus(applicationId), createHostProvisioner(applicationPackage, provisioned), provisioned, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java index 4c148e6e580..e58f5985288 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java @@ -9,7 +9,6 @@ import com.yahoo.config.FileReference; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; -import com.yahoo.config.model.api.ApplicationRoles; import com.yahoo.config.model.api.ConfigDefinitionRepo; import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.EndpointCertificateMetadata; @@ -39,7 +38,6 @@ import com.yahoo.vespa.config.server.http.InvalidApplicationException; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.modelfactory.PreparedModelsBuilder; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; -import com.yahoo.vespa.config.server.tenant.ApplicationRolesStore; import com.yahoo.vespa.config.server.tenant.ContainerEndpointsCache; import com.yahoo.vespa.config.server.tenant.EndpointCertificateMetadataStore; import com.yahoo.vespa.config.server.tenant.EndpointCertificateRetriever; @@ -56,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.concurrent.ExecutorService; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -79,9 +78,11 @@ public class SessionPreparer { private final Zone zone; private final SecretStore secretStore; private final FlagSource flagSource; + private final ExecutorService executor; public SessionPreparer(ModelFactoryRegistry modelFactoryRegistry, FileDistributionFactory fileDistributionFactory, + ExecutorService executor, HostProvisionerProvider hostProvisionerProvider, PermanentApplicationPackage permanentApplicationPackage, ConfigserverConfig configserverConfig, @@ -100,8 +101,11 @@ public class SessionPreparer { this.zone = zone; this.secretStore = secretStore; this.flagSource = flagSource; + this.executor = executor; } + ExecutorService getExecutor() { return executor; } + /** * Prepares a session (validates, builds model, writes to zookeeper and distributes files) * @@ -202,6 +206,7 @@ public class SessionPreparer { permanentApplicationPackage, configDefinitionRepo, fileRegistry, + executor, hostProvisionerProvider, curator, hostValidator, 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 ff9820ffb0c..43a684c1fba 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 @@ -503,6 +503,7 @@ public class SessionRepository { session.getSessionId(), sessionZooKeeperClient, previousApplicationSet, + sessionPreparer.getExecutor(), curator, metrics, permanentApplicationPackage, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java index ef219a21221..4d1a421e748 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantRepository.java @@ -6,6 +6,7 @@ import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.cloud.config.ZookeeperServerConfig; import com.yahoo.concurrent.DaemonThreadFactory; +import com.yahoo.concurrent.InThreadExecutorService; import com.yahoo.concurrent.Lock; import com.yahoo.concurrent.Locks; import com.yahoo.concurrent.StripedExecutor; @@ -35,6 +36,7 @@ import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.transaction.CuratorOperations; import com.yahoo.vespa.curator.transaction.CuratorTransaction; import com.yahoo.vespa.flags.FlagSource; +import com.yahoo.vespa.flags.Flags; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; import org.apache.curator.framework.state.ConnectionState; @@ -105,6 +107,7 @@ public class TenantRepository { private final StripedExecutor<TenantName> zkSessionWatcherExecutor; private final StripedExecutor<TenantName> zkApplicationWatcherExecutor; private final FileDistributionFactory fileDistributionFactory; + private final ExecutorService deployHelperExecutor; private final FlagSource flagSource; private final SecretStore secretStore; private final HostProvisionerProvider hostProvisionerProvider; @@ -198,6 +201,8 @@ public class TenantRepository { this.reloadListener = reloadListener; this.tenantListener = tenantListener; this.zookeeperServerConfig = zookeeperServerConfig; + // This we should control with a feature flag. + this.deployHelperExecutor = createModelBuilderExecutor(Flags.NUM_DEPLOY_HELPER_THREADS.bindTo(flagSource).value()); curator.framework().getConnectionStateListenable().addListener(this::stateChanged); @@ -215,6 +220,14 @@ public class TenantRepository { TimeUnit.SECONDS); } + private ExecutorService createModelBuilderExecutor(int numThreads) { + if (numThreads == 0) return new InThreadExecutorService(); + if (numThreads < 0) { + numThreads = Runtime.getRuntime().availableProcessors(); + } + return Executors.newFixedThreadPool(numThreads, ThreadFactoryFactory.getDaemonThreadFactory("deploy-helper")); + } + private void notifyTenantsLoaded() { tenantListener.onTenantsLoaded(); } @@ -335,6 +348,7 @@ public class TenantRepository { PermanentApplicationPackage permanentApplicationPackage = new PermanentApplicationPackage(configserverConfig); SessionPreparer sessionPreparer = new SessionPreparer(modelFactoryRegistry, fileDistributionFactory, + deployHelperExecutor, hostProvisionerProvider, permanentApplicationPackage, configserverConfig, 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 d97f809da6e..9a8b89e55c0 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 @@ -3,6 +3,7 @@ package com.yahoo.vespa.config.server; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.component.Version; +import com.yahoo.concurrent.InThreadExecutorService; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.HostProvisioner; @@ -58,6 +59,7 @@ public class ModelContextImplTest { new BaseDeployLogger(), new StaticConfigDefinitionRepo(), new MockFileRegistry(), + new InThreadExecutorService(), Optional.empty(), hostProvisioner, new Provisioned(), diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java index 3fedddc93a7..4ea6fa21a50 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.config.server.session; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.component.Version; +import com.yahoo.concurrent.InThreadExecutorService; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.application.api.FileRegistry; import com.yahoo.config.model.api.ContainerEndpoint; @@ -123,6 +124,7 @@ public class SessionPreparerTest { return new SessionPreparer( modelFactoryRegistry, new MockFileDistributionFactory(configserverConfig), + new InThreadExecutorService(), hostProvisionerProvider, new PermanentApplicationPackage(configserverConfig), configserverConfig, diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java index 1e1314311a6..83764686e5a 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionTest.java @@ -1,11 +1,11 @@ // 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.session; +import com.yahoo.concurrent.InThreadExecutorService; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.path.Path; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.host.HostValidator; import com.yahoo.vespa.curator.mock.MockCurator; @@ -24,7 +24,7 @@ public class SessionTest { public static class MockSessionPreparer extends SessionPreparer { public MockSessionPreparer() { - super(null, null, null, null, null, null, new MockCurator(), null, null, null); + super(null, null, new InThreadExecutorService(), null, null, null, null, new MockCurator(), null, null, null); } @Override |