diff options
-rw-r--r-- | buildscripts/idl/idl/generator.py | 46 | ||||
-rw-r--r-- | src/mongo/db/server_parameters.cpp | 15 | ||||
-rw-r--r-- | src/mongo/idl/server_parameter.cpp | 7 | ||||
-rw-r--r-- | src/mongo/idl/server_parameter.h | 5 |
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 { /** |