diff options
-rw-r--r-- | buildscripts/idl/idl/generator.py | 12 | ||||
-rw-r--r-- | src/mongo/idl/server_parameter.cpp | 25 | ||||
-rw-r--r-- | src/mongo/idl/server_parameter.h | 4 | ||||
-rw-r--r-- | src/mongo/idl/server_parameter_specialized_test.cpp | 2 |
4 files changed, 36 insertions, 7 deletions
diff --git a/buildscripts/idl/idl/generator.py b/buildscripts/idl/idl/generator.py index 927bde20d42..a0fd3272530 100644 --- a/buildscripts/idl/idl/generator.py +++ b/buildscripts/idl/idl/generator.py @@ -1947,13 +1947,11 @@ class _CppSourceFileWriter(_CppFileWriterBase): if not cls.override_set: with self._block('Status %s::set(const BSONElement& newValueElement) {' % (cls.name), '}'): - self._writer.write_line('std::string strval;') - with self._predicate('!newValueElement.coerce(&strval)'): - value = '' if param.redact else '" << newValueElement << " ' - self._writer.write_line( - 'return {ErrorCodes::BadValue, str::stream() << "Invalid value ' + value + - 'for setParameter \'" << name() << "\'"};') - self._writer.write_line('return setFromString(strval);') + self._writer.write_line('auto swValue = coerceToString(newValueElement, %s);' % + ('true' if param.redact else 'false')) + with self._predicate('!swValue.isOK()'): + self._writer.write_line('return swValue.getStatus();') + self._writer.write_line('return setFromString(swValue.getValue());') self.write_empty_line() def _gen_server_parameter_with_storage(self, param): diff --git a/src/mongo/idl/server_parameter.cpp b/src/mongo/idl/server_parameter.cpp index 5e0d3ef66fd..975f2b515e6 100644 --- a/src/mongo/idl/server_parameter.cpp +++ b/src/mongo/idl/server_parameter.cpp @@ -88,6 +88,31 @@ void ServerParameterSet::add(ServerParameter* sp) { x = sp; } +StatusWith<std::string> ServerParameter::coerceToString(const BSONElement& element, bool redact) { + switch (element.type()) { + case NumberDouble: + return std::to_string(element.Double()); + case String: + return element.String(); + case NumberInt: + return std::to_string(element.Int()); + case NumberLong: + return std::to_string(element.Long()); + case Date: + return dateToISOStringLocal(element.Date()); + default: + std::string diag; + if (redact) { + diag = "###"; + } else { + diag = element.toString(); + } + return {ErrorCodes::BadValue, + str::stream() << "Unsupported type " << typeName(element.type()) << " (value: '" + << diag << "') for setParameter: " << name()}; + } +} + IDLServerParameterDeprecatedAlias::IDLServerParameterDeprecatedAlias(StringData name, ServerParameter* sp) : ServerParameter(ServerParameterSet::getGlobal(), diff --git a/src/mongo/idl/server_parameter.h b/src/mongo/idl/server_parameter.h index f4f32265ce7..4fa5ba6b6f7 100644 --- a/src/mongo/idl/server_parameter.h +++ b/src/mongo/idl/server_parameter.h @@ -122,6 +122,10 @@ public: _testOnly = true; } +protected: + // Helper for translating setParameter values from BSON to string. + StatusWith<std::string> coerceToString(const BSONElement&, bool redact); + private: std::string _name; bool _allowedToChangeAtStartup; diff --git a/src/mongo/idl/server_parameter_specialized_test.cpp b/src/mongo/idl/server_parameter_specialized_test.cpp index 5587e29fad9..80a3d02b5a5 100644 --- a/src/mongo/idl/server_parameter_specialized_test.cpp +++ b/src/mongo/idl/server_parameter_specialized_test.cpp @@ -211,6 +211,8 @@ TEST(SpecializedServerParameter, withAtomicValue) { auto* wv = getServerParameter<cls>("specializedWithAtomicValue"); ASSERT_EQ(wv->_data.load(), cls::kDataDefault); ASSERT_APPENDED_INT(wv, cls::kDataDefault); + ASSERT_OK(wv->set(BSON("" << 99).firstElement())); + ASSERT_APPENDED_INT(wv, 99); ASSERT_OK(wv->setFromString("101")); ASSERT_APPENDED_INT(wv, 101); ASSERT_EQ(wv->_data.load(), 101); |