diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-09-22 20:16:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-22 20:16:44 +0200 |
commit | 93a0e07045008c8f47a68956e002a3f999b25565 (patch) | |
tree | 4a734ccea749642431e48e715293edb01a2d9c7b | |
parent | 0de94f433227daa0d2158c8b8cf834cf060edcdb (diff) | |
parent | 08b9abe47a4a2315a91d999d6ce3d4aceacd25ef (diff) |
Merge pull request #14492 from vespa-engine/balder/tls-feature-flag-control
Add feature flag control over fsync and compression type in the backeā¦
8 files changed, 95 insertions, 7 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 e4c203fda6b..6a7a9ed16ae 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 @@ -84,6 +84,8 @@ public interface ModelContext { boolean skipCommunicationManagerThread(); boolean skipMbusRequestThread(); boolean skipMbusReplyThread(); + boolean tlsUseFSync(); + String tlsCompressionType(); double visibilityDelay(); boolean useContentNodeBtreeDb(); 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 d9cebd2b1d2..31c72e1be69 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 @@ -38,6 +38,8 @@ public class TestProperties implements ModelContext.Properties { private boolean useContentNodeBtreeDb = false; private boolean useThreePhaseUpdates = false; private boolean useDirectStorageApiRpc = false; + private boolean tlsUseFSync = false; + private String tlsCompressionType = "NONE"; private double defaultTermwiseLimit = 1.0; private double threadPoolSizeFactor = 0.0; private double queueSizeFactor = 0.0; @@ -85,6 +87,8 @@ public class TestProperties implements ModelContext.Properties { @Override public boolean skipMbusReplyThread() { return false; } @Override public Quota quota() { return quota; } @Override public double visibilityDelay() { return visibilityDelay; } + @Override public boolean tlsUseFSync() { return tlsUseFSync; } + @Override public String tlsCompressionType() { return tlsCompressionType; } public TestProperties setJvmGCOptions(String gcOptions) { jvmGCOptions = gcOptions; @@ -141,6 +145,16 @@ public class TestProperties implements ModelContext.Properties { return this; } + public TestProperties setTlsUseFSync(boolean useFSync) { + this.tlsUseFSync = useFSync; + return this; + } + + public TestProperties setTlsCompressionType(String type) { + this.tlsCompressionType = type; + return this; + } + public TestProperties setVisibilityDelay(double visibilityDelay) { this.visibilityDelay = visibilityDelay; return this; 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 50a6054d1b9..2198b6e278b 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 @@ -268,7 +268,7 @@ public class ContentSearchCluster extends AbstractConfigProducer implements Prot searchNode.setHostResource(node.getHostResource()); searchNode.initService(deployState.getDeployLogger()); - tls = new TransactionLogServer(searchNode, clusterName); + tls = new TransactionLogServer(searchNode, clusterName, deployState.getProperties()); tls.setHostResource(searchNode.getHostResource()); tls.initService(deployState.getDeployLogger()); } else { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java index 2c457940f24..347250176e5 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.search; +import com.yahoo.config.model.api.ModelContext; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.searchlib.TranslogserverConfig; import com.yahoo.config.model.producer.AbstractConfigProducer; @@ -15,12 +16,24 @@ import org.w3c.dom.Element; public class TransactionLogServer extends AbstractService { private static final long serialVersionUID = 1L; + private final boolean useFSync; + private final TranslogserverConfig.Compression.Type.Enum compressionType; - public TransactionLogServer(AbstractConfigProducer searchNode, String clusterName) { + private static TranslogserverConfig.Compression.Type.Enum convertCompressionType(String type) { + try { + return TranslogserverConfig.Compression.Type.Enum.valueOf(type); + } catch (Throwable t) { + return TranslogserverConfig.Compression.Type.NONE; + } + } + + public TransactionLogServer(AbstractConfigProducer searchNode, String clusterName, ModelContext.Properties featureFlags) { super(searchNode, "transactionlogserver"); portsMeta.on(0).tag("tls"); setProp("clustername", clusterName); setProp("clustertype", "search"); + useFSync = featureFlags.tlsUseFSync(); + compressionType = convertCompressionType(featureFlags.tlsCompressionType()); } public static class Builder extends VespaDomBuilder.DomConfigProducerBuilder<TransactionLogServer> { @@ -31,7 +44,7 @@ public class TransactionLogServer extends AbstractService { @Override protected TransactionLogServer doBuild(DeployState deployState, AbstractConfigProducer ancestor, Element producerSpec) { - return new TransactionLogServer(ancestor, clusterName); + return new TransactionLogServer(ancestor, clusterName, deployState.getProperties()); } } @@ -65,6 +78,8 @@ public class TransactionLogServer extends AbstractService { public void getConfig(TranslogserverConfig.Builder builder) { builder.listenport(getTlsPort()).basedir(getTlsDir()); + builder.usefsync(useFSync); + builder.compression.type(compressionType); } } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java index 9c69ba8f212..a04a4f196cf 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java @@ -1,8 +1,12 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.search.test; +import com.yahoo.config.model.api.ModelContext; +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.model.deploy.TestProperties; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.config.model.test.MockRoot; +import com.yahoo.searchlib.TranslogserverConfig; import com.yahoo.vespa.config.search.core.ProtonConfig; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.model.Host; @@ -36,7 +40,7 @@ public class SearchNodeTest { private void prepare(MockRoot root, SearchNode node) { Host host = new Host(root, "mockhost"); - TransactionLogServer tls = new TransactionLogServer(root, "mycluster"); + TransactionLogServer tls = new TransactionLogServer(root, "mycluster", root.getDeployState().getProperties()); tls.setHostResource(new HostResource(host)); tls.setBasePort(100); tls.initService(root.deployLogger()); @@ -52,6 +56,10 @@ public class SearchNodeTest { return SearchNode.create(parent, name, distributionKey, nodeSpec, "mycluster", null, flushOnShutDown, Optional.empty(), Optional.empty(), isHosted, combined); } + private static SearchNode createSearchNode(MockRoot root) { + return createSearchNode(root, "mynode", 3, new NodeSpec(7, 5), true, true, false); + } + @Test public void requireThatBasedirIsCorrectForElasticMode() { MockRoot root = new MockRoot(""); @@ -80,4 +88,34 @@ public class SearchNodeTest { CoreMatchers.containsString("vespa-proton-cmd " + node.getRpcPort() + " prepareRestart")); } + private MockRoot createRoot(ModelContext.Properties properties) { + return new MockRoot("", new DeployState.Builder().properties(properties).build()); + } + + private TranslogserverConfig getTlsConfig(ModelContext.Properties properties) { + MockRoot root = createRoot(properties); + SearchNode node = createSearchNode(root); + prepare(root, node); + TranslogserverConfig.Builder tlsBuilder = new TranslogserverConfig.Builder(); + node.getConfig(tlsBuilder); + return tlsBuilder.build(); + } + + @Test + public void requireThaFeatureFlagCanControlTlsUseFSync() { + assertFalse(getTlsConfig(new TestProperties()).usefsync()); + assertFalse(getTlsConfig(new TestProperties().setTlsUseFSync(false)).usefsync()); + assertTrue(getTlsConfig(new TestProperties().setTlsUseFSync(true)).usefsync()); + } + + @Test + public void requireThaFeatureFlagCanControlCompressionType() { + assertEquals(TranslogserverConfig.Compression.Type.NONE, getTlsConfig(new TestProperties()).compression().type()); + assertEquals(TranslogserverConfig.Compression.Type.NONE, getTlsConfig(new TestProperties().setTlsCompressionType("NONE")).compression().type()); + assertEquals(TranslogserverConfig.Compression.Type.NONE_MULTI, getTlsConfig(new TestProperties().setTlsCompressionType("NONE_MULTI")).compression().type()); + assertEquals(TranslogserverConfig.Compression.Type.ZSTD, getTlsConfig(new TestProperties().setTlsCompressionType("ZSTD")).compression().type()); + assertEquals(TranslogserverConfig.Compression.Type.LZ4, getTlsConfig(new TestProperties().setTlsCompressionType("LZ4")).compression().type()); + assertEquals(TranslogserverConfig.Compression.Type.NONE, getTlsConfig(new TestProperties().setTlsCompressionType("zstd")).compression().type()); + } + } 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 4ac20f6220f..2c6b30a2e6e 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 @@ -166,6 +166,8 @@ public class ModelContextImpl implements ModelContext { private final double feedCoreThreadPoolSizeFactor; private final double visibilityDelay; private final Quota quota; + private final boolean tlsUseFSync; + private final String tlsCompressionType; public Properties(ApplicationId applicationId, boolean multitenantFromConfig, @@ -207,6 +209,10 @@ public class ModelContextImpl implements ModelContext { .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); visibilityDelay = Flags.VISIBILITY_DELAY.bindTo(flagSource) .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); + tlsCompressionType = Flags.TLS_COMPRESSION_TYPE.bindTo(flagSource) + .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); + tlsUseFSync = Flags.TLS_USE_FSYNC.bindTo(flagSource) + .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); queueSizefactor = Flags.DEFAULT_QUEUE_SIZE_FACTOR.bindTo(flagSource) .with(FetchVector.Dimension.APPLICATION_ID, applicationId.serializedForm()).value(); jvmGCOPtions = Flags.JVM_GC_OPTIONS.bindTo(flagSource) @@ -317,7 +323,8 @@ public class ModelContextImpl implements ModelContext { @Override public boolean skipMbusReplyThread() { return skipMbusReplyThread; } @Override public double feedCoreThreadPoolSizeFactor() { return feedCoreThreadPoolSizeFactor; } @Override public double visibilityDelay() { return visibilityDelay; } - + @Override public boolean tlsUseFSync() { return tlsUseFSync; } + @Override public String tlsCompressionType() { return tlsCompressionType; } @Override public Quota quota() { return quota; } } diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index a6748667b7e..560ec2a271b 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -196,6 +196,18 @@ public class Flags { "Takes effect at redeployment", ZONE_ID, APPLICATION_ID); + public static final UnboundStringFlag TLS_COMPRESSION_TYPE = defineStringFlag( + "tls-compression-type", "NONE", + "Selects type of compression, valid values are NONE, NONE_MULTI, LZ4, ZSTD", + "Takes effect at redeployment", + ZONE_ID, APPLICATION_ID); + + public static final UnboundBooleanFlag TLS_USE_FSYNC = defineFeatureFlag( + "tls-use-fsync", false, + "Whether to use fsync when writing to the TLS.", + "Takes effect at redeployment", + ZONE_ID, APPLICATION_ID); + public static final UnboundDoubleFlag VISIBILITY_DELAY = defineDoubleFlag( "visibility-delay", 0.0, "Default visibility-delay", diff --git a/searchlib/src/vespa/searchlib/config/translogserver.def b/searchlib/src/vespa/searchlib/config/translogserver.def index 38741745773..540895b2404 100644 --- a/searchlib/src/vespa/searchlib/config/translogserver.def +++ b/searchlib/src/vespa/searchlib/config/translogserver.def @@ -24,12 +24,12 @@ maxthreads int default=4 restart crcmethod enum {ccitt_crc32, xxh64} default=xxh64 ## Control compression type. -compression.type enum {NONE, NONE_MULTI, LZ4, ZSTD} default=LZ4 +compression.type enum {NONE, NONE_MULTI, LZ4, ZSTD} default=NONE ## Control compression level ## LZ4 has normal range 1..9 while ZSTD has range 1..19 ## 9 is a reasonable default for both -compression.level int default=9 +compression.level int default=3 ## How large a chunk can grow in memory before beeing flushed chunk.sizelimit int default = 256000 # 256k |