summaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-10-15 11:32:57 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2019-10-15 11:50:41 +0200
commitba8c3172477d9558feeeb7a1f972fcea16d782af (patch)
tree8048964daee1fec2606375c281447ec9678c4574 /config-model
parenta087d4ab10da1f8a052b63ae32dc8e340f27bc77 (diff)
Set availableProcessors so that we control how many cores the jvm see.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java13
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java20
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java35
3 files changed, 67 insertions, 1 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java
index af9c452da11..e59baf88422 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainer.java
@@ -3,9 +3,11 @@ package com.yahoo.vespa.model.container;
import com.yahoo.config.model.api.container.ContainerServiceType;
import com.yahoo.config.model.producer.AbstractConfigProducer;
+import com.yahoo.config.provision.Flavor;
import com.yahoo.container.bundle.BundleInstantiationSpecification;
import com.yahoo.osgi.provider.model.ComponentModel;
import com.yahoo.prelude.fastsearch.FS4ResourcePool;
+import com.yahoo.search.config.QrStartConfig;
import com.yahoo.vespa.model.container.component.Component;
/**
@@ -13,7 +15,7 @@ import com.yahoo.vespa.model.container.component.Component;
*
* @author gjoranv
*/
-public final class ApplicationContainer extends Container {
+public final class ApplicationContainer extends Container implements QrStartConfig.Producer {
private static final String defaultHostedJVMArgs = "-XX:+UseOSErrorReporting -XX:+SuppressFatalErrorMessage";
@@ -36,6 +38,15 @@ public final class ApplicationContainer extends Container {
return new Component<>(new ComponentModel(spec));
}
+ @Override
+ public void getConfig(QrStartConfig.Builder builder) {
+ if (getHostResource() != null) {
+ if (getHostResource().getFlavor().isPresent()) {
+ NodeFlavorTuning flavorTuning = new NodeFlavorTuning(getHostResource().getFlavor().get());
+ flavorTuning.getConfig(builder);
+ }
+ }
+ }
@Override
protected ContainerServiceType myServiceType() {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java
new file mode 100644
index 00000000000..7ee57f0806c
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/NodeFlavorTuning.java
@@ -0,0 +1,20 @@
+package com.yahoo.vespa.model.container;
+
+import com.yahoo.config.provision.Flavor;
+import com.yahoo.search.config.QrStartConfig;
+
+/**
+ * Tuning of qr-start config for a container service based on the node flavor of that node.
+ *
+ * @author balder
+ */
+public class NodeFlavorTuning implements QrStartConfig.Producer {
+ private final Flavor flavor;
+ NodeFlavorTuning(Flavor flavor) {
+ this.flavor = flavor;
+ }
+ @Override
+ public void getConfig(QrStartConfig.Builder builder) {
+ builder.jvm.availableProcessors(Math.max(2, (int)Math.ceil(flavor.getMinCpuCores())));
+ }
+}
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 d2a9b8172b3..d0317938d50 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
@@ -11,10 +11,14 @@ import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.config.model.deploy.TestProperties;
import com.yahoo.config.model.producer.AbstractConfigProducerRoot;
import com.yahoo.config.model.provision.InMemoryProvisioner;
+import com.yahoo.config.model.provision.SingleNodeProvisioner;
import com.yahoo.config.model.test.MockApplicationPackage;
+import com.yahoo.config.model.test.MockRoot;
import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Zone;
+import com.yahoo.config.provisioning.FlavorsConfig;
import com.yahoo.container.ComponentsConfig;
import com.yahoo.container.QrConfig;
import com.yahoo.container.core.ChainsConfig;
@@ -714,6 +718,37 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase {
assertEquals("KMP_SETTING=1 KMP_AFFINITY=granularity=fine,verbose,compact,1,0 ", qrStartConfig.qrs().env());
}
+ private void verifyAvailableprocessors(boolean isHosted, Flavor flavor, int expectProcessors) throws IOException, SAXException {
+ DeployState deployState = new DeployState.Builder()
+ .modelHostProvisioner(flavor != null ? new SingleNodeProvisioner(flavor) : new SingleNodeProvisioner())
+ .properties(new TestProperties()
+ .setMultitenant(isHosted)
+ .setHostedVespa(isHosted))
+ .build();
+ MockRoot myRoot = new MockRoot("root", deployState);
+ Element clusterElem = DomBuilderTest.parse(
+ "<container version='1.0'>",
+ " <nodes>",
+ " <node hostalias='localhost'/>",
+ " </nodes>",
+ "</container>"
+ );
+
+ createModel(myRoot, clusterElem);
+ QrStartConfig.Builder qsB = new QrStartConfig.Builder();
+ myRoot.getConfig(qsB, "container/container.0");
+ QrStartConfig qsC= new QrStartConfig(qsB);
+ assertEquals(expectProcessors, qsC.jvm().availableProcessors());
+ }
+
+ @Test
+ public void requireThatAvailableProcessorsFollowFlavor() throws IOException, SAXException {
+ verifyAvailableprocessors(false, null,0);
+ verifyAvailableprocessors(true, null,0);
+ verifyAvailableprocessors(true, new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(9).build()), 9);
+ verifyAvailableprocessors(true, new Flavor(new FlavorsConfig.Flavor.Builder().name("test-flavor").minCpuCores(1).build()), 2);
+ }
+
@Test
public void requireThatProvidingTlsSecretOpensPort4443() {
Element clusterElem = DomBuilderTest.parse(