diff options
author | Arne H Juul <arnej27959@users.noreply.github.com> | 2021-11-16 14:29:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-16 14:29:00 +0100 |
commit | 625434397bb349ba02469afaa6e9af017f6c2d00 (patch) | |
tree | 1562eb1ae20ba5d95a370a3a6b37d2b4864d1b2b | |
parent | 4b155495f7d05176364ccfb86b12f2a7ac1f37cf (diff) | |
parent | feeaa3eda037278bb4f483e2000606cd12afc582 (diff) |
Merge pull request #20018 from vespa-engine/arnej/add-feature-flag-to-ignore-stack-sizes
ignore requested stack sizes
7 files changed, 28 insertions, 1 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 c5781c2805d..2232297d296 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 @@ -105,6 +105,7 @@ public interface ModelContext { @ModelFeatureFlag(owners = {"vekterli", "geirst"}) default boolean distributorEnhancedMaintenanceScheduling() { return false; } @ModelFeatureFlag(owners = {"arnej"}) default boolean forwardIssuesAsErrors() { return true; } @ModelFeatureFlag(owners = {"geirst", "vekterli"}) default boolean asyncApplyBucketDiff() { return false; } + @ModelFeatureFlag(owners = {"arnej"}) default boolean ignoreThreadStackSizes() { return false; } } /** Warning: As elsewhere in this package, do not make backwards incompatible changes that will break old config models! */ diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java index c86cda0bbd1..217f6cff778 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigSentinel.java @@ -19,6 +19,7 @@ public class ConfigSentinel extends AbstractService implements SentinelConfig.Pr private final ApplicationId applicationId; private final Zone zone; + private final boolean ignoreRequestedStackSizes; /** * Constructs a new ConfigSentinel for the given host. @@ -31,6 +32,7 @@ public class ConfigSentinel extends AbstractService implements SentinelConfig.Pr super(host, "sentinel"); this.applicationId = applicationId; this.zone = zone; + this.ignoreRequestedStackSizes = featureFlags.ignoreThreadStackSizes(); portsMeta.on(0).tag("rpc").tag("admin"); portsMeta.on(1).tag("telnet").tag("interactive").tag("http").tag("state"); setProp("clustertype", "hosts"); @@ -73,6 +75,7 @@ public class ConfigSentinel extends AbstractService implements SentinelConfig.Pr @Override public void getConfig(SentinelConfig.Builder builder) { builder.application(getApplicationConfig()); + builder.ignoreRequestedStackSizes(ignoreRequestedStackSizes); for (Service s : getHostResource().getServices()) { if (s.getStartupCommand() != null) { builder.service(getServiceConfig(s)); diff --git a/configd/src/apps/sentinel/manager.cpp b/configd/src/apps/sentinel/manager.cpp index 631f63febd5..ffa9c9281fa 100644 --- a/configd/src/apps/sentinel/manager.cpp +++ b/configd/src/apps/sentinel/manager.cpp @@ -79,6 +79,11 @@ Manager::doConfigure() LOG_ASSERT(_env.configOwner().hasConfig()); const SentinelConfig& config(_env.configOwner().getConfig()); + if (config.ignoreRequestedStackSizes) { + setenv("VESPA_IGNORE_REQUESTED_STACK_SIZES", "true", 1); + } else { + unsetenv("VESPA_IGNORE_REQUESTED_STACK_SIZES"); + } _env.rpcPort(config.port.rpc); _env.statePort(config.port.telnet); diff --git a/configdefinitions/src/vespa/sentinel.def b/configdefinitions/src/vespa/sentinel.def index cccf931938a..7bd4a000055 100644 --- a/configdefinitions/src/vespa/sentinel.def +++ b/configdefinitions/src/vespa/sentinel.def @@ -28,6 +28,9 @@ connectivity.minOkPercent int default=50 ## Absolute number of nodes with confirmed network connectivity problems, maximum connectivity.maxBadCount int default=1 +## Ask low-level thread creation to honor requested stack size +ignoreRequestedStackSizes bool default=false restart + ## The command to run. This will be run by sh -c, and the following ## environment variables are defined: $ROOT, $VESPA_SERVICE_NAME, ## $VESPA_CONFIG_ID 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 0b55c4bb53e..90c13364ac0 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 @@ -198,6 +198,7 @@ public class ModelContextImpl implements ModelContext { private final int maxUnCommittedMemory; private final boolean forwardIssuesAsErrors; private final boolean asyncApplyBucketDiff; + private final boolean ignoreThreadStackSizes; public FeatureFlags(FlagSource source, ApplicationId appId) { this.defaultTermwiseLimit = flagValue(source, appId, Flags.DEFAULT_TERM_WISE_LIMIT); @@ -234,6 +235,7 @@ public class ModelContextImpl implements ModelContext { this.maxUnCommittedMemory = flagValue(source, appId, Flags.MAX_UNCOMMITTED_MEMORY);; this.forwardIssuesAsErrors = flagValue(source, appId, PermanentFlags.FORWARD_ISSUES_AS_ERRORS); this.asyncApplyBucketDiff = flagValue(source, appId, Flags.ASYNC_APPLY_BUCKET_DIFF); + this.ignoreThreadStackSizes = flagValue(source, appId, Flags.IGNORE_THREAD_STACK_SIZES); } @Override public double defaultTermwiseLimit() { return defaultTermwiseLimit; } @@ -272,6 +274,7 @@ public class ModelContextImpl implements ModelContext { @Override public int maxUnCommittedMemory() { return maxUnCommittedMemory; } @Override public boolean forwardIssuesAsErrors() { return forwardIssuesAsErrors; } @Override public boolean asyncApplyBucketDiff() { return asyncApplyBucketDiff; } + @Override public boolean ignoreThreadStackSizes() { return ignoreThreadStackSizes; } private static <V> V flagValue(FlagSource source, ApplicationId appId, UnboundFlag<? extends V, ?, ?> flag) { return flag.bindTo(source) diff --git a/fastos/src/vespa/fastos/unix_thread.cpp b/fastos/src/vespa/fastos/unix_thread.cpp index d7a0ed879c0..a45d90426ef 100644 --- a/fastos/src/vespa/fastos/unix_thread.cpp +++ b/fastos/src/vespa/fastos/unix_thread.cpp @@ -71,7 +71,12 @@ bool FastOS_UNIX_Thread::Initialize (int stackSize, int stackGuardSize) #else adjusted_stack_size += PTHREAD_STACK_MIN; #endif - pthread_attr_setstacksize(&attr, adjusted_stack_size); + if (getenv("VESPA_IGNORE_REQUESTED_STACK_SIZES") == nullptr) { + //fprintf(stderr, "pthread_create: using adjusted stack size %zd\n", adjusted_stack_size); + pthread_attr_setstacksize(&attr, adjusted_stack_size); + } else { + //fprintf(stderr, "pthread_create: ignoring requested stack size %d\n", stackSize); + } rc = (0 == pthread_create(&_handle, &attr, FastOS_ThreadHook, this)); if (rc) 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 3cbdb9e1c56..74e0ab2c3d9 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -363,6 +363,13 @@ public class Flags { HOSTNAME, NODE_TYPE); + public static final UnboundBooleanFlag IGNORE_THREAD_STACK_SIZES = defineFeatureFlag( + "ignore-thread-stack-sizes", false, + List.of("arnej"), "2021-11-12", "2022-01-31", + "Whether C++ thread creation should ignore any requested stack size", + "Triggers restart, takes effect immediately", + ZONE_ID, APPLICATION_ID); + public static final UnboundBooleanFlag USE_FILE_DISTRIBUTION_CONNECTION_POOL = defineFeatureFlag( "use-file-distribution-connection-pool", false, List.of("hmusum"), "2021-11-16", "2021-12-16", |