diff options
author | Harald Musum <musum@verizonmedia.com> | 2021-03-10 10:37:55 +0100 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2021-03-10 10:37:55 +0100 |
commit | 8aa6cd74137b3bb10658e80aba0a248467c4f2c6 (patch) | |
tree | 9281f7e5a5e35e1f0a7e816af2fc79f1fb7bdcbe /config-model | |
parent | a979438f32ee5d8475a04f70fcef45f02d6fc025 (diff) | |
parent | 04d47d154b3fbd6433e6364de2adbbe56fb9543f (diff) |
Merge branch 'master' into jonmv/reserve-less-memory-on-content-nodes
Diffstat (limited to 'config-model')
28 files changed, 185 insertions, 141 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java index be15abc5ac8..77e5e98cd99 100644 --- a/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java +++ b/config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java @@ -51,13 +51,12 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea private boolean useAccessControlTlsHandshakeClientAuth; private boolean useAsyncMessageHandlingOnSchedule = false; private double feedConcurrency = 0.5; - private boolean reconfigurableZookeeperServer = false; private boolean useBucketExecutorForLidSpaceCompact; private boolean useBucketExecutorForBucketMove; - private boolean enableFeedBlockInDistributor = false; + private boolean enableFeedBlockInDistributor = true; private double maxDeadBytesRatio = 0.2; - private int clusterControllerMaxHeapSizeInMb = 512; - private int metricsProxyMaxHeapSizeInMb = 512; + private int clusterControllerMaxHeapSizeInMb = 256; + private int metricsProxyMaxHeapSizeInMb = 256; private int maxActivationInhibitedOutOfSyncGroups = 0; @Override public ModelContext.FeatureFlags featureFlags() { return this; } @@ -91,7 +90,6 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea @Override public boolean useAccessControlTlsHandshakeClientAuth() { return useAccessControlTlsHandshakeClientAuth; } @Override public boolean useAsyncMessageHandlingOnSchedule() { return useAsyncMessageHandlingOnSchedule; } @Override public double feedConcurrency() { return feedConcurrency; } - @Override public boolean reconfigurableZookeeperServer() { return reconfigurableZookeeperServer; } @Override public boolean useBucketExecutorForLidSpaceCompact() { return useBucketExecutorForLidSpaceCompact; } @Override public boolean useBucketExecutorForBucketMove() { return useBucketExecutorForBucketMove; } @Override public boolean enableFeedBlockInDistributor() { return enableFeedBlockInDistributor; } @@ -200,11 +198,6 @@ public class TestProperties implements ModelContext.Properties, ModelContext.Fea return this; } - public TestProperties reconfigurableZookeeperServer(boolean enabled) { - this.reconfigurableZookeeperServer = enabled; - return this; - } - public TestProperties useBucketExecutorForLidSpaceCompact(boolean enabled) { useBucketExecutorForLidSpaceCompact = enabled; return this; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index 0f006c31959..3f346f20144 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -105,6 +105,7 @@ public class Admin extends AbstractConfigProducer<Admin> implements Serializable return metricsProxyCluster; } + /** Used by model amenders */ public void setAdditionalDefaultMetrics(MetricSet additionalDefaultMetrics) { if (additionalDefaultMetrics == null) return; this.additionalDefaultMetrics = additionalDefaultMetrics; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainer.java index 356453dcf5b..c2bc2494613 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainer.java @@ -26,4 +26,9 @@ public class LogserverContainer extends Container { return ContainerServiceType.LOGSERVER_CONTAINER; } + @Override + public String defaultPreload() { + return ""; + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java index 916c65e5f82..a8621eae3f5 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/LogserverContainerCluster.java @@ -1,4 +1,4 @@ -// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin; import com.yahoo.config.model.deploy.DeployState; @@ -26,8 +26,8 @@ public class LogserverContainerCluster extends ContainerCluster<LogserverContain @Override public void getConfig(QrStartConfig.Builder builder) { super.getConfig(builder); - builder.jvm.heapsize(384) - .verbosegc(true); + builder.jvm.heapsize(128) + .verbosegc(true); } protected boolean messageBusEnabled() { return false; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java index f55d179b184..f1717625d10 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainer.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.model.admin.clustercontroller; import com.yahoo.cloud.config.ZookeeperServerConfig; import com.yahoo.component.ComponentSpecification; -import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.api.container.ContainerServiceType; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -41,16 +40,13 @@ public class ClusterControllerContainer extends Container implements private static final ComponentSpecification REINDEXING_CONTROLLER_BUNDLE = new ComponentSpecification("clustercontroller-reindexer"); private final Set<String> bundles = new TreeSet<>(); - private final ModelContext.FeatureFlags featureFlags; - - public ClusterControllerContainer( - AbstractConfigProducer<?> parent, - int index, - boolean runStandaloneZooKeeper, - DeployState deployState, - boolean retired) { + + public ClusterControllerContainer(AbstractConfigProducer<?> parent, + int index, + boolean runStandaloneZooKeeper, + DeployState deployState, + boolean retired) { super(parent, "" + index, retired, index, deployState.isHosted()); - this.featureFlags = deployState.featureFlags(); addHandler("clustercontroller-status", "com.yahoo.vespa.clustercontroller.apps.clustercontroller.StatusHandler", "/clustercontroller-status/*", @@ -70,7 +66,7 @@ public class ClusterControllerContainer extends Container implements addFileBundle("clustercontroller-utils"); addFileBundle("zookeeper-server"); configureReindexing(); - configureZooKeeperServer(runStandaloneZooKeeper, deployState.featureFlags().reconfigurableZookeeperServer()); + configureZooKeeperServer(runStandaloneZooKeeper); } @Override @@ -88,16 +84,13 @@ public class ClusterControllerContainer extends Container implements return ContainerServiceType.CLUSTERCONTROLLER_CONTAINER; } - private void configureZooKeeperServer(boolean runStandaloneZooKeeper, boolean reconfigurable) { - if (reconfigurable && runStandaloneZooKeeper) { + private void configureZooKeeperServer(boolean runStandaloneZooKeeper) { + if (runStandaloneZooKeeper) ContainerModelBuilder.addReconfigurableZooKeeperServerComponents(this); - } else { + else addComponent("clustercontroller-zookeeper-server", - runStandaloneZooKeeper - ? "com.yahoo.vespa.zookeeper.VespaZooKeeperServerImpl" - : "com.yahoo.vespa.zookeeper.DummyVespaZooKeeperServer", + "com.yahoo.vespa.zookeeper.DummyVespaZooKeeperServer", ZOOKEEPER_SERVER_BUNDLE); - } } private void addHandler(Handler<?> h, String path) { @@ -148,7 +141,7 @@ public class ClusterControllerContainer extends Container implements @Override public void getConfig(ZookeeperServerConfig.Builder builder) { builder.myid(index()); - builder.dynamicReconfiguration(featureFlags.reconfigurableZookeeperServer()); + builder.dynamicReconfiguration(true); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java index 4fc73de3b48..abdbb3c90a3 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/clustercontroller/ClusterControllerContainerCluster.java @@ -35,11 +35,10 @@ public class ClusterControllerContainerCluster extends ContainerCluster<ClusterC @Override public void getConfig(QrStartConfig.Builder builder) { super.getConfig(builder); - int maxHeapSize = featureFlags.clusterControllerMaxHeapSizeInMb(); - boolean verboseGc = (maxHeapSize < 512); + builder.jvm - .verbosegc(verboseGc) - .heapsize(maxHeapSize); + .verbosegc(true) + .heapsize(featureFlags.clusterControllerMaxHeapSizeInMb()); } public ReindexingContext reindexingContext() { return reindexingContext; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainer.java index 690900865ad..45af078f2a3 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainer.java @@ -15,7 +15,6 @@ import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.api.container.ContainerServiceType; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.provision.ClusterMembership; -import com.yahoo.config.provision.ClusterSpec; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.HostResource; import com.yahoo.vespa.model.PortAllocBridge; @@ -150,9 +149,8 @@ public class MetricsProxyContainer extends Container implements if (clusterMembership.isPresent()) { int maxHeapSize = featureFlags.metricsProxyMaxHeapSizeInMb(clusterMembership.get().cluster().type()); - boolean verboseGc = (maxHeapSize < 512); builder.jvm - .verbosegc(verboseGc) + .verbosegc(true) .heapsize(maxHeapSize); } } @@ -173,4 +171,5 @@ public class MetricsProxyContainer extends Container implements protected String defaultPreload() { return ""; } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java index 347d0ebce6c..6bb3a62f234 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java @@ -20,7 +20,8 @@ public class AutoscalingMetrics { "mem.util", "disk.util", "application_generation", - "in_service")); + "in_service", + "queries.rate")); } private static Set<Metric> metrics(String ... metrics) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java index 30797f27789..9c969d4f11e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java @@ -43,13 +43,13 @@ public class MetricSet { /** * Returns all metrics in this set, including all metrics in any contained metric sets. - * <br> + * * Joins this set's metrics with its child sets into a named flat map of metrics. * In the case of duplicate metrics, the metrics directly defined in this set * takes precedence with respect to output name, description and dimension value * (even if they are empty), while new dimensions from the children will be added. * - * @return All metrics contained in this set. + * @return all the metrics contained in this set */ public final Map<String, Metric> getMetrics() { return unmodifiableMap(flatten(metrics, children)); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SecretStoreValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SecretStoreValidator.java index d26ff49c4fa..b57d2841a98 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SecretStoreValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/SecretStoreValidator.java @@ -7,8 +7,11 @@ import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.IdentityProvider; +import com.yahoo.vespa.model.container.SecretStore; import com.yahoo.vespa.model.container.component.Component; +import java.util.List; + /** * Validates the requirements for setting up a secret store. * @@ -22,11 +25,10 @@ public class SecretStoreValidator extends Validator { if (model.getAdmin().getApplicationType() != ApplicationType.DEFAULT) return; for (ContainerCluster cluster : model.getContainerClusters().values()) { - if (cluster.getSecretStore().isPresent() && ! hasIdentityProvider(cluster)) { - throw new IllegalArgumentException(String.format( + if (cluster.getSecretStore().isPresent() && ! hasIdentityProvider(cluster)) + throw new IllegalArgumentException(String.format( "Container cluster '%s' uses a secret store, so an Athenz domain and an Athenz service" + " must be declared in deployment.xml.", cluster.getName())); - } } } @@ -36,4 +38,5 @@ public class SecretStoreValidator extends Validator { } return false; } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validator.java index c926c1f13a0..f3bebbe7fb9 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validator.java @@ -8,7 +8,6 @@ import com.yahoo.vespa.model.VespaModel; * Abstract superclass of all application package validators. * * @author hmusum - * @since 2010-01-29 */ public abstract class Validator { 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 dafce877ddd..f0c62664988 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 @@ -81,7 +81,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat private ContainerModelEvaluation modelEvaluation; - private Optional<String> tlsClientAuthority; + private final Optional<String> tlsClientAuthority; private MbusParams mbusParams; private boolean messageBusEnabled = true; 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 a1db3c43f1c..db4cda8b72e 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 @@ -487,7 +487,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> .availableProcessors(2) .compressedClassSpaceSize(32) .minHeapsize(32) - .heapsize(512) + .heapsize(256) .heapSizeAsPercentageOfPhysicalMemory(0) .gcopts(Objects.requireNonNullElse(jvmGCOptions, G1GC)); if (environmentVars != null) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/CloudSecretStore.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/CloudSecretStore.java new file mode 100644 index 00000000000..39f9a627e0c --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/CloudSecretStore.java @@ -0,0 +1,64 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.container.xml; + +import com.yahoo.container.bundle.BundleInstantiationSpecification; +import com.yahoo.container.jdisc.secretstore.SecretStoreConfig; +import com.yahoo.osgi.provider.model.ComponentModel; +import com.yahoo.vespa.model.container.component.SimpleComponent; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author olaa + */ +public class CloudSecretStore extends SimpleComponent implements SecretStoreConfig.Producer { + + private static final String CLASS = "com.yahoo.jdisc.cloud.aws.AwsParameterStore"; + private static final String BUNDLE = "jdisc-cloud-aws"; + + private final List<StoreConfig> configList; + + public CloudSecretStore() { + super(new ComponentModel(BundleInstantiationSpecification.getFromStrings(CLASS, CLASS, BUNDLE))); + configList = new ArrayList<>(); + } + + public void addConfig(String name, String region, String awsId, String role, String externalId) { + configList.add( + new StoreConfig(name, region, awsId, role, externalId) + ); + } + + @Override + public void getConfig(SecretStoreConfig.Builder builder) { + builder.groups( + configList.stream() + .map(config -> new SecretStoreConfig.Groups.Builder() + .name(config.name) + .region(config.region) + .awsId(config.awsId) + .role(config.role) + .externalId(config.externalId) + ).collect(Collectors.toList()) + ); + } + + class StoreConfig { + private final String name; + private final String region; + private final String awsId; + private final String role; + private final String externalId; + + public StoreConfig(String name, String region, String awsId, String role, String externalId) { + this.name = name; + this.region = region; + this.awsId = awsId; + this.role = role; + this.externalId = externalId; + } + + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index e7e82d577f4..4efd88c7307 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -14,6 +14,7 @@ import com.yahoo.config.model.ConfigModelContext.ApplicationType; import com.yahoo.config.model.api.ConfigServerSpec; import com.yahoo.config.model.api.ContainerEndpoint; import com.yahoo.config.model.api.EndpointCertificateSecrets; +import com.yahoo.config.model.api.TenantSecretStore; import com.yahoo.config.model.application.provider.IncludeDirs; import com.yahoo.config.model.builder.xml.ConfigModelBuilder; import com.yahoo.config.model.builder.xml.ConfigModelId; @@ -29,7 +30,6 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.container.logging.FileConnectionLog; import com.yahoo.osgi.provider.model.ComponentModel; @@ -181,7 +181,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { DeployState deployState = context.getDeployState(); DocumentFactoryBuilder.buildDocumentFactories(cluster, spec); addConfiguredComponents(deployState, cluster, spec); - addSecretStore(cluster, spec); + addSecretStore(cluster, spec, deployState); addRestApis(deployState, spec, cluster); addServlets(deployState, spec, cluster); @@ -255,17 +255,49 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { return new SimpleComponent(new ComponentModel(idSpec, null, "zookeeper-server", configId)); } - private void addSecretStore(ApplicationContainerCluster cluster, Element spec) { + private void addSecretStore(ApplicationContainerCluster cluster, Element spec, DeployState deployState) { + Element secretStoreElement = XML.getChild(spec, "secret-store"); if (secretStoreElement != null) { - SecretStore secretStore = new SecretStore(); - for (Element group : XML.getChildren(secretStoreElement, "group")) { - secretStore.addGroup(group.getAttribute("name"), group.getAttribute("environment")); + String type = secretStoreElement.getAttribute("type"); + if ("cloud".equals(type)) { + addCloudSecretStore(cluster, secretStoreElement, deployState); + } else { + SecretStore secretStore = new SecretStore(); + for (Element group : XML.getChildren(secretStoreElement, "group")) { + secretStore.addGroup(group.getAttribute("name"), group.getAttribute("environment")); + } + cluster.setSecretStore(secretStore); } - cluster.setSecretStore(secretStore); } } + private void addCloudSecretStore(ApplicationContainerCluster cluster, Element secretStoreElement, DeployState deployState) { + CloudSecretStore cloudSecretStore = new CloudSecretStore(); + Map<String, TenantSecretStore> secretStoresByName = deployState.getProperties().tenantSecretStores() + .stream() + .collect(Collectors.toMap( + TenantSecretStore::getName, + store -> store + )); + + for (Element group : XML.getChildren(secretStoreElement, "group")) { + String name = group.getAttribute("name"); + String region = group.getAttribute("region"); + TenantSecretStore secretStore = secretStoresByName.get(name); + + if (secretStore == null) + throw new RuntimeException("No configured secret store named " + name); + + if (secretStore.getExternalId().isEmpty()) + throw new RuntimeException("No external ID has been set"); + + cloudSecretStore.addConfig(name, region, secretStore.getAwsId(), secretStore.getRole(), secretStore.getExternalId().get()); + } + + cluster.addComponent(cloudSecretStore); + } + private void addAthensCopperArgos(ApplicationContainerCluster cluster, ConfigModelContext context) { if ( ! context.getDeployState().isHosted()) return; app.getDeployment().map(DeploymentSpec::fromXml) diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java index 0de111e459e..6f7709efc24 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java @@ -325,10 +325,6 @@ public class ContentSearchCluster extends AbstractConfigProducer<SearchCluster> indexedCluster.setSearchableCopies(redundancy.readyCopies()); } this.redundancy = redundancy; - for (SearchNode node : getSearchNodes()) { - node.setRedundancy(redundancy.finalRedundancy()); - node.setSearchableCopies(redundancy.readyCopies()); - } } private Optional<StreamingSearchCluster> findStreamingCluster(String docType) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index c3591d9ebdd..c909aeec022 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -303,13 +303,12 @@ public class ContentCluster extends AbstractConfigProducer implements clusterControllers = overlappingCluster.getClusterControllers(); } else if (admin.multitenant()) { - String clusterName = contentClusterName + "-controllers"; if (context.properties().dedicatedClusterControllerCluster()) clusterControllers = getDedicatedSharedControllers(contentElement, admin, context, deployState); else { clusterControllers = createClusterControllers(new ClusterControllerCluster(contentCluster, "standalone", deployState), drawControllerHosts(3, rootGroup), - clusterName, + contentClusterName + "-controllers", true, context.getDeployState()); contentCluster.clusterControllers = clusterControllers; @@ -355,7 +354,7 @@ public class ContentCluster extends AbstractConfigProducer implements private ClusterControllerContainerCluster getDedicatedSharedControllers(ModelElement contentElement, Admin admin, ConfigModelContext context, DeployState deployState) { if (admin.getClusterControllers() == null) { - NodesSpecification spec = NodesSpecification.requiredFromSharedParents(deployState.zone().environment().isTest() ? 1 : 3, + NodesSpecification spec = NodesSpecification.requiredFromSharedParents(deployState.zone().environment().isProduction() ? 3 : 1, deployState.featureFlags().dedicatedClusterControllerFlavor().orElse(clusterControllerResources), contentElement, context); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java index 1d18b26440b..3fadd1f2efd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java @@ -16,9 +16,9 @@ public class NodeResourcesTuning implements ProtonConfig.Producer { final static long MB = 1024 * 1024; public final static long GB = MB * 1024; + // This is an approximate number base on observation of a node using 33G memory with 765M docs + private final static long MEMORY_COST_PER_DOCUMENT_STORE_ONLY = 46L; private final NodeResources resources; - private final int redundancy; - private final int searchableCopies; private final int threadsPerSearch; private final boolean combined; @@ -26,13 +26,9 @@ public class NodeResourcesTuning implements ProtonConfig.Producer { public static final double reservedMemoryGb = 0.5; public NodeResourcesTuning(NodeResources resources, - int redundancy, - int searchableCopies, int threadsPerSearch, boolean combined) { this.resources = resources; - this.redundancy = redundancy; - this.searchableCopies = searchableCopies; this.threadsPerSearch = threadsPerSearch; this.combined = combined; } @@ -56,8 +52,8 @@ public class NodeResourcesTuning implements ProtonConfig.Producer { private void getConfig(ProtonConfig.Documentdb.Builder builder) { ProtonConfig.Documentdb dbCfg = builder.build(); if (dbCfg.mode() != ProtonConfig.Documentdb.Mode.Enum.INDEX) { - long numDocs = (long)usableMemoryGb() * GB / 64L; - builder.allocation.initialnumdocs(numDocs/Math.max(searchableCopies, redundancy)); + long numDocs = (long)usableMemoryGb() * GB / MEMORY_COST_PER_DOCUMENT_STORE_ONLY; + builder.allocation.initialnumdocs(numDocs); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java index 16302ddff49..9f129f65281 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java @@ -62,8 +62,6 @@ public class SearchNode extends AbstractService implements private final boolean flushOnShutdown; private NodeSpec nodeSpec; private int distributionKey; - private int redundancy = 1; - private int searchableCopies = 1; private final String clusterName; private TransactionLogServer tls; private AbstractService serviceLayerService; @@ -160,16 +158,6 @@ public class SearchNode extends AbstractService implements private String getBaseDir() { return getDefaults().underVespaHome("var/db/vespa/search/cluster." + getClusterName()) + "/n" + distributionKey; } - public void setSearchableCopies(int searchableCopies) { - this.searchableCopies = searchableCopies; - } - public void setRedundancy(int redundancy) { - this.redundancy = redundancy; - } - - void updatePartition(int partitionId) { - nodeSpec = new NodeSpec(nodeSpec.groupIndex(), partitionId); - } @Override public NodeSpec getNodeSpec() { @@ -286,8 +274,6 @@ public class SearchNode extends AbstractService implements } if (getHostResource() != null && ! getHostResource().realResources().isUnspecified()) { var nodeResourcesTuning = new NodeResourcesTuning(getHostResource().realResources(), - redundancy, - searchableCopies, tuning.map(Tuning::threadsPerSearch).orElse(1), combined); nodeResourcesTuning.getConfig(builder); diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc index 5257345c39e..abe7386fa00 100644 --- a/config-model/src/main/resources/schema/containercluster.rnc +++ b/config-model/src/main/resources/schema/containercluster.rnc @@ -86,10 +86,11 @@ AccessLog = element accesslog { } SecretStore = element secret-store { - attribute type { string "oath-ckms" } & + attribute type { string "oath-ckms" | string "cloud" } & element group { attribute name { string } & - attribute environment { string "alpha" | string "corp" | string "prod" | string "aws" | string "aws_stage" } + (attribute environment { string "alpha" | string "corp" | string "prod" | string "aws" | string "aws_stage" } | + attribute region { string } ) } + } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/ClusterControllerTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/ClusterControllerTestCase.java index 0a99797a53f..4ce52aaf4d3 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/ClusterControllerTestCase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/ClusterControllerTestCase.java @@ -1,4 +1,4 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin; import com.google.common.collect.Collections2; @@ -389,10 +389,10 @@ public class ClusterControllerTestCase extends DomBuilderTest { model.getConfig(qrBuilder, "admin/cluster-controllers/0/components/clustercontroller-bar-configurer"); QrStartConfig qrStartConfig = new QrStartConfig(qrBuilder); assertEquals(32, qrStartConfig.jvm().minHeapsize()); - assertEquals(512, qrStartConfig.jvm().heapsize()); + assertEquals(256, qrStartConfig.jvm().heapsize()); assertEquals(0, qrStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory()); assertEquals(2, qrStartConfig.jvm().availableProcessors()); - assertFalse(qrStartConfig.jvm().verbosegc()); + assertTrue(qrStartConfig.jvm().verbosegc()); assertEquals("-XX:+UseG1GC -XX:MaxTenuringThreshold=15", qrStartConfig.jvm().gcopts()); assertEquals(512, qrStartConfig.jvm().stacksize()); assertEquals(0, qrStartConfig.jvm().directMemorySizeCache()); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SecretStoreValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SecretStoreValidatorTest.java index da81c74fdd2..4a9535623bb 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SecretStoreValidatorTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/SecretStoreValidatorTest.java @@ -27,7 +27,7 @@ public class SecretStoreValidatorTest { private static String servicesXml() { return joinLines("<services version='1.0'>", " <container id='default' version='1.0'>", - " <secret-store>", + " <secret-store type='oath-ckms'>", " <group name='group1' environment='prod'/>", " </secret-store>", " </container>", diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java index 30e3767e3dc..23c37666257 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java @@ -107,7 +107,7 @@ public class ContainerClusterTest { private void verifyHeapSizeAsPercentageOfPhysicalMemory(boolean isHosted, boolean isCombinedCluster, Integer explicitMemoryPercentage, int expectedMemoryPercentage) { - ContainerCluster cluster = createContainerCluster(createRoot(isHosted), isCombinedCluster, explicitMemoryPercentage); + ContainerCluster<?> cluster = createContainerCluster(createRoot(isHosted), isCombinedCluster, explicitMemoryPercentage); QrStartConfig.Builder qsB = new QrStartConfig.Builder(); cluster.getConfig(qsB); QrStartConfig qsC= new QrStartConfig(qsB); @@ -171,7 +171,7 @@ public class ContainerClusterTest { cluster.getConfig(qrBuilder); QrStartConfig qrStartConfig = new QrStartConfig(qrBuilder); assertEquals(32, qrStartConfig.jvm().minHeapsize()); - assertEquals(512, qrStartConfig.jvm().heapsize()); + assertEquals(256, qrStartConfig.jvm().heapsize()); assertEquals(32, qrStartConfig.jvm().compressedClassSpaceSize()); assertEquals(0, qrStartConfig.jvm().heapSizeAsPercentageOfPhysicalMemory()); root.freezeModelTopology(); @@ -398,7 +398,7 @@ public class ContainerClusterTest { return cluster; } - private static ClusterInfoConfig getClusterInfoConfig(ContainerCluster cluster) { + private static ClusterInfoConfig getClusterInfoConfig(ContainerCluster<?> cluster) { ClusterInfoConfig.Builder builder = new ClusterInfoConfig.Builder(); cluster.getConfig(builder); return new ClusterInfoConfig(builder); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java index e0e4cbf19c0..92e0b116878 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java @@ -704,7 +704,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { public void secret_store_can_be_set_up() { Element clusterElem = DomBuilderTest.parse( "<container version='1.0'>", - " <secret-store>", + " <secret-store type='oath-ckms'>", " <group name='group1' environment='env1'/>", " </secret-store>", "</container>"); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java index afaea7c0200..ea76578ef04 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java @@ -1,7 +1,6 @@ // Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.content; -import com.yahoo.cloud.config.ZookeeperServerConfig; import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.model.deploy.TestProperties; @@ -46,11 +45,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -255,7 +251,7 @@ public class ContentClusterTest extends ContentBaseTest { List<String> sds = ApplicationPackageUtils.generateSchemas("type1", "type2"); VespaModel model = new VespaModelCreatorWithMockPkg(null, xml, sds).create(); assertEquals(2, model.getContentClusters().get("bar").getDocumentDefinitions().size()); - ContainerCluster cluster = model.getAdmin().getClusterControllers(); + ContainerCluster<?> cluster = model.getAdmin().getClusterControllers(); assertEquals(3, cluster.getContainers().size()); } @@ -305,7 +301,7 @@ public class ContentClusterTest extends ContentBaseTest { VespaModel model = createEnd2EndOneNode(new TestProperties()); assertEquals(1, model.getContentClusters().get("storage").getDocumentDefinitions().size()); - ContainerCluster cluster = model.getAdmin().getClusterControllers(); + ContainerCluster<?> cluster = model.getAdmin().getClusterControllers(); assertEquals(1, cluster.getContainers().size()); } @@ -399,8 +395,7 @@ public class ContentClusterTest extends ContentBaseTest { "</content>" ); fail("no exception thrown"); - } catch (Exception e) { - } + } catch (Exception e) { /* ignore */ } } @Test @@ -420,8 +415,7 @@ public class ContentClusterTest extends ContentBaseTest { "</content>" ); fail("no exception thrown"); - } catch (Exception e) { - } + } catch (Exception e) { /* ignore */ } } FleetcontrollerConfig getFleetControllerConfig(String xml) { @@ -1027,11 +1021,8 @@ public class ContentClusterTest extends ContentBaseTest { assertEquals(0.1, resolveMaxDeadBytesRatio(0.1), 1e-5); } - void assertZookeeperServerImplementation(boolean reconfigurable, String expectedClassName) { - VespaModel model = createEnd2EndOneNode( - new TestProperties() - .reconfigurableZookeeperServer(reconfigurable) - .setMultitenant(true)); + void assertZookeeperServerImplementation(String expectedClassName) { + VespaModel model = createEnd2EndOneNode(new TestProperties().setMultitenant(true)); ContentCluster cc = model.getContentClusters().get("storage"); for (ClusterControllerContainer c : cc.getClusterControllers().getContainers()) { @@ -1040,19 +1031,14 @@ public class ContentClusterTest extends ContentBaseTest { assertEquals(1, new ComponentsConfig(builder).components().stream() .filter(component -> component.classId().equals(expectedClassName)) .count()); - - var zBuilder = new ZookeeperServerConfig.Builder(); - c.getConfig(zBuilder); - assertEquals(reconfigurable, new ZookeeperServerConfig(zBuilder).dynamicReconfiguration()); } } @Test - public void reconfigurableZookeeperServerForClusterController() { - assertZookeeperServerImplementation(false, "com.yahoo.vespa.zookeeper.VespaZooKeeperServerImpl"); - assertZookeeperServerImplementation(true, "com.yahoo.vespa.zookeeper.ReconfigurableVespaZooKeeperServer"); - assertZookeeperServerImplementation(true, "com.yahoo.vespa.zookeeper.Reconfigurer"); - assertZookeeperServerImplementation(true, "com.yahoo.vespa.zookeeper.VespaZooKeeperAdminImpl"); + public void reconfigurableZookeeperServerComponentsForClusterController() { + assertZookeeperServerImplementation("com.yahoo.vespa.zookeeper.ReconfigurableVespaZooKeeperServer"); + assertZookeeperServerImplementation("com.yahoo.vespa.zookeeper.Reconfigurer"); + assertZookeeperServerImplementation("com.yahoo.vespa.zookeeper.VespaZooKeeperAdminImpl"); } private int resolveMaxInhibitedGroupsConfigWithFeatureFlag(int maxGroups) { diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentSearchClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentSearchClusterTest.java index 50495a211e2..5fd4885a1f2 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentSearchClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentSearchClusterTest.java @@ -117,13 +117,13 @@ public class ContentSearchClusterTest { @Test public void requireThatOnlyDiskLimitCanBeSet() throws Exception { - assertProtonResourceLimits(0.88, 0.8, + assertProtonResourceLimits(0.88, 0.9, new ContentClusterBuilder().protonDiskLimit(0.88).getXml()); } @Test public void requireThatOnlyMemoryLimitCanBeSet() throws Exception { - assertProtonResourceLimits(0.8, 0.77, + assertProtonResourceLimits(0.9, 0.77, new ContentClusterBuilder().protonMemoryLimit(0.77).getXml()); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java index 32b84d95cc8..b1bd44d93b4 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/FleetControllerClusterTest.java @@ -28,7 +28,7 @@ public class FleetControllerClusterTest { } private ClusterControllerConfig parse(String xml) { - return parse(xml, false); + return parse(xml, true); } @Test @@ -158,6 +158,6 @@ public class FleetControllerClusterTest { } private FleetcontrollerConfig getConfigForBasicCluster() { - return getConfigForBasicCluster(false); + return getConfigForBasicCluster(true); } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeResourcesTuningTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeResourcesTuningTest.java index b1a8cf07ead..00b4ce02411 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/NodeResourcesTuningTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/NodeResourcesTuningTest.java @@ -48,18 +48,17 @@ public class NodeResourcesTuningTest { .configid("some/config/id/" + sdMode.getFirst()) .mode(ProtonConfig.Documentdb.Mode.Enum.valueOf(sdMode.getSecond()))); } - return configFromMemorySetting(gb, builder, redundancy, searchableCopies); + return configFromMemorySetting(gb, builder); } private void verify_that_initial_numdocs_is_dependent_of_mode(int redundancy, int searchablecopies) { - int divisor = Math.max(redundancy, searchablecopies); ProtonConfig cfg = getProtonMemoryConfig(Arrays.asList(new Pair<>("a", "INDEX"), new Pair<>("b", "STREAMING"), new Pair<>("c", "STORE_ONLY")), 24 + reservedMemoryGb, redundancy, searchablecopies); assertEquals(3, cfg.documentdb().size()); assertEquals(1024, cfg.documentdb(0).allocation().initialnumdocs()); assertEquals("a", cfg.documentdb(0).inputdoctypename()); - assertEquals(24 * GB / 64 / divisor, cfg.documentdb(1).allocation().initialnumdocs()); + assertEquals(24 * GB / 46, cfg.documentdb(1).allocation().initialnumdocs()); assertEquals("b", cfg.documentdb(1).inputdoctypename()); - assertEquals(24 * GB / 64 / divisor, cfg.documentdb(2).allocation().initialnumdocs()); + assertEquals(24 * GB / 46, cfg.documentdb(2).allocation().initialnumdocs()); assertEquals("c", cfg.documentdb(2).inputdoctypename()); } @@ -210,9 +209,9 @@ public class NodeResourcesTuningTest { return getConfig(new FlavorsConfig.Flavor.Builder().minMainMemoryAvailableGb(memoryGb), combined); } - private static ProtonConfig configFromMemorySetting(double memoryGb, ProtonConfig.Builder builder, int redundancy, int searchableCopies) { + private static ProtonConfig configFromMemorySetting(double memoryGb, ProtonConfig.Builder builder) { return getConfig(new FlavorsConfig.Flavor.Builder() - .minMainMemoryAvailableGb(memoryGb), builder, redundancy, searchableCopies, false); + .minMainMemoryAvailableGb(memoryGb), builder, false); } private static ProtonConfig configFromNumCoresSetting(double numCores) { @@ -221,7 +220,7 @@ public class NodeResourcesTuningTest { private static ProtonConfig configFromNumCoresSetting(double numCores, int numThreadsPerSearch) { return getConfig(new FlavorsConfig.Flavor.Builder().minCpuCores(numCores), - new ProtonConfig.Builder(), 1, 1, numThreadsPerSearch, false); + new ProtonConfig.Builder(), numThreadsPerSearch, false); } private static ProtonConfig configFromEnvironmentType(boolean docker) { @@ -233,25 +232,17 @@ public class NodeResourcesTuningTest { return getConfig(flavorBuilder, new ProtonConfig.Builder(), combined); } - private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, - ProtonConfig.Builder protonBuilder, boolean combined) { - return getConfig(flavorBuilder, protonBuilder, 1, 1, combined); - } - - private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, ProtonConfig.Builder protonBuilder, - int redundancy, int searchableCopies, boolean combined) { + private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, ProtonConfig.Builder protonBuilder, boolean combined) { flavorBuilder.name("my_flavor"); - NodeResourcesTuning tuning = new NodeResourcesTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder)).resources(), - redundancy, searchableCopies, 1, combined); + NodeResourcesTuning tuning = new NodeResourcesTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder)).resources(), 1, combined); tuning.getConfig(protonBuilder); return new ProtonConfig(protonBuilder); } private static ProtonConfig getConfig(FlavorsConfig.Flavor.Builder flavorBuilder, ProtonConfig.Builder protonBuilder, - int redundancy, int searchableCopies, int numThreadsPerSearch, boolean combined) { + int numThreadsPerSearch, boolean combined) { flavorBuilder.name("my_flavor"); - NodeResourcesTuning tuning = new NodeResourcesTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder)).resources(), - redundancy, searchableCopies, numThreadsPerSearch, combined); + NodeResourcesTuning tuning = new NodeResourcesTuning(new Flavor(new FlavorsConfig.Flavor(flavorBuilder)).resources(), numThreadsPerSearch, combined); tuning.getConfig(protonBuilder); return new ProtonConfig(protonBuilder); } |