diff --git a/fdbbackup/backup.actor.cpp b/fdbbackup/backup.actor.cpp index 61a734ecb6..9d27e29c9f 100644 --- a/fdbbackup/backup.actor.cpp +++ b/fdbbackup/backup.actor.cpp @@ -3762,35 +3762,6 @@ int main(int argc, char* argv[]) { } } - IKnobCollection::setGlobalKnobCollection(IKnobCollection::Type::CLIENT, Randomize::False, IsSimulated::False); - auto& g_knobs = IKnobCollection::getMutableGlobalKnobCollection(); - for (const auto& [knobName, knobValueString] : knobs) { - try { - auto knobValue = g_knobs.parseKnobValue(knobName, knobValueString); - g_knobs.setKnob(knobName, knobValue); - } catch (Error& e) { - if (e.code() == error_code_invalid_option_value) { - fprintf(stderr, - "WARNING: Invalid value '%s' for knob option '%s'\n", - knobValueString.c_str(), - knobName.c_str()); - TraceEvent(SevWarnAlways, "InvalidKnobValue") - .detail("Knob", printable(knobName)) - .detail("Value", printable(knobValueString)); - } else { - fprintf(stderr, "ERROR: Failed to set knob option '%s': %s\n", knobName.c_str(), e.what()); - TraceEvent(SevError, "FailedToSetKnob") - .detail("Knob", printable(knobName)) - .detail("Value", printable(knobValueString)) - .error(e); - throw; - } - } - } - - // Reinitialize knobs in order to update knobs that are dependent on explicitly set knobs - g_knobs.initialize(Randomize::False, IsSimulated::False); - if (trace) { if (!traceLogGroup.empty()) setNetworkOption(FDBNetworkOptions::TRACE_LOG_GROUP, StringRef(traceLogGroup)); @@ -3831,6 +3802,34 @@ int main(int argc, char* argv[]) { return FDB_EXIT_ERROR; } + auto& g_knobs = IKnobCollection::getMutableGlobalKnobCollection(); + for (const auto& [knobName, knobValueString] : knobs) { + try { + auto knobValue = g_knobs.parseKnobValue(knobName, knobValueString); + g_knobs.setKnob(knobName, knobValue); + } catch (Error& e) { + if (e.code() == error_code_invalid_option_value) { + fprintf(stderr, + "WARNING: Invalid value '%s' for knob option '%s'\n", + knobValueString.c_str(), + knobName.c_str()); + TraceEvent(SevWarnAlways, "InvalidKnobValue") + .detail("Knob", printable(knobName)) + .detail("Value", printable(knobValueString)); + } else { + fprintf(stderr, "ERROR: Failed to set knob option '%s': %s\n", knobName.c_str(), e.what()); + TraceEvent(SevError, "FailedToSetKnob") + .detail("Knob", printable(knobName)) + .detail("Value", printable(knobValueString)) + .error(e); + throw; + } + } + } + + // Reinitialize knobs in order to update knobs that are dependent on explicitly set knobs + g_knobs.initialize(Randomize::False, IsSimulated::False); + TraceEvent("ProgramStart") .setMaxEventLength(12000) .detail("SourceVersion", getSourceVersion()) diff --git a/fdbcli/fdbcli.actor.cpp b/fdbcli/fdbcli.actor.cpp index 31ac1a4418..b5388de08c 100644 --- a/fdbcli/fdbcli.actor.cpp +++ b/fdbcli/fdbcli.actor.cpp @@ -1402,7 +1402,9 @@ struct CLIOptions { exit_code = FDB_EXIT_ERROR; return; } + } + void setupKnobs() { auto& g_knobs = IKnobCollection::getMutableGlobalKnobCollection(); for (const auto& [knobName, knobValueString] : knobs) { try { @@ -2432,8 +2434,6 @@ int main(int argc, char** argv) { registerCrashHandler(); - IKnobCollection::setGlobalKnobCollection(IKnobCollection::Type::CLIENT, Randomize::False, IsSimulated::False); - #ifdef __unixish__ struct sigaction act; @@ -2534,6 +2534,10 @@ int main(int argc, char** argv) { try { API->selectApiVersion(opt.api_version); API->setupNetwork(); + opt.setupKnobs(); + if (opt.exit_code != -1) { + return opt.exit_code; + } Future cliFuture = runCli(opt); Future timeoutFuture = opt.exit_timeout ? timeExit(opt.exit_timeout) : Never(); auto f = stopNetworkAfter(success(cliFuture) || timeoutFuture); @@ -2548,4 +2552,4 @@ int main(int argc, char** argv) { fprintf(stderr, "ERROR: %s (%d)\n", e.what(), e.code()); return 1; } -} \ No newline at end of file +} diff --git a/fdbclient/IKnobCollection.cpp b/fdbclient/IKnobCollection.cpp index a1821696bf..8748280784 100644 --- a/fdbclient/IKnobCollection.cpp +++ b/fdbclient/IKnobCollection.cpp @@ -83,6 +83,7 @@ std::unique_ptr& IKnobCollection::globalKnobCollection() { void IKnobCollection::setGlobalKnobCollection(Type type, Randomize randomize, IsSimulated isSimulated) { globalKnobCollection() = create(type, randomize, isSimulated); + ASSERT(FLOW_KNOBS == &bootstrapGlobalFlowKnobs); FLOW_KNOBS = &globalKnobCollection()->getFlowKnobs(); } diff --git a/fdbclient/NativeAPI.actor.cpp b/fdbclient/NativeAPI.actor.cpp index 6160da5d5f..d0696df817 100644 --- a/fdbclient/NativeAPI.actor.cpp +++ b/fdbclient/NativeAPI.actor.cpp @@ -1992,7 +1992,11 @@ void setNetworkOption(FDBNetworkOptions::Option option, Optional valu try { auto knobValue = IKnobCollection::parseKnobValue(knobName, knobValueString, IKnobCollection::Type::CLIENT); - IKnobCollection::getMutableGlobalKnobCollection().setKnob(knobName, knobValue); + if (g_network) { + IKnobCollection::getMutableGlobalKnobCollection().setKnob(knobName, knobValue); + } else { + networkOptions.knobs[knobName] = knobValue; + } } catch (Error& e) { TraceEvent(SevWarnAlways, "UnrecognizedKnob").detail("Knob", knobName.c_str()); fprintf(stderr, "FoundationDB client ignoring unrecognized knob option '%s'\n", knobName.c_str()); @@ -2138,6 +2142,13 @@ ACTOR Future monitorNetworkBusyness() { } } +static void setupGlobalKnobs() { + IKnobCollection::setGlobalKnobCollection(IKnobCollection::Type::CLIENT, Randomize::False, IsSimulated::False); + for (const auto& [knobName, knobValue] : networkOptions.knobs) { + IKnobCollection::getMutableGlobalKnobCollection().setKnob(knobName, knobValue); + } +} + // Setup g_network and start monitoring for network busyness void setupNetwork(uint64_t transportId, UseMetrics useMetrics) { if (g_network) @@ -2146,6 +2157,7 @@ void setupNetwork(uint64_t transportId, UseMetrics useMetrics) { if (!networkOptions.logClientInfo.present()) networkOptions.logClientInfo = true; + setupGlobalKnobs(); TLS::DisableOpenSSLAtExitHandler(); g_network = newNet2(tlsConfig, false, useMetrics || networkOptions.traceDirectory.present()); g_network->addStopCallback(Net2FileSystem::stop); diff --git a/fdbclient/NativeAPI.actor.h b/fdbclient/NativeAPI.actor.h index af5b2b7419..3cb2af417f 100644 --- a/fdbclient/NativeAPI.actor.h +++ b/fdbclient/NativeAPI.actor.h @@ -72,6 +72,7 @@ struct NetworkOptions { Optional logClientInfo; Reference>>> supportedVersions; bool runLoopProfilingEnabled; + std::map knobs; NetworkOptions(); };