summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buildscripts/idl/idl/generator.py12
-rw-r--r--src/mongo/idl/server_parameter.cpp25
-rw-r--r--src/mongo/idl/server_parameter.h4
-rw-r--r--src/mongo/idl/server_parameter_specialized_test.cpp2
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);