diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-02-16 18:47:02 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-02-19 17:40:10 +0100 |
commit | 7f49e00aecfe16e83d6bec9ec5bc7e1777e65a9f (patch) | |
tree | 80b7557da379358ccb670d44908a86025cdab7e3 | |
parent | 3de6d8a5af2a9400b3f47da1fd2372056494504d (diff) |
Wire property for dedicated CC through session and model, from app-curator-db
8 files changed, 58 insertions, 11 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java index e19e2a458b7..459353f35c4 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java @@ -121,6 +121,8 @@ public interface ModelContext { // Note: Used in unit tests (set to false in TestProperties) to avoid needing to deal with implicitly created node for logserver default boolean useDedicatedNodeForLogserver() { return true; } + default boolean dedicatedClusterControllerCluster() { return false; } + } @Retention(RetentionPolicy.RUNTIME) diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index a253dac7d1b..535b2eb083c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -32,6 +32,7 @@ import com.yahoo.path.Path; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.application.Application; +import com.yahoo.vespa.config.server.application.ApplicationCuratorDatabase; import com.yahoo.vespa.config.server.application.ApplicationReindexing; import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.application.ClusterReindexing; @@ -933,13 +934,17 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye return getLocalSession(tenant, sessionId).getMetaData(); } - public ApplicationReindexing getReindexing(ApplicationId id) { + private ApplicationCuratorDatabase requireDatabase(ApplicationId id) { Tenant tenant = getTenant(id); if (tenant == null) throw new NotFoundException("Tenant '" + id.tenant().value() + "' not found"); - return tenant.getApplicationRepo().database().readReindexingStatus(id) - .orElseThrow(() -> new NotFoundException("Reindexing status not found for " + id)); + return tenant.getApplicationRepo().database(); + } + + public ApplicationReindexing getReindexing(ApplicationId id) { + return requireDatabase(id).readReindexingStatus(id) + .orElseThrow(() -> new NotFoundException("Reindexing status not found for " + id)); } public void modifyReindexing(ApplicationId id, UnaryOperator<ApplicationReindexing> modifications) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationCuratorDatabase.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationCuratorDatabase.java index 099de9bc2bf..8b3bcb3e25b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationCuratorDatabase.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationCuratorDatabase.java @@ -110,6 +110,14 @@ public class ApplicationCuratorDatabase { : data.map(bytes -> Long.parseLong(Utf8.toString(bytes))); } + public boolean getDedicatedClusterControllerCluster(ApplicationId id) { + return curator.exists(dedicatedClusterControllerClusterPath(id)); + } + + public void setDedicatedClusterControllerCluster(ApplicationId id) { + curator.create(dedicatedClusterControllerClusterPath(id)); + } + /** * List the active applications of a tenant in this config server. * @@ -151,6 +159,10 @@ public class ApplicationCuratorDatabase { return applicationsPath.append(id.serializedForm()); } + private Path dedicatedClusterControllerClusterPath(ApplicationId id) { + return applicationPath(id).append("dedicatedClusterControllerCluster"); + } + private Path reindexingDataPath(ApplicationId id) { return applicationPath(id).append("reindexing"); } 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 18d6dfeb40b..b661c16507f 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 @@ -248,6 +248,7 @@ public class ModelContextImpl implements ModelContext { private final Optional<AthenzDomain> athenzDomain; private final Optional<ApplicationRoles> applicationRoles; private final Quota quota; + private final boolean dedicatedClusterControllerCluster; private final String jvmGcOptions; @@ -261,7 +262,8 @@ public class ModelContextImpl implements ModelContext { Optional<EndpointCertificateSecrets> endpointCertificateSecrets, Optional<AthenzDomain> athenzDomain, Optional<ApplicationRoles> applicationRoles, - Optional<Quota> maybeQuota) { + Optional<Quota> maybeQuota, + boolean dedicatedClusterControllerCluster) { this.featureFlags = new FeatureFlags(flagSource, applicationId); this.applicationId = applicationId; this.multitenant = configserverConfig.multitenant() || configserverConfig.hostedVespa() || Boolean.getBoolean("multitenant"); @@ -278,6 +280,7 @@ public class ModelContextImpl implements ModelContext { this.athenzDomain = athenzDomain; this.applicationRoles = applicationRoles; this.quota = maybeQuota.orElseGet(Quota::unlimited); + this.dedicatedClusterControllerCluster = dedicatedClusterControllerCluster; jvmGcOptions = flagValue(flagSource, applicationId, PermanentFlags.JVM_GC_OPTIONS); } @@ -336,6 +339,8 @@ public class ModelContextImpl implements ModelContext { @Override public String jvmGCOptions() { return jvmGcOptions; } + @Override public boolean dedicatedClusterControllerCluster() { return dedicatedClusterControllerCluster; } + private static <V> V flagValue(FlagSource source, ApplicationId appId, UnboundFlag<? extends V, ?, ?> flag) { return flag.bindTo(source) .with(FetchVector.Dimension.APPLICATION_ID, appId.serializedForm()) 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 327b2d83373..5a72175e42a 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 @@ -161,7 +161,8 @@ public class ActivatedModelsBuilder extends ModelsBuilder<Application> { zkClient.readAthenzDomain(), new ApplicationRolesStore(curator, TenantRepository.getTenantPath(tenant)) .readApplicationRoles(applicationId), - zkClient.readQuota()); + zkClient.readQuota(), + zkClient.readDedicatedClusterControllerCluster()); } } 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 b29259e22d4..5e2a4b60948 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 @@ -26,6 +26,7 @@ import com.yahoo.container.jdisc.secretstore.SecretStore; import com.yahoo.lang.SettableOptional; import com.yahoo.path.Path; import com.yahoo.vespa.config.server.TimeoutBudget; +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.configchange.ConfigChangeActions; @@ -114,9 +115,11 @@ public class SessionPreparer { Optional<ApplicationSet> activeApplicationSet, Instant now, File serverDbSessionDir, ApplicationPackage applicationPackage, SessionZooKeeperClient sessionZooKeeperClient) { ApplicationId applicationId = params.getApplicationId(); + boolean dedicatedClusterControllerCluster = new ApplicationCuratorDatabase(applicationId.tenant(), curator).getDedicatedClusterControllerCluster(applicationId); Preparation preparation = new Preparation(hostValidator, logger, params, activeApplicationSet, TenantRepository.getTenantPath(applicationId.tenant()), - serverDbSessionDir, applicationPackage, sessionZooKeeperClient); + serverDbSessionDir, applicationPackage, sessionZooKeeperClient, + dedicatedClusterControllerCluster); preparation.preprocess(); try { AllocatedHosts allocatedHosts = preparation.buildModels(now); @@ -170,7 +173,7 @@ public class SessionPreparer { Preparation(HostValidator<ApplicationId> hostValidator, DeployLogger logger, PrepareParams params, Optional<ApplicationSet> currentActiveApplicationSet, Path tenantPath, File serverDbSessionDir, ApplicationPackage applicationPackage, - SessionZooKeeperClient sessionZooKeeperClient) { + SessionZooKeeperClient sessionZooKeeperClient, boolean dedicatedClusterControllerCluster) { this.logger = logger; this.params = params; this.applicationPackage = applicationPackage; @@ -200,7 +203,8 @@ public class SessionPreparer { endpointCertificateSecrets, athenzDomain, applicationRoles, - params.quota()); + params.quota(), + dedicatedClusterControllerCluster); this.fileDistributionProvider = fileDistributionFactory.createProvider(serverDbSessionDir); this.preparedModelsBuilder = new PreparedModelsBuilder(modelFactoryRegistry, permanentApplicationPackage, @@ -272,7 +276,8 @@ public class SessionPreparer { prepareResult.getFileRegistries(), prepareResult.allocatedHosts(), athenzDomain, - params.quota()); + params.quota(), + properties.dedicatedClusterControllerCluster()); checkTimeout("write state to zookeeper"); } @@ -321,7 +326,8 @@ public class SessionPreparer { Map<Version, FileRegistry> fileRegistryMap, AllocatedHosts allocatedHosts, Optional<AthenzDomain> athenzDomain, - Optional<Quota> quota) { + Optional<Quota> quota, + boolean dedicatedClusterControllerCluster) { ZooKeeperDeployer zkDeployer = zooKeeperClient.createDeployer(deployLogger); try { zkDeployer.deploy(applicationPackage, fileRegistryMap, allocatedHosts); @@ -332,6 +338,8 @@ public class SessionPreparer { zooKeeperClient.writeDockerImageRepository(dockerImageRepository); zooKeeperClient.writeAthenzDomain(athenzDomain); zooKeeperClient.writeQuota(quota); + if (dedicatedClusterControllerCluster) + zooKeeperClient.writeDedicatedClusterControllerCluster(); } catch (RuntimeException | IOException e) { zkDeployer.cleanup(); throw new RuntimeException("Error preparing session", e); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java index 74d123341f6..aaa3d0b2c35 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java @@ -52,6 +52,7 @@ public class SessionZooKeeperClient { private static final String DOCKER_IMAGE_REPOSITORY_PATH = "dockerImageRepository"; private static final String ATHENZ_DOMAIN = "athenzDomain"; private static final String QUOTA_PATH = "quota"; + private static final String DEDICATED_CLUSTER_CONTROLLER_CLUSTER_PATH = "dedicatedClusterControllerCluster"; private final Curator curator; private final ConfigCurator configCurator; private final TenantName tenantName; @@ -189,6 +190,10 @@ public class SessionZooKeeperClient { return sessionPath.append(QUOTA_PATH).getAbsolute(); } + private String dedicatedClusterControllerClusterPath() { + return sessionPath.append(DEDICATED_CLUSTER_CONTROLLER_CLUSTER_PATH).getAbsolute(); + } + public void writeVespaVersion(Version version) { configCurator.putData(versionPath(), version.toString()); } @@ -264,6 +269,14 @@ public class SessionZooKeeperClient { .map(slime -> Quota.fromSlime(slime.get())); } + public void writeDedicatedClusterControllerCluster() { + configCurator.createNode(dedicatedClusterControllerClusterPath()); + } + + public boolean readDedicatedClusterControllerCluster() { + return configCurator.exists(dedicatedClusterControllerClusterPath()); + } + /** * Create necessary paths atomically for a new session. * 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 b1edc031e0b..718c001d930 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 @@ -71,7 +71,8 @@ public class ModelContextImplTest { null, Optional.empty(), Optional.empty(), - Optional.empty()), + Optional.empty(), + false), Optional.empty(), Optional.empty(), new Version(7), |