aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-09-22 20:16:44 +0200
committerGitHub <noreply@github.com>2020-09-22 20:16:44 +0200
commit93a0e07045008c8f47a68956e002a3f999b25565 (patch)
tree4a734ccea749642431e48e715293edb01a2d9c7b
parent0de94f433227daa0d2158c8b8cf834cf060edcdb (diff)
parent08b9abe47a4a2315a91d999d6ce3d4aceacd25ef (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ā€¦
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java2
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/TestProperties.java14
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/TransactionLogServer.java19
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/search/test/SearchNodeTest.java40
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java9
-rw-r--r--flags/src/main/java/com/yahoo/vespa/flags/Flags.java12
-rw-r--r--searchlib/src/vespa/searchlib/config/translogserver.def4
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