summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildscripts/idl/idl/generator.py46
-rw-r--r--src/mongo/db/server_parameters.cpp15
-rw-r--r--src/mongo/idl/server_parameter.cpp7
-rw-r--r--src/mongo/idl/server_parameter.h5
4 files changed, 43 insertions, 30 deletions
diff --git a/buildscripts/idl/idl/generator.py b/buildscripts/idl/idl/generator.py
index cf4bd7458b4..96b9c34bc67 100644
--- a/buildscripts/idl/idl/generator.py
+++ b/buildscripts/idl/idl/generator.py
@@ -1796,31 +1796,21 @@ class _CppSourceFileWriter(_CppFileWriterBase):
def _gen_server_parameter(self, param):
# type: (ast.ServerParameter) -> None
"""Generate a single IDLServerParameter(WithStorage)."""
- with self._condition(param.condition):
- if param.cpp_varname is not None:
- self._gen_server_parameter_with_storage(param)
- else:
- self._gen_server_parameter_without_storage(param)
-
- if param.condition:
- # Fallback in case any of the provided conditions are false.
- self._writer.write_line('return nullptr;')
+ if param.cpp_varname is not None:
+ self._gen_server_parameter_with_storage(param)
+ else:
+ self._gen_server_parameter_without_storage(param)
def _gen_server_parameter_deprecated_aliases(self, param_no, param):
# type: (int, ast.ServerParameter) -> None
"""Generate IDLServerParamterDeprecatedAlias instance."""
for alias_no, alias in enumerate(param.deprecated_name):
- with self.get_initializer_lambda('auto* scp_%d_%d' % (param_no, alias_no), unused=True,
- return_type='ServerParameter*'):
- with self._condition(param.condition):
- with self._predicate('scp_%d != nullptr' % (param_no)):
- self._writer.write_line(
- 'return new IDLServerParameterDeprecatedAlias(%s, scp_%d);' %
- (_encaps(alias), param_no))
-
- # Fallthrough in case any predicate above fails.
- self._writer.write_line('return nullptr;')
+ self._writer.write_line(
+ common.template_args(
+ '${unused} auto* ${alias_var} = new IDLServerParameterDeprecatedAlias(${name}, ${param_var});',
+ unused='MONGO_COMPILER_VARIABLE_UNUSED', alias_var='scp_%d_%d' %
+ (param_no, alias_no), name=_encaps(alias), param_var='scp_%d' % (param_no)))
def gen_server_parameters(self, params):
# type: (List[ast.ServerParameter]) -> None
@@ -1829,21 +1819,25 @@ class _CppSourceFileWriter(_CppFileWriterBase):
for param in params:
# Optional storage declarations.
if (param.cpp_vartype is not None) and (param.cpp_varname is not None):
- with self._condition(param.condition):
+ with self._condition(param.condition, preprocessor_only=True):
self._writer.write_line('%s %s;' % (param.cpp_vartype, param.cpp_varname))
- with self.gen_namespace_block(''):
+ blockname = 'idl_' + uuid.uuid4().hex
+ with self._block('MONGO_SERVER_PARAMETER_REGISTER(%s)(InitializerContext*) {' % (blockname),
+ '}'):
# ServerParameter instances.
for param_no, param in enumerate(params):
self.gen_description_comment(param.description)
+ with self._condition(param.condition):
+ with self.get_initializer_lambda('auto* scp_%d' % (param_no), unused=(len(
+ param.deprecated_name) == 0), return_type='ServerParameter*'):
+ self._gen_server_parameter(param)
- with self.get_initializer_lambda('auto* scp_%d' % (param_no), unused=(len(
- param.deprecated_name) == 0), return_type='ServerParameter*'):
- self._gen_server_parameter(param)
-
- self._gen_server_parameter_deprecated_aliases(param_no, param)
+ self._gen_server_parameter_deprecated_aliases(param_no, param)
self.write_empty_line()
+ self._writer.write_line('return Status::OK();')
+
def gen_config_option(self, opt, section):
# type: (ast.ConfigOption, unicode) -> None
"""Generate Config Option instance."""
diff --git a/src/mongo/db/server_parameters.cpp b/src/mongo/db/server_parameters.cpp
index f0856508769..91bb9bab1ba 100644
--- a/src/mongo/db/server_parameters.cpp
+++ b/src/mongo/db/server_parameters.cpp
@@ -88,8 +88,12 @@ void ServerParameterSet::add(ServerParameter* sp) {
namespace {
class DisabledTestParameter : public ServerParameter {
public:
- DisabledTestParameter(StringData name, bool startup, bool runtime)
- : ServerParameter(nullptr, name, startup, runtime) {
+ DisabledTestParameter() = delete;
+
+ DisabledTestParameter(ServerParameter* sp)
+ : ServerParameter(
+ nullptr, sp->name(), sp->allowedToChangeAtStartup(), sp->allowedToChangeAtRuntime()),
+ _sp(sp) {
setTestOnly();
}
@@ -104,6 +108,10 @@ public:
Status set(const BSONElement& newValueElement) final {
return setFromString("");
}
+
+private:
+ // Retain the original pointer to avoid ASAN complaining.
+ ServerParameter* _sp;
};
} // namespace
@@ -111,8 +119,7 @@ void ServerParameterSet::disableTestParameters() {
for (auto& spit : _map) {
auto*& sp = spit.second;
if (sp->isTestOnly()) {
- sp = new DisabledTestParameter(
- sp->name(), sp->allowedToChangeAtStartup(), sp->allowedToChangeAtRuntime());
+ sp = new DisabledTestParameter(sp);
}
}
}
diff --git a/src/mongo/idl/server_parameter.cpp b/src/mongo/idl/server_parameter.cpp
index e07b1dd6dac..01d72e42fc9 100644
--- a/src/mongo/idl/server_parameter.cpp
+++ b/src/mongo/idl/server_parameter.cpp
@@ -36,6 +36,13 @@
namespace mongo {
using SPT = ServerParameterType;
+MONGO_INITIALIZER_GROUP(BeginServerParameterRegistration,
+ MONGO_NO_PREREQUISITES,
+ ("EndServerParameterRegistration"))
+MONGO_INITIALIZER_GROUP(EndServerParameterRegistration,
+ ("BeginServerParameterRegistration"),
+ ("BeginStartupOptionHandling"))
+
IDLServerParameter::IDLServerParameter(StringData name, ServerParameterType paramType)
: ServerParameter(ServerParameterSet::getGlobal(),
name,
diff --git a/src/mongo/idl/server_parameter.h b/src/mongo/idl/server_parameter.h
index 28aef4921e6..a01da364dcb 100644
--- a/src/mongo/idl/server_parameter.h
+++ b/src/mongo/idl/server_parameter.h
@@ -38,11 +38,16 @@
#include <functional>
#include <string>
+#include "mongo/base/init.h"
#include "mongo/base/status.h"
#include "mongo/bson/bsonelement.h"
#include "mongo/bson/bsonobjbuilder.h"
#include "mongo/db/server_parameters.h"
+#define MONGO_SERVER_PARAMETER_REGISTER(name) \
+ MONGO_INITIALIZER_GENERAL( \
+ name, ("BeginServerParameterRegistration"), ("EndServerParameterRegistration"))
+
namespace mongo {
/**