summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSara Golemon <sara.golemon@mongodb.com>2019-07-02 15:37:23 +0000
committerSara Golemon <sara.golemon@mongodb.com>2019-07-08 23:59:33 +0000
commit96bb83d7fd650605413186a42a5de16289673d35 (patch)
tree18c31935b7a59e74b5174726a73c7e13b8558e5c
parent3ed19ce7c51a84999fa85ba5b644f4972e7037cb (diff)
downloadmongo-96bb83d7fd650605413186a42a5de16289673d35.tar.gz
SERVER-41903 Validate server parameter names during config validation
(cherry picked from commit f8cdf774a81b3af8825ac76eaebef1fd48183b5a)
-rw-r--r--jstests/noPassthrough/unknown-set-parameter.js36
-rw-r--r--src/mongo/db/server_options_helpers.cpp17
-rw-r--r--src/mongo/util/options_parser/options_parser_init.cpp10
3 files changed, 63 insertions, 0 deletions
diff --git a/jstests/noPassthrough/unknown-set-parameter.js b/jstests/noPassthrough/unknown-set-parameter.js
new file mode 100644
index 00000000000..1e72694e276
--- /dev/null
+++ b/jstests/noPassthrough/unknown-set-parameter.js
@@ -0,0 +1,36 @@
+// Verify error is produced when specifying an invalid set parameter.
+
+(function() {
+ 'use strict';
+
+ function tryRun(arg) {
+ // runMongoProgram helpfully makes certain that we pass a port when invoking mongod.
+ return runMongoProgram('./mongod', '--port', 0, '--setParameter', arg, '--outputConfig');
+ }
+
+ // Positive case, valid setparam.
+ clearRawMongoProgramOutput();
+ const valid = tryRun('enableTestCommands=1');
+ assert.eq(valid, 0);
+ const validOutput = rawMongoProgramOutput();
+ assert.gte(validOutput.search(/enableTestCommands: 1/), 0, validOutput);
+
+ // Negative case, invalid setparam.
+ clearRawMongoProgramOutput();
+ const foo = tryRun('foo=bar');
+ assert.neq(foo, 0);
+ const fooOutput = rawMongoProgramOutput();
+ assert.gte(fooOutput.search(/Unknown --setParameter 'foo'/), 0, fooOutput);
+
+ // Negative case, valid but unavailable setparam.
+ clearRawMongoProgramOutput();
+ const graph = tryRun('roleGraphInvalidationIsFatal=true');
+ assert.neq(graph, 0);
+ const graphOutput = rawMongoProgramOutput();
+ assert.gte(
+ graphOutput.search(
+ /--setParameter 'roleGraphInvalidationIsFatal' only available when used with 'enableTestCommands'/),
+ 0,
+ fooOutput);
+
+}());
diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp
index 4a9e1a3acef..379ba8154b8 100644
--- a/src/mongo/db/server_options_helpers.cpp
+++ b/src/mongo/db/server_options_helpers.cpp
@@ -46,6 +46,7 @@
#include "mongo/bson/util/builder.h"
#include "mongo/config.h"
#include "mongo/db/server_options.h"
+#include "mongo/idl/server_parameter.h"
#include "mongo/logger/log_component.h"
#include "mongo/logger/message_event_utf8_encoder.h"
#include "mongo/transport/message_compressor_registry.h"
@@ -150,6 +151,22 @@ Status validateBaseOptions(const moe::Environment& params) {
// Deregister test-only parameters.
ServerParameterSet::getGlobal()->disableTestParameters();
}
+
+ // Must come after registerAllFailPointsAsServerParameters() above.
+ const auto& spMap = ServerParameterSet::getGlobal()->getMap();
+ for (const auto setParam : parameters) {
+ const auto it = spMap.find(setParam.first);
+
+ if (it == spMap.end()) {
+ return {ErrorCodes::BadValue,
+ str::stream() << "Unknown --setParameter '" << setParam.first << "'"};
+ }
+ if (!enableTestCommandsValue && it->second->isTestOnly()) {
+ return {ErrorCodes::BadValue,
+ str::stream() << "--setParameter '" << setParam.first
+ << "' only available when used with 'enableTestCommands'"};
+ }
+ }
}
return Status::OK();
diff --git a/src/mongo/util/options_parser/options_parser_init.cpp b/src/mongo/util/options_parser/options_parser_init.cpp
index c484518ca3d..d6e20ffe045 100644
--- a/src/mongo/util/options_parser/options_parser_init.cpp
+++ b/src/mongo/util/options_parser/options_parser_init.cpp
@@ -40,6 +40,7 @@
namespace mongo {
namespace optionenvironment {
+namespace {
MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) {
OptionsParser parser;
@@ -50,6 +51,14 @@ MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) {
std::cerr << "try '" << context->args()[0] << " --help' for more information" << std::endl;
quickExit(EXIT_BADOPTIONS);
}
+
+ return Status::OK();
+}
+
+MONGO_INITIALIZER_GENERAL(OutputConfig,
+ ("EndStartupOptionValidation"),
+ ("BeginStartupOptionStorage"))
+(InitializerContext*) {
if (startupOptionsParsed.count("outputConfig")) {
bool output = false;
auto status = startupOptionsParsed.get(Key("outputConfig"), &output);
@@ -64,5 +73,6 @@ MONGO_STARTUP_OPTIONS_PARSE(StartupOptions)(InitializerContext* context) {
return Status::OK();
}
+} // namespace
} // namespace optionenvironment
} // namespace mongo