summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-02-16 18:47:02 +0100
committerJon Marius Venstad <venstad@gmail.com>2021-02-19 17:40:10 +0100
commit7f49e00aecfe16e83d6bec9ec5bc7e1777e65a9f (patch)
tree80b7557da379358ccb670d44908a86025cdab7e3
parent3de6d8a5af2a9400b3f47da1fd2372056494504d (diff)
Wire property for dedicated CC through session and model, from app-curator-db
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java11
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/application/ApplicationCuratorDatabase.java12
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ActivatedModelsBuilder.java3
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java18
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionZooKeeperClient.java13
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java3
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),