summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/auth/authorization_manager_global.cpp10
-rw-r--r--src/mongo/db/auth/authorization_manager_impl.cpp17
-rw-r--r--src/mongo/db/change_stream_options_manager.cpp22
-rw-r--r--src/mongo/db/change_streams_cluster_parameter.cpp3
-rw-r--r--src/mongo/db/change_streams_cluster_parameter.h7
-rw-r--r--src/mongo/db/commands/feature_compatibility_version.cpp10
-rw-r--r--src/mongo/db/commands/get_cluster_parameter_invocation.cpp4
-rw-r--r--src/mongo/db/commands/parameters.cpp59
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation.cpp13
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation.h3
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp19
-rw-r--r--src/mongo/db/free_mon/free_mon_mongod.cpp2
-rw-r--r--src/mongo/db/free_mon/free_mon_mongod.h4
-rw-r--r--src/mongo/db/ftdc/ftdc_mongod.cpp3
-rw-r--r--src/mongo/db/ftdc/ftdc_mongod.h5
-rw-r--r--src/mongo/db/ftdc/ftdc_server.cpp14
-rw-r--r--src/mongo/db/global_settings.cpp15
-rw-r--r--src/mongo/db/initialize_server_global_state.cpp23
-rw-r--r--src/mongo/db/mirror_maestro.cpp13
-rw-r--r--src/mongo/db/process_health/fault_state_machine_test.cpp2
-rw-r--r--src/mongo/db/process_health/health_monitoring_server_parameters.cpp39
-rw-r--r--src/mongo/db/query/ce_mode_parameter.cpp2
-rw-r--r--src/mongo/db/query/ce_mode_parameter.h3
-rw-r--r--src/mongo/db/query/ce_mode_parameter_test.cpp10
-rw-r--r--src/mongo/db/query/framework_control.cpp9
-rw-r--r--src/mongo/db/query/sbe_plan_cache_on_parameter_change.cpp2
-rw-r--r--src/mongo/db/query/sbe_plan_cache_on_parameter_change.h2
-rw-r--r--src/mongo/db/repl/initial_syncer_test.cpp4
-rw-r--r--src/mongo/db/repl/replication_info.cpp2
-rw-r--r--src/mongo/db/s/config/configsvr_set_cluster_parameter_command.cpp8
-rw-r--r--src/mongo/db/s/transaction_coordinator_test_fixture.cpp2
-rw-r--r--src/mongo/db/server_options_helpers.cpp6
-rw-r--r--src/mongo/db/server_options_test.cpp9
-rw-r--r--src/mongo/db/server_parameter.cpp46
-rw-r--r--src/mongo/db/server_parameter.h46
-rw-r--r--src/mongo/db/server_parameter_with_storage.h75
-rw-r--r--src/mongo/db/storage/storage_engine_parameters.cpp10
-rw-r--r--src/mongo/db/storage/storage_options.cpp9
-rw-r--r--src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp24
-rw-r--r--src/mongo/db/traffic_recorder_validators.cpp2
-rw-r--r--src/mongo/db/traffic_recorder_validators.h4
41 files changed, 333 insertions, 229 deletions
diff --git a/src/mongo/db/auth/authorization_manager_global.cpp b/src/mongo/db/auth/authorization_manager_global.cpp
index b4655b8970e..2f5e5059a4c 100644
--- a/src/mongo/db/auth/authorization_manager_global.cpp
+++ b/src/mongo/db/auth/authorization_manager_global.cpp
@@ -89,15 +89,17 @@ ServiceContext::ConstructorActionRegisterer createAuthorizationManager(
} // namespace
void AuthzVersionParameter::append(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
int authzVersion;
uassertStatusOK(AuthorizationManager::get(opCtx->getServiceContext())
->getAuthorizationVersion(opCtx, &authzVersion));
- b.append(name, authzVersion);
+ b->append(name, authzVersion);
}
-Status AuthzVersionParameter::setFromString(const std::string& newValueString) {
+Status AuthzVersionParameter::setFromString(StringData newValueString,
+ const boost::optional<TenantId>&) {
return {ErrorCodes::InternalError, "set called on unsettable server parameter"};
}
diff --git a/src/mongo/db/auth/authorization_manager_impl.cpp b/src/mongo/db/auth/authorization_manager_impl.cpp
index cc86cf0fbc5..db1081b8bf3 100644
--- a/src/mongo/db/auth/authorization_manager_impl.cpp
+++ b/src/mongo/db/auth/authorization_manager_impl.cpp
@@ -168,9 +168,9 @@ public:
}
}
- Status setFromString(const std::string& str) {
+ Status setFromString(StringData str) {
std::vector<std::string> strList;
- str::splitStringDelim(str, &strList, ',');
+ str::splitStringDelim(str.toString(), &strList, ',');
std::vector<UserName> out;
for (const auto& nameStr : strList) {
@@ -355,16 +355,19 @@ void handleWaitForUserCacheInvalidation(OperationContext* opCtx, const UserHandl
int authorizationManagerCacheSize;
void AuthorizationManagerPinnedUsersServerParameter::append(OperationContext* opCtx,
- BSONObjBuilder& out,
- const std::string& name) {
- return authorizationManagerPinnedUsers.append(out, name);
+ BSONObjBuilder* out,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ return authorizationManagerPinnedUsers.append(*out, name.toString());
}
-Status AuthorizationManagerPinnedUsersServerParameter::set(const BSONElement& newValue) {
+Status AuthorizationManagerPinnedUsersServerParameter::set(const BSONElement& newValue,
+ const boost::optional<TenantId>&) {
return authorizationManagerPinnedUsers.set(newValue);
}
-Status AuthorizationManagerPinnedUsersServerParameter::setFromString(const std::string& str) {
+Status AuthorizationManagerPinnedUsersServerParameter::setFromString(
+ StringData str, const boost::optional<TenantId>&) {
return authorizationManagerPinnedUsers.setFromString(str);
}
diff --git a/src/mongo/db/change_stream_options_manager.cpp b/src/mongo/db/change_stream_options_manager.cpp
index 816ec7f53da..541b8486621 100644
--- a/src/mongo/db/change_stream_options_manager.cpp
+++ b/src/mongo/db/change_stream_options_manager.cpp
@@ -69,17 +69,19 @@ StatusWith<ChangeStreamOptions> ChangeStreamOptionsManager::setOptions(
}
void ChangeStreamOptionsParameter::append(OperationContext* opCtx,
- BSONObjBuilder& bob,
- const std::string& name) {
+ BSONObjBuilder* bob,
+ StringData name,
+ const boost::optional<TenantId>& tenantId) {
ChangeStreamOptionsManager& changeStreamOptionsManager =
ChangeStreamOptionsManager::get(getGlobalServiceContext());
- bob.append("_id"_sd, name);
- bob.appendElementsUnique(changeStreamOptionsManager.getOptions(opCtx).toBSON());
+ bob->append("_id"_sd, name);
+ bob->appendElementsUnique(changeStreamOptionsManager.getOptions(opCtx).toBSON());
}
-Status ChangeStreamOptionsParameter::set(const BSONElement& newValueElement) {
+Status ChangeStreamOptionsParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) {
try {
- Status validateStatus = validate(newValueElement);
+ Status validateStatus = validate(newValueElement, tenantId);
if (!validateStatus.isOK()) {
return validateStatus;
}
@@ -97,7 +99,8 @@ Status ChangeStreamOptionsParameter::set(const BSONElement& newValueElement) {
}
}
-Status ChangeStreamOptionsParameter::validate(const BSONElement& newValueElement) const {
+Status ChangeStreamOptionsParameter::validate(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) const {
try {
BSONObj changeStreamOptionsObj = newValueElement.Obj();
Status validateStatus = Status::OK();
@@ -144,7 +147,7 @@ Status ChangeStreamOptionsParameter::validate(const BSONElement& newValueElement
}
}
-Status ChangeStreamOptionsParameter::reset() {
+Status ChangeStreamOptionsParameter::reset(const boost::optional<TenantId>& tenantId) {
// Replace the current changeStreamOptions with a default-constructed one, which should
// automatically set preAndPostImages.expirationSeconds to 'off' by default.
ChangeStreamOptionsManager& changeStreamOptionsManager =
@@ -154,7 +157,8 @@ Status ChangeStreamOptionsParameter::reset() {
.getStatus();
}
-LogicalTime ChangeStreamOptionsParameter::getClusterParameterTime() const {
+LogicalTime ChangeStreamOptionsParameter::getClusterParameterTime(
+ const boost::optional<TenantId>& tenantId) const {
ChangeStreamOptionsManager& changeStreamOptionsManager =
ChangeStreamOptionsManager::get(getGlobalServiceContext());
return changeStreamOptionsManager.getClusterParameterTime();
diff --git a/src/mongo/db/change_streams_cluster_parameter.cpp b/src/mongo/db/change_streams_cluster_parameter.cpp
index 55df25d1e30..b4c798ccc1c 100644
--- a/src/mongo/db/change_streams_cluster_parameter.cpp
+++ b/src/mongo/db/change_streams_cluster_parameter.cpp
@@ -37,7 +37,8 @@
namespace mongo {
Status validateChangeStreamsClusterParameter(
- const ChangeStreamsClusterParameterStorage& clusterParameter) {
+ const ChangeStreamsClusterParameterStorage& clusterParameter,
+ const boost::optional<TenantId>& tenantId) {
if (clusterParameter.getExpireAfterSeconds() <= 0) {
return Status(ErrorCodes::BadValue,
"Expected a positive integer for 'expireAfterSeconds' field");
diff --git a/src/mongo/db/change_streams_cluster_parameter.h b/src/mongo/db/change_streams_cluster_parameter.h
index ebeedaa0e8b..ee1701a7b87 100644
--- a/src/mongo/db/change_streams_cluster_parameter.h
+++ b/src/mongo/db/change_streams_cluster_parameter.h
@@ -29,7 +29,11 @@
#pragma once
+#include <boost/optional.hpp>
+
#include "mongo/base/status.h"
+#include "mongo/db/tenant_id.h"
+
namespace mongo {
class ChangeStreamsClusterParameterStorage;
@@ -38,5 +42,6 @@ class ChangeStreamsClusterParameterStorage;
* Validates 'changeStreams' cluster-wide parameter.
*/
Status validateChangeStreamsClusterParameter(
- const ChangeStreamsClusterParameterStorage& clusterParameter);
+ const ChangeStreamsClusterParameterStorage& clusterParameter,
+ const boost::optional<TenantId>& tenantId);
} // namespace mongo
diff --git a/src/mongo/db/commands/feature_compatibility_version.cpp b/src/mongo/db/commands/feature_compatibility_version.cpp
index 3b8e8a4654d..dcd25bb23db 100644
--- a/src/mongo/db/commands/feature_compatibility_version.cpp
+++ b/src/mongo/db/commands/feature_compatibility_version.cpp
@@ -545,13 +545,14 @@ void FeatureCompatibilityVersion::clearLastFCVUpdateTimestamp() {
void FeatureCompatibilityVersionParameter::append(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
uassert(ErrorCodes::UnknownFeatureCompatibilityVersion,
str::stream() << name << " is not yet known.",
serverGlobalParams.featureCompatibility.isVersionInitialized());
- BSONObjBuilder featureCompatibilityVersionBuilder(b.subobjStart(name));
+ BSONObjBuilder featureCompatibilityVersionBuilder(b->subobjStart(name));
auto version = serverGlobalParams.featureCompatibility.getVersion();
FeatureCompatibilityVersionDocument fcvDoc = fcvTransitions.getFCVDocument(version);
featureCompatibilityVersionBuilder.appendElements(fcvDoc.toBSON().removeField("_id"));
@@ -582,7 +583,8 @@ void FeatureCompatibilityVersionParameter::append(OperationContext* opCtx,
}
}
-Status FeatureCompatibilityVersionParameter::setFromString(const std::string&) {
+Status FeatureCompatibilityVersionParameter::setFromString(StringData,
+ const boost::optional<TenantId>&) {
return {ErrorCodes::IllegalOperation,
str::stream() << name() << " cannot be set via setParameter. See "
<< feature_compatibility_version_documentation::kCompatibilityLink
diff --git a/src/mongo/db/commands/get_cluster_parameter_invocation.cpp b/src/mongo/db/commands/get_cluster_parameter_invocation.cpp
index fab07f4dca2..0624a103553 100644
--- a/src/mongo/db/commands/get_cluster_parameter_invocation.cpp
+++ b/src/mongo/db/commands/get_cluster_parameter_invocation.cpp
@@ -54,7 +54,7 @@ GetClusterParameterInvocation::retrieveRequestedParameters(OperationContext* opC
// Skip any disabled cluster parameters.
if (requestedParameter->isEnabled()) {
BSONObjBuilder bob;
- requestedParameter->append(opCtx, bob, requestedParameter->name());
+ requestedParameter->append(opCtx, &bob, requestedParameter->name(), boost::none);
parameterValues.push_back(bob.obj().getOwned());
parameterNames.push_back(requestedParameter->name());
}
@@ -182,7 +182,7 @@ GetClusterParameterInvocation::Reply GetClusterParameterInvocation::getDurablePa
for (const auto& defaultParameterName : defaultParameterNames) {
auto defaultParameter = clusterParameters->get(defaultParameterName);
BSONObjBuilder bob;
- defaultParameter->append(opCtx, bob, defaultParameterName);
+ defaultParameter->append(opCtx, &bob, defaultParameterName, boost::none);
retrievedParameters.push_back(bob.obj());
}
}
diff --git a/src/mongo/db/commands/parameters.cpp b/src/mongo/db/commands/parameters.cpp
index 834002ff9b6..997b910de8c 100644
--- a/src/mongo/db/commands/parameters.cpp
+++ b/src/mongo/db/commands/parameters.cpp
@@ -243,14 +243,14 @@ public:
if (all || cmdObj.hasElement(i->first.c_str())) {
if (options.getShowDetails()) {
BSONObjBuilder detailBob(result.subobjStart(i->second->name()));
- i->second->append(opCtx, detailBob, "value");
+ i->second->append(opCtx, &detailBob, "value", boost::none);
detailBob.appendBool("settableAtRuntime",
i->second->allowedToChangeAtRuntime());
detailBob.appendBool("settableAtStartup",
i->second->allowedToChangeAtStartup());
detailBob.doneFast();
} else {
- i->second->append(opCtx, result, i->second->name());
+ i->second->append(opCtx, &result, i->second->name(), boost::none);
}
}
}
@@ -367,7 +367,7 @@ public:
auto oldValueObj = ([&] {
BSONObjBuilder bb;
if (numSet == 0) {
- foundParameter->second->append(opCtx, bb, "was");
+ foundParameter->second->append(opCtx, &bb, "was", boost::none);
}
return bb.obj();
})();
@@ -378,7 +378,7 @@ public:
}
try {
- uassertStatusOK(foundParameter->second->set(parameter));
+ uassertStatusOK(foundParameter->second->set(parameter, boost::none));
} catch (const DBException& ex) {
LOGV2(20496,
"Error setting parameter {parameterName} to {newValue} errMsg: {error}",
@@ -426,16 +426,18 @@ public:
} cmdSet;
void LogLevelServerParameter::append(OperationContext*,
- BSONObjBuilder& builder,
- const std::string& name) {
- builder.append(name,
- logv2::LogManager::global()
- .getGlobalSettings()
- .getMinimumLogSeverity(mongo::logv2::LogComponent::kDefault)
- .toInt());
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ builder->append(name,
+ logv2::LogManager::global()
+ .getGlobalSettings()
+ .getMinimumLogSeverity(mongo::logv2::LogComponent::kDefault)
+ .toInt());
}
-Status LogLevelServerParameter::set(const BSONElement& newValueElement) {
+Status LogLevelServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
int newValue;
if (!newValueElement.coerce(&newValue) || newValue < 0)
return Status(ErrorCodes::BadValue,
@@ -447,7 +449,8 @@ Status LogLevelServerParameter::set(const BSONElement& newValueElement) {
return Status::OK();
}
-Status LogLevelServerParameter::setFromString(const std::string& strLevel) {
+Status LogLevelServerParameter::setFromString(StringData strLevel,
+ const boost::optional<TenantId>&) {
int newValue;
Status status = NumberParser{}(strLevel, &newValue);
if (!status.isOK())
@@ -463,14 +466,16 @@ Status LogLevelServerParameter::setFromString(const std::string& strLevel) {
}
void LogComponentVerbosityServerParameter::append(OperationContext*,
- BSONObjBuilder& builder,
- const std::string& name) {
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
BSONObj currentSettings;
getLogComponentVerbosity(&currentSettings);
- builder.append(name, currentSettings);
+ builder->append(name, currentSettings);
}
-Status LogComponentVerbosityServerParameter::set(const BSONElement& newValueElement) {
+Status LogComponentVerbosityServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
if (!newValueElement.isABSONObj()) {
return Status(ErrorCodes::TypeMismatch,
str::stream()
@@ -479,30 +484,34 @@ Status LogComponentVerbosityServerParameter::set(const BSONElement& newValueElem
return setLogComponentVerbosity(newValueElement.Obj());
}
-Status LogComponentVerbosityServerParameter::setFromString(const std::string& str) try {
+Status LogComponentVerbosityServerParameter::setFromString(StringData str,
+ const boost::optional<TenantId>&) try {
return setLogComponentVerbosity(fromjson(str));
} catch (const DBException& ex) {
return ex.toStatus();
}
void AutomationServiceDescriptorServerParameter::append(OperationContext*,
- BSONObjBuilder& builder,
- const std::string& name) {
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
const stdx::lock_guard<Latch> lock(autoServiceDescriptorMutex);
if (!autoServiceDescriptorValue.empty()) {
- builder.append(name, autoServiceDescriptorValue);
+ builder->append(name, autoServiceDescriptorValue);
}
}
-Status AutomationServiceDescriptorServerParameter::set(const BSONElement& newValueElement) {
+Status AutomationServiceDescriptorServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
if (newValueElement.type() != String) {
return {ErrorCodes::TypeMismatch,
"Value for parameter automationServiceDescriptor must be of type 'string'"};
}
- return setFromString(newValueElement.String());
+ return setFromString(newValueElement.String(), boost::none);
}
-Status AutomationServiceDescriptorServerParameter::setFromString(const std::string& str) {
+Status AutomationServiceDescriptorServerParameter::setFromString(StringData str,
+ const boost::optional<TenantId>&) {
auto kMaxSize = 64U;
if (str.size() > kMaxSize)
return {ErrorCodes::Overflow,
@@ -511,7 +520,7 @@ Status AutomationServiceDescriptorServerParameter::setFromString(const std::stri
{
const stdx::lock_guard<Latch> lock(autoServiceDescriptorMutex);
- autoServiceDescriptorValue = str;
+ autoServiceDescriptorValue = str.toString();
}
return Status::OK();
diff --git a/src/mongo/db/commands/set_cluster_parameter_invocation.cpp b/src/mongo/db/commands/set_cluster_parameter_invocation.cpp
index ed85f60fc76..4b04c491894 100644
--- a/src/mongo/db/commands/set_cluster_parameter_invocation.cpp
+++ b/src/mongo/db/commands/set_cluster_parameter_invocation.cpp
@@ -54,11 +54,11 @@ bool SetClusterParameterInvocation::invoke(OperationContext* opCtx,
StringData parameterName = cmdParamObj.firstElement().fieldName();
ServerParameter* serverParameter = _sps->get(parameterName);
- auto [query, update] =
- normalizeParameter(opCtx, cmdParamObj, paramTime, serverParameter, parameterName);
+ auto [query, update] = normalizeParameter(
+ opCtx, cmdParamObj, paramTime, serverParameter, parameterName, cmd.getDbName().tenantId());
BSONObjBuilder oldValueBob;
- serverParameter->append(opCtx, oldValueBob, parameterName.toString());
+ serverParameter->append(opCtx, &oldValueBob, parameterName.toString(), boost::none);
audit::logSetClusterParameter(opCtx->getClient(), oldValueBob.obj(), update);
LOGV2_DEBUG(
@@ -73,7 +73,8 @@ std::pair<BSONObj, BSONObj> SetClusterParameterInvocation::normalizeParameter(
BSONObj cmdParamObj,
const boost::optional<Timestamp>& paramTime,
ServerParameter* sp,
- StringData parameterName) {
+ StringData parameterName,
+ const boost::optional<TenantId>& tenantId) {
BSONElement commandElement = cmdParamObj.firstElement();
uassert(ErrorCodes::IllegalOperation,
"Cluster parameter value must be an object",
@@ -88,7 +89,7 @@ std::pair<BSONObj, BSONObj> SetClusterParameterInvocation::normalizeParameter(
BSONObj query = BSON("_id" << parameterName);
BSONObj update = updateBuilder.obj();
- uassertStatusOK(sp->validate(update));
+ uassertStatusOK(sp->validate(update, tenantId));
return {query, update};
}
@@ -115,7 +116,7 @@ StatusWith<bool> ClusterParameterDBClientService::updateParameterOnDisk(
try {
_dbClient.runCommand(
- NamespaceString::kConfigDb.toString(),
+ NamespaceString::makeClusterParametersNSS(tenantId).dbName().toStringWithTenantId(),
[&] {
write_ops::UpdateCommandRequest updateOp(
NamespaceString::makeClusterParametersNSS(tenantId));
diff --git a/src/mongo/db/commands/set_cluster_parameter_invocation.h b/src/mongo/db/commands/set_cluster_parameter_invocation.h
index f5bf46cb998..c712669a272 100644
--- a/src/mongo/db/commands/set_cluster_parameter_invocation.h
+++ b/src/mongo/db/commands/set_cluster_parameter_invocation.h
@@ -88,7 +88,8 @@ public:
BSONObj cmdParamObj,
const boost::optional<Timestamp>& paramTime,
ServerParameter* sp,
- StringData parameterName);
+ StringData parameterName,
+ const boost::optional<TenantId>& tenantId);
private:
std::unique_ptr<ServerParameterService> _sps;
diff --git a/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp b/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp
index 8209b0ee330..3e99e94cf96 100644
--- a/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp
+++ b/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp
@@ -70,21 +70,26 @@ public:
: ServerParameter(name, ServerParameterType::kRuntimeOnly) {
this->validateImpl = validateImpl;
}
- void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) {}
+ void append(OperationContext* opCtx,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {}
void appendSupportingRoundtrip(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {}
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {}
- Status set(const BSONElement& newValueElement) {
+ Status set(const BSONElement& newValueElement, const boost::optional<TenantId>& tenantId) {
return Status(ErrorCodes::BadValue, "Should not call set() in this test");
}
- Status setFromString(const std::string& str) {
- return Status(ErrorCodes::BadValue, "Should not call setFromString in this test");
+ Status setFromString(StringData str, const boost::optional<TenantId>& tenantId) {
+ return Status(ErrorCodes::BadValue, "Should not call setFromString() in this test");
}
- Status validate(const BSONElement& newValueElement) const {
+ Status validate(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) const {
return validateImpl(newValueElement);
}
diff --git a/src/mongo/db/free_mon/free_mon_mongod.cpp b/src/mongo/db/free_mon/free_mon_mongod.cpp
index 6e1bc93d77d..0d973c16197 100644
--- a/src/mongo/db/free_mon/free_mon_mongod.cpp
+++ b/src/mongo/db/free_mon/free_mon_mongod.cpp
@@ -248,7 +248,7 @@ private:
} // namespace
-Status onValidateFreeMonEndpointURL(StringData str) {
+Status onValidateFreeMonEndpointURL(StringData str, const boost::optional<TenantId>&) {
// Check for http, not https here because testEnabled may not be set yet
if (!str.startsWith("http"_sd) != 0) {
return Status(ErrorCodes::BadValue,
diff --git a/src/mongo/db/free_mon/free_mon_mongod.h b/src/mongo/db/free_mon/free_mon_mongod.h
index 0e0653e6ef7..a17647c4db4 100644
--- a/src/mongo/db/free_mon/free_mon_mongod.h
+++ b/src/mongo/db/free_mon/free_mon_mongod.h
@@ -29,10 +29,12 @@
#pragma once
+#include <boost/optional.hpp>
#include <string>
#include "mongo/db/op_observer/op_observer_registry.h"
#include "mongo/db/service_context.h"
+#include "mongo/db/tenant_id.h"
namespace mongo {
@@ -59,7 +61,7 @@ void notifyFreeMonitoringOnTransitionToPrimary();
*/
void setupFreeMonitoringOpObserver(OpObserverRegistry* registry);
-Status onValidateFreeMonEndpointURL(StringData str);
+Status onValidateFreeMonEndpointURL(StringData str, const boost::optional<TenantId>&);
} // namespace mongo
diff --git a/src/mongo/db/ftdc/ftdc_mongod.cpp b/src/mongo/db/ftdc/ftdc_mongod.cpp
index 49173f12a4d..8da45771f19 100644
--- a/src/mongo/db/ftdc/ftdc_mongod.cpp
+++ b/src/mongo/db/ftdc/ftdc_mongod.cpp
@@ -45,7 +45,8 @@
namespace mongo {
-Status validateCollectionStatsNamespaces(const std::vector<std::string> value) {
+Status validateCollectionStatsNamespaces(const std::vector<std::string> value,
+ const boost::optional<TenantId>& tenantId) {
try {
for (const auto& nsStr : value) {
NamespaceString ns(nsStr);
diff --git a/src/mongo/db/ftdc/ftdc_mongod.h b/src/mongo/db/ftdc/ftdc_mongod.h
index 698fac57f29..9108c39ee57 100644
--- a/src/mongo/db/ftdc/ftdc_mongod.h
+++ b/src/mongo/db/ftdc/ftdc_mongod.h
@@ -29,10 +29,12 @@
#pragma once
+#include <boost/optional.hpp>
#include <string>
#include <vector>
#include "mongo/base/status.h"
+#include "mongo/db/tenant_id.h"
namespace mongo {
@@ -50,6 +52,7 @@ void stopMongoDFTDC();
/**
* Validation callback for setParameter
*/
-Status validateCollectionStatsNamespaces(std::vector<std::string> value);
+Status validateCollectionStatsNamespaces(std::vector<std::string> value,
+ const boost::optional<TenantId>& tenantId);
} // namespace mongo
diff --git a/src/mongo/db/ftdc/ftdc_server.cpp b/src/mongo/db/ftdc/ftdc_server.cpp
index c6f1da3b17c..2c42daf45ef 100644
--- a/src/mongo/db/ftdc/ftdc_server.cpp
+++ b/src/mongo/db/ftdc/ftdc_server.cpp
@@ -73,24 +73,24 @@ synchronized_value<boost::filesystem::path> ftdcDirectoryPathParameter;
FTDCStartupParams ftdcStartupParams;
-void DiagnosticDataCollectionDirectoryPathServerParameter::append(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {
- b.append(name, ftdcDirectoryPathParameter->generic_string());
+void DiagnosticDataCollectionDirectoryPathServerParameter::append(
+ OperationContext* opCtx, BSONObjBuilder* b, StringData name, const boost::optional<TenantId>&) {
+ b->append(name, ftdcDirectoryPathParameter->generic_string());
}
-Status DiagnosticDataCollectionDirectoryPathServerParameter::setFromString(const std::string& str) {
+Status DiagnosticDataCollectionDirectoryPathServerParameter::setFromString(
+ StringData str, const boost::optional<TenantId>&) {
if (hasGlobalServiceContext()) {
FTDCController* controller = FTDCController::get(getGlobalServiceContext());
if (controller) {
- Status s = controller->setDirectory(str);
+ Status s = controller->setDirectory(str.toString());
if (!s.isOK()) {
return s;
}
}
}
- ftdcDirectoryPathParameter = str;
+ ftdcDirectoryPathParameter = str.toString();
return Status::OK();
}
diff --git a/src/mongo/db/global_settings.cpp b/src/mongo/db/global_settings.cpp
index 02508cbb5de..0d31094d87d 100644
--- a/src/mongo/db/global_settings.cpp
+++ b/src/mongo/db/global_settings.cpp
@@ -61,22 +61,24 @@ void ClusterNetworkRestrictionManager::set(
}
void AllowListedClusterNetworkSetting::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
auto allowlistedClusterNetwork =
std::atomic_load(&mongodGlobalParams.allowlistedClusterNetwork); // NOLINT
if (allowlistedClusterNetwork) {
- BSONArrayBuilder bb(b.subarrayStart(name));
+ BSONArrayBuilder bb(b->subarrayStart(name));
for (const auto& acn : *allowlistedClusterNetwork) {
bb << acn;
}
bb.doneFast();
} else {
- b << name << BSONNULL;
+ *b << name << BSONNULL;
}
}
-Status AllowListedClusterNetworkSetting::set(const mongo::BSONElement& e) {
+Status AllowListedClusterNetworkSetting::set(const mongo::BSONElement& e,
+ const boost::optional<TenantId>&) {
std::shared_ptr<std::vector<std::string>> allowlistedClusterNetwork;
if (e.isNull()) {
// noop
@@ -103,7 +105,8 @@ Status AllowListedClusterNetworkSetting::set(const mongo::BSONElement& e) {
return Status::OK();
}
-Status AllowListedClusterNetworkSetting::setFromString(const std::string& s) {
+Status AllowListedClusterNetworkSetting::setFromString(StringData s,
+ const boost::optional<TenantId>&) {
return {ErrorCodes::InternalError, "Cannot invoke this method"};
}
diff --git a/src/mongo/db/initialize_server_global_state.cpp b/src/mongo/db/initialize_server_global_state.cpp
index 240c2830fcb..02a30aac334 100644
--- a/src/mongo/db/initialize_server_global_state.cpp
+++ b/src/mongo/db/initialize_server_global_state.cpp
@@ -468,7 +468,8 @@ MONGO_INITIALIZER_GENERAL(MungeUmask, ("EndStartupOptionHandling"), ("ServerLogR
#endif
// --setParameter honorSystemUmask
-Status HonorSystemUMaskServerParameter::setFromString(const std::string& value) {
+Status HonorSystemUMaskServerParameter::setFromString(StringData value,
+ const boost::optional<TenantId>&) {
#ifndef _WIN32
if ((value == "0") || (value == "false")) {
// false may be specified with processUmask
@@ -494,15 +495,17 @@ Status HonorSystemUMaskServerParameter::setFromString(const std::string& value)
}
void HonorSystemUMaskServerParameter::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
#ifndef _WIN32
- b << name << honorSystemUmask;
+ *b << name << honorSystemUmask;
#endif
}
// --setParameter processUmask
-Status ProcessUMaskServerParameter::setFromString(const std::string& value) {
+Status ProcessUMaskServerParameter::setFromString(StringData value,
+ const boost::optional<TenantId>&) {
#ifndef _WIN32
if (honorSystemUmask) {
return {ErrorCodes::BadValue,
@@ -510,7 +513,8 @@ Status ProcessUMaskServerParameter::setFromString(const std::string& value) {
}
// Convert base from octal
- const char* val = value.c_str();
+ auto vstr = value.toString();
+ const char* val = vstr.c_str();
char* end = nullptr;
auto mask = std::strtoul(val, &end, 8);
@@ -532,10 +536,11 @@ Status ProcessUMaskServerParameter::setFromString(const std::string& value) {
}
void ProcessUMaskServerParameter::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
#ifndef _WIN32
- b << name << static_cast<int>(getUmaskOverride());
+ *b << name << static_cast<int>(getUmaskOverride());
#endif
}
diff --git a/src/mongo/db/mirror_maestro.cpp b/src/mongo/db/mirror_maestro.cpp
index e3bf69e9831..5be4cf1e0bc 100644
--- a/src/mongo/db/mirror_maestro.cpp
+++ b/src/mongo/db/mirror_maestro.cpp
@@ -249,13 +249,15 @@ auto parseMirroredReadsParameters(const BSONObj& obj) {
} // namespace
void MirroredReadsServerParameter::append(OperationContext*,
- BSONObjBuilder& bob,
- const std::string& name) {
- auto subBob = BSONObjBuilder(bob.subobjStart(name));
+ BSONObjBuilder* bob,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ auto subBob = BSONObjBuilder(bob->subobjStart(name));
_data->serialize(&subBob);
}
-Status MirroredReadsServerParameter::set(const BSONElement& value) try {
+Status MirroredReadsServerParameter::set(const BSONElement& value,
+ const boost::optional<TenantId>&) try {
auto obj = value.Obj();
_data = parseMirroredReadsParameters(obj);
@@ -265,7 +267,8 @@ Status MirroredReadsServerParameter::set(const BSONElement& value) try {
return e.toStatus();
}
-Status MirroredReadsServerParameter::setFromString(const std::string& str) try {
+Status MirroredReadsServerParameter::setFromString(StringData str,
+ const boost::optional<TenantId>&) try {
auto obj = fromjson(str);
_data = parseMirroredReadsParameters(obj);
diff --git a/src/mongo/db/process_health/fault_state_machine_test.cpp b/src/mongo/db/process_health/fault_state_machine_test.cpp
index 065ac057136..b25a357b34d 100644
--- a/src/mongo/db/process_health/fault_state_machine_test.cpp
+++ b/src/mongo/db/process_health/fault_state_machine_test.cpp
@@ -376,7 +376,7 @@ TEST_F(FaultManagerTest, DNSHealthCheckWithBadHostNameFailsAndGoodHostNameSucces
<< "interval" << 1000)));
const BSONObj newParameterObj = BSON("key" << bsonOBj);
auto element = newParameterObj.getField("key");
- uassertStatusOK(serverParam->set(element));
+ uassertStatusOK(serverParam->set(element, boost::none));
registerHealthObserver<DnsHealthObserver>();
globalFailPointRegistry()
diff --git a/src/mongo/db/process_health/health_monitoring_server_parameters.cpp b/src/mongo/db/process_health/health_monitoring_server_parameters.cpp
index 1f1c0a90d11..57c41b475ca 100644
--- a/src/mongo/db/process_health/health_monitoring_server_parameters.cpp
+++ b/src/mongo/db/process_health/health_monitoring_server_parameters.cpp
@@ -69,7 +69,8 @@ ConfigValues mergeConfigValues(const ConfigValues& oldValues, const ConfigValues
}
} // namespace
-Status HealthMonitoringIntensitiesServerParameter::setFromString(const std::string& value) {
+Status HealthMonitoringIntensitiesServerParameter::setFromString(StringData value,
+ const boost::optional<TenantId>&) {
const auto oldValue = **_data;
auto newValue = HealthObserverIntensities::parse(
IDLParserContext("health monitoring intensities"), fromjson(value));
@@ -79,7 +80,8 @@ Status HealthMonitoringIntensitiesServerParameter::setFromString(const std::stri
return Status::OK();
}
-Status HealthMonitoringIntensitiesServerParameter::set(const BSONElement& newValueElement) {
+Status HealthMonitoringIntensitiesServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
const auto oldValue = **_data;
auto newValue = HealthObserverIntensities::parse(
IDLParserContext("health monitoring intensities"), newValueElement.Obj());
@@ -90,34 +92,39 @@ Status HealthMonitoringIntensitiesServerParameter::set(const BSONElement& newVal
}
void HealthMonitoringIntensitiesServerParameter::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
BSONObjBuilder healthMonitoring;
_data->serialize(&healthMonitoring);
- b.append(name, healthMonitoring.obj());
+ b->append(name, healthMonitoring.obj());
}
-Status HealthMonitoringProgressMonitorServerParameter::setFromString(const std::string& value) {
+Status HealthMonitoringProgressMonitorServerParameter::setFromString(
+ StringData value, const boost::optional<TenantId>&) {
*_data = HealthObserverProgressMonitorConfig::parse(
IDLParserContext("health monitoring liveness"), fromjson(value));
return Status::OK();
}
-Status HealthMonitoringProgressMonitorServerParameter::set(const BSONElement& newValueElement) {
+Status HealthMonitoringProgressMonitorServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
*_data = HealthObserverProgressMonitorConfig::parse(
IDLParserContext("health monitoring liveness"), newValueElement.Obj());
return Status::OK();
}
void HealthMonitoringProgressMonitorServerParameter::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
BSONObjBuilder healthMonitoring;
_data->serialize(&healthMonitoring);
- b.append(name, healthMonitoring.obj());
+ b->append(name, healthMonitoring.obj());
}
-Status PeriodicHealthCheckIntervalsServerParameter::setFromString(const std::string& value) {
+Status PeriodicHealthCheckIntervalsServerParameter::setFromString(
+ StringData value, const boost::optional<TenantId>&) {
const auto oldValue = **_data;
auto newValue = HealthObserverIntervals::parse(IDLParserContext("health monitoring interval"),
fromjson(value));
@@ -126,7 +133,8 @@ Status PeriodicHealthCheckIntervalsServerParameter::setFromString(const std::str
return Status::OK();
}
-Status PeriodicHealthCheckIntervalsServerParameter::set(const BSONElement& newValueElement) {
+Status PeriodicHealthCheckIntervalsServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>&) {
const auto oldValue = **_data;
auto newValue = HealthObserverIntervals::parse(IDLParserContext("health monitoring interval"),
newValueElement.Obj());
@@ -136,11 +144,12 @@ Status PeriodicHealthCheckIntervalsServerParameter::set(const BSONElement& newVa
}
void PeriodicHealthCheckIntervalsServerParameter::append(OperationContext*,
- BSONObjBuilder& b,
- const std::string& name) {
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
BSONObjBuilder healthMonitoring;
_data->serialize(&healthMonitoring);
- b.append(name, healthMonitoring.obj());
+ b->append(name, healthMonitoring.obj());
}
} // namespace mongo
diff --git a/src/mongo/db/query/ce_mode_parameter.cpp b/src/mongo/db/query/ce_mode_parameter.cpp
index 8c019d25746..2099c65ab1d 100644
--- a/src/mongo/db/query/ce_mode_parameter.cpp
+++ b/src/mongo/db/query/ce_mode_parameter.cpp
@@ -31,7 +31,7 @@
#include "mongo/db/query/query_knobs_gen.h"
namespace mongo::ce {
-Status validateCEMode(const std::string& value) {
+Status validateCEMode(const std::string& value, const boost::optional<TenantId>&) {
if (value == kHeuristic || value == kHistogram || value == kSampling) {
return Status::OK();
}
diff --git a/src/mongo/db/query/ce_mode_parameter.h b/src/mongo/db/query/ce_mode_parameter.h
index b267067747f..e103b82e927 100644
--- a/src/mongo/db/query/ce_mode_parameter.h
+++ b/src/mongo/db/query/ce_mode_parameter.h
@@ -32,6 +32,7 @@
#include <string>
#include "mongo/base/status.h"
+#include "mongo/db/tenant_id.h"
namespace mongo::ce {
@@ -42,6 +43,6 @@ const std::string kHeuristic = "heuristic";
const std::string kHistogram = "histogram";
const std::string kSampling = "sampling";
-Status validateCEMode(const std::string& value);
+Status validateCEMode(const std::string& value, const boost::optional<TenantId>&);
} // namespace mongo::ce
diff --git a/src/mongo/db/query/ce_mode_parameter_test.cpp b/src/mongo/db/query/ce_mode_parameter_test.cpp
index 66e4b23bc38..9769127e5b3 100644
--- a/src/mongo/db/query/ce_mode_parameter_test.cpp
+++ b/src/mongo/db/query/ce_mode_parameter_test.cpp
@@ -34,14 +34,14 @@
namespace mongo::ce {
TEST(CEModeParameterTest, ValidatesValidCEModes) {
- ASSERT_OK(validateCEMode("heuristic"));
- ASSERT_OK(validateCEMode("histogram"));
- ASSERT_OK(validateCEMode("sampling"));
+ ASSERT_OK(validateCEMode("heuristic", boost::none));
+ ASSERT_OK(validateCEMode("histogram", boost::none));
+ ASSERT_OK(validateCEMode("sampling", boost::none));
}
TEST(CEModeParameterTest, RejectsInvalidCEModes) {
- ASSERT_NOT_OK(validateCEMode("notamode"));
- ASSERT_NOT_OK(validateCEMode(""));
+ ASSERT_NOT_OK(validateCEMode("notamode", boost::none));
+ ASSERT_NOT_OK(validateCEMode("", boost::none));
}
} // namespace mongo::ce
diff --git a/src/mongo/db/query/framework_control.cpp b/src/mongo/db/query/framework_control.cpp
index cd35264a9b3..0a2f35dfb7f 100644
--- a/src/mongo/db/query/framework_control.cpp
+++ b/src/mongo/db/query/framework_control.cpp
@@ -33,11 +33,14 @@
namespace mongo {
-void QueryFrameworkControl::append(OperationContext*, BSONObjBuilder& b, const std::string& name) {
- b << name << QueryFrameworkControl_serializer(_data.get());
+void QueryFrameworkControl::append(OperationContext*,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ *b << name << QueryFrameworkControl_serializer(_data.get());
}
-Status QueryFrameworkControl::setFromString(const std::string& value) {
+Status QueryFrameworkControl::setFromString(StringData value, const boost::optional<TenantId>&) {
_data = QueryFrameworkControl_parse(IDLParserContext("internalQueryFrameworkControl"), value);
return Status::OK();
}
diff --git a/src/mongo/db/query/sbe_plan_cache_on_parameter_change.cpp b/src/mongo/db/query/sbe_plan_cache_on_parameter_change.cpp
index 399d5210128..b7ea17858d8 100644
--- a/src/mongo/db/query/sbe_plan_cache_on_parameter_change.cpp
+++ b/src/mongo/db/query/sbe_plan_cache_on_parameter_change.cpp
@@ -72,7 +72,7 @@ Status onPlanCacheSizeUpdate(const std::string& str) {
return Status::OK();
}
-Status validatePlanCacheSize(const std::string& str) {
+Status validatePlanCacheSize(const std::string& str, const boost::optional<TenantId>&) {
return PlanCacheSizeParameter::parse(str).getStatus();
}
diff --git a/src/mongo/db/query/sbe_plan_cache_on_parameter_change.h b/src/mongo/db/query/sbe_plan_cache_on_parameter_change.h
index e126dda9f48..fd7f090d766 100644
--- a/src/mongo/db/query/sbe_plan_cache_on_parameter_change.h
+++ b/src/mongo/db/query/sbe_plan_cache_on_parameter_change.h
@@ -45,7 +45,7 @@ Status onPlanCacheSizeUpdate(const std::string& str);
/**
* Callback called on validation of planCacheSize parameter.
*/
-Status validatePlanCacheSize(const std::string& str);
+Status validatePlanCacheSize(const std::string& str, const boost::optional<TenantId>&);
/**
* Clears the SBE plan cache. Used to implement 'clearSbeCacheOnParameterChange()' below.
diff --git a/src/mongo/db/repl/initial_syncer_test.cpp b/src/mongo/db/repl/initial_syncer_test.cpp
index 4936d713489..7bc8da73f7a 100644
--- a/src/mongo/db/repl/initial_syncer_test.cpp
+++ b/src/mongo/db/repl/initial_syncer_test.cpp
@@ -4401,7 +4401,7 @@ TEST_F(InitialSyncerTest, TestRemainingInitialSyncEstimatedMillisMetric) {
auto opCtx = makeOpCtx();
ASSERT_OK(ServerParameterSet::getNodeParameterSet()
->get("collectionClonerBatchSize")
- ->setFromString("1"));
+ ->setFromString("1", boost::none));
_syncSourceSelector->setChooseNewSyncSourceResult_forTest(HostAndPort("localhost", 27017));
@@ -4561,7 +4561,7 @@ TEST_F(InitialSyncerTest, GetInitialSyncProgressReturnsCorrectProgress) {
auto opCtx = makeOpCtx();
ASSERT_OK(ServerParameterSet::getNodeParameterSet()
->get("collectionClonerBatchSize")
- ->setFromString("1"));
+ ->setFromString("1", boost::none));
_syncSourceSelector->setChooseNewSyncSourceResult_forTest(HostAndPort("localhost", 27017));
ASSERT_OK(initialSyncer->startup(opCtx.get(), 2U));
diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp
index 868aa7691af..3cd9fa9c591 100644
--- a/src/mongo/db/repl/replication_info.cpp
+++ b/src/mongo/db/repl/replication_info.cpp
@@ -498,7 +498,7 @@ public:
if (auto param = ServerParameterSet::getNodeParameterSet()->getIfExists(
kAutomationServiceDescriptorFieldName)) {
- param->append(opCtx, result, kAutomationServiceDescriptorFieldName);
+ param->append(opCtx, &result, kAutomationServiceDescriptorFieldName, boost::none);
}
if (opCtx->getClient()->session()) {
diff --git a/src/mongo/db/s/config/configsvr_set_cluster_parameter_command.cpp b/src/mongo/db/s/config/configsvr_set_cluster_parameter_command.cpp
index 119eb61f4d0..19c8d947118 100644
--- a/src/mongo/db/s/config/configsvr_set_cluster_parameter_command.cpp
+++ b/src/mongo/db/s/config/configsvr_set_cluster_parameter_command.cpp
@@ -72,8 +72,12 @@ public:
SetClusterParameterInvocation invocation{std::move(sps), dbService};
- invocation.normalizeParameter(
- opCtx, cmdParamObj, boost::none, serverParameter, parameterName);
+ invocation.normalizeParameter(opCtx,
+ cmdParamObj,
+ boost::none,
+ serverParameter,
+ parameterName,
+ request().getDbName().tenantId());
SetClusterParameterCoordinatorDocument coordinatorDoc;
coordinatorDoc.setConfigsvrCoordinatorMetadata(
diff --git a/src/mongo/db/s/transaction_coordinator_test_fixture.cpp b/src/mongo/db/s/transaction_coordinator_test_fixture.cpp
index 7ccb3b5c439..a6aa349d58e 100644
--- a/src/mongo/db/s/transaction_coordinator_test_fixture.cpp
+++ b/src/mongo/db/s/transaction_coordinator_test_fixture.cpp
@@ -59,7 +59,7 @@ void TransactionCoordinatorTestFixture::setUp() {
ASSERT_OK(ServerParameterSet::getNodeParameterSet()
->get("logComponentVerbosity")
- ->setFromString("{transaction: {verbosity: 3}}"));
+ ->setFromString("{transaction: {verbosity: 3}}", boost::none));
for (const auto& shardId : kThreeShardIdList) {
auto shardTargeter = RemoteCommandTargeterMock::get(
diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp
index 677e279c9e7..29fd58cca46 100644
--- a/src/mongo/db/server_options_helpers.cpp
+++ b/src/mongo/db/server_options_helpers.cpp
@@ -271,12 +271,12 @@ StatusWith<BSONObj> applySetParameterOptions(const std::map<std::string, std::st
return Status(ErrorCodes::BadValue,
"Cannot use --setParameter to set \"{}\" at startup"_format(name));
BSONObjBuilder sub(summaryBuilder.subobjStart(name));
- sp->append(nullptr, sub, "default");
- Status status = sp->setFromString(value);
+ sp->append(nullptr, &sub, "default", boost::none);
+ Status status = sp->setFromString(value, boost::none);
if (!status.isOK())
return Status(ErrorCodes::BadValue,
"Bad value for parameter \"{}\": {}"_format(name, status.reason()));
- sp->append(nullptr, sub, "value");
+ sp->append(nullptr, &sub, "value", boost::none);
}
return summaryBuilder.obj();
}
diff --git a/src/mongo/db/server_options_test.cpp b/src/mongo/db/server_options_test.cpp
index f3d5c11c7a3..08f47e74ce8 100644
--- a/src/mongo/db/server_options_test.cpp
+++ b/src/mongo/db/server_options_test.cpp
@@ -867,11 +867,14 @@ public:
TestServerParameter(StringData name, ServerParameterType spt, int x)
: ServerParameter(name, spt), val{x} {}
- void append(OperationContext*, BSONObjBuilder& bob, const std::string& name) final {
- bob.append(name, val);
+ void append(OperationContext*,
+ BSONObjBuilder* bob,
+ StringData name,
+ const boost::optional<TenantId>&) final {
+ bob->append(name, val);
}
- Status setFromString(const std::string& str) final {
+ Status setFromString(StringData str, const boost::optional<TenantId>&) final {
int value;
Status status = NumberParser{}(str, &value);
if (!status.isOK())
diff --git a/src/mongo/db/server_parameter.cpp b/src/mongo/db/server_parameter.cpp
index 553eb6d199f..9e70ab3aac1 100644
--- a/src/mongo/db/server_parameter.cpp
+++ b/src/mongo/db/server_parameter.cpp
@@ -49,8 +49,9 @@ MONGO_INITIALIZER_GROUP(EndServerParameterRegistration,
ServerParameter::ServerParameter(StringData name, ServerParameterType spt)
: _name{name}, _type(spt) {}
-Status ServerParameter::set(const BSONElement& newValueElement) {
- auto validateStatus = validate(newValueElement);
+Status ServerParameter::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) {
+ auto validateStatus = validate(newValueElement, tenantId);
if (!validateStatus.isOK()) {
return validateStatus;
}
@@ -58,7 +59,7 @@ Status ServerParameter::set(const BSONElement& newValueElement) {
auto swValue = _coerceToString(newValueElement);
if (!swValue.isOK())
return swValue.getStatus();
- return setFromString(swValue.getValue());
+ return setFromString(swValue.getValue(), boost::none);
}
ServerParameterSet* ServerParameterSet::getNodeParameterSet() {
@@ -134,45 +135,48 @@ IDLServerParameterDeprecatedAlias::IDLServerParameterDeprecatedAlias(StringData
}
void IDLServerParameterDeprecatedAlias::append(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& fieldName) {
+ BSONObjBuilder* b,
+ StringData fieldName,
+ const boost::optional<TenantId>& tenantId) {
std::call_once(_warnOnce, [&] {
LOGV2_WARNING(636300,
"Use of deprecated server parameter name",
"deprecatedName"_attr = name(),
"canonicalName"_attr = _sp->name());
});
- _sp->append(opCtx, b, fieldName);
+ _sp->append(opCtx, b, fieldName, tenantId);
}
-Status IDLServerParameterDeprecatedAlias::reset() {
+Status IDLServerParameterDeprecatedAlias::reset(const boost::optional<TenantId>& tenantId) {
std::call_once(_warnOnce, [&] {
LOGV2_WARNING(636301,
"Use of deprecated server parameter name",
"deprecatedName"_attr = name(),
"canonicalName"_attr = _sp->name());
});
- return _sp->reset();
+ return _sp->reset(tenantId);
}
-Status IDLServerParameterDeprecatedAlias::set(const BSONElement& newValueElement) {
+Status IDLServerParameterDeprecatedAlias::set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) {
std::call_once(_warnOnce, [&] {
LOGV2_WARNING(636302,
"Use of deprecated server parameter name",
"deprecatedName"_attr = name(),
"canonicalName"_attr = _sp->name());
});
- return _sp->set(newValueElement);
+ return _sp->set(newValueElement, tenantId);
}
-Status IDLServerParameterDeprecatedAlias::setFromString(const std::string& str) {
+Status IDLServerParameterDeprecatedAlias::setFromString(StringData str,
+ const boost::optional<TenantId>& tenantId) {
std::call_once(_warnOnce, [&] {
LOGV2_WARNING(636303,
"Use of deprecated server parameter name",
"deprecatedName"_attr = name(),
"canonicalName"_attr = _sp->name());
});
- return _sp->setFromString(str);
+ return _sp->setFromString(str, tenantId);
}
namespace {
@@ -181,24 +185,28 @@ public:
explicit DisabledTestParameter(ServerParameter* sp)
: ServerParameter(sp->name(), sp->getServerParameterType()), _sp(sp) {}
- void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) final {}
+ void append(OperationContext* opCtx,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) final {}
- Status validate(const BSONElement& newValueElement) const final {
+ Status validate(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) const final {
return {ErrorCodes::BadValue,
str::stream() << "Server parameter: '" << name() << "' is currently disabled"};
}
- Status setFromString(const std::string&) final {
+ Status setFromString(StringData, const boost::optional<TenantId>&) final {
return {ErrorCodes::BadValue,
str::stream() << "Server parameter: '" << name() << "' is currently disabled"};
}
- Status set(const BSONElement& newValueElement) final {
- return setFromString("");
+ Status set(const BSONElement& newValueElement, const boost::optional<TenantId>&) final {
+ return setFromString("", boost::none);
}
- Status reset() final {
- return setFromString("");
+ Status reset(const boost::optional<TenantId>&) final {
+ return setFromString("", boost::none);
}
bool isEnabled() const override {
diff --git a/src/mongo/db/server_parameter.h b/src/mongo/db/server_parameter.h
index 71960aa91a6..0f69433e9f3 100644
--- a/src/mongo/db/server_parameter.h
+++ b/src/mongo/db/server_parameter.h
@@ -43,6 +43,7 @@
#include "mongo/bson/bsonelement.h"
#include "mongo/bson/bsonobjbuilder.h"
#include "mongo/db/logical_time.h"
+#include "mongo/db/tenant_id.h"
#define MONGO_SERVER_PARAMETER_REGISTER(name) \
MONGO_INITIALIZER_GENERAL( \
@@ -130,25 +131,31 @@ public:
return (_type != ServerParameterType::kClusterWide);
}
- virtual void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) = 0;
+ virtual void append(OperationContext* opCtx,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>& tenantId) = 0;
virtual void appendSupportingRoundtrip(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {
- append(opCtx, b, name);
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>& tenantId) {
+ append(opCtx, b, name, tenantId);
}
- virtual Status validate(const BSONElement& newValueElement) const {
+ virtual Status validate(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) const {
return Status::OK();
}
- Status validate(const BSONObj& newValueObj) const {
- return validate(BSON("" << newValueObj).firstElement());
+ Status validate(const BSONObj& newValueObj, const boost::optional<TenantId>& tenantId) const {
+ return validate(BSON("" << newValueObj).firstElement(), tenantId);
}
// This base implementation calls `setFromString(coerceToString(newValueElement))`.
// Derived classes may customize the behavior by specifying `override_set` in IDL.
- virtual Status set(const BSONElement& newValueElement);
+ virtual Status set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId);
/**
* This method will reset the server parameter's value back to its default. This is currently
@@ -162,7 +169,7 @@ public:
* method. If it is called without being implemented, it will return an error via the inherited
* method below.
*/
- virtual Status reset() {
+ virtual Status reset(const boost::optional<TenantId>& tenantId) {
return Status{ErrorCodes::OperationFailed,
str::stream()
<< "Parameter reset not implemented for server parameter: " << name()};
@@ -172,11 +179,11 @@ public:
* Overload of set() that accepts BSONObjs instead of BSONElements. This is currently only used
* for cluster server parameters but can be used for node-only server parameters.
*/
- Status set(const BSONObj& newValueObj) {
- return set(BSON("" << newValueObj).firstElement());
+ Status set(const BSONObj& newValueObj, const boost::optional<TenantId>& tenantId) {
+ return set(BSON("" << newValueObj).firstElement(), tenantId);
}
- virtual Status setFromString(const std::string& str) = 0;
+ virtual Status setFromString(StringData str, const boost::optional<TenantId>& tenantId) = 0;
/**
* Simply returns the uninitialized/default-constructed LogicalTime by default.
@@ -186,8 +193,8 @@ public:
* implement a mechanism for atomically setting the clusterParameterTime in the set() method and
* retrieving it via this method.
*/
- virtual LogicalTime getClusterParameterTime() const {
- return LogicalTime::kUninitialized;
+ virtual LogicalTime getClusterParameterTime(const boost::optional<TenantId>& tenantId) const {
+ MONGO_UNREACHABLE;
}
bool isTestOnly() const {
@@ -293,10 +300,13 @@ class IDLServerParameterDeprecatedAlias : public ServerParameter {
public:
IDLServerParameterDeprecatedAlias(StringData name, ServerParameter* sp);
- void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) final;
- Status reset() final;
- Status set(const BSONElement& newValueElement) final;
- Status setFromString(const std::string& str) final;
+ void append(OperationContext* opCtx,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>& tenantId) final;
+ Status reset(const boost::optional<TenantId>& tenantId) final;
+ Status set(const BSONElement& newValueElement, const boost::optional<TenantId>& tenantId) final;
+ Status setFromString(StringData str, const boost::optional<TenantId>& tenantId) final;
private:
std::once_flag _warnOnce;
diff --git a/src/mongo/db/server_parameter_with_storage.h b/src/mongo/db/server_parameter_with_storage.h
index b0ad2fb7f08..6e39fe27576 100644
--- a/src/mongo/db/server_parameter_with_storage.h
+++ b/src/mongo/db/server_parameter_with_storage.h
@@ -319,9 +319,10 @@ public:
IDLServerParameterWithStorage(StringData name, T& storage)
: ServerParameter(name, paramType), _storage(storage) {}
- Status validateValue(const element_type& newValue) const {
+ Status validateValue(const element_type& newValue,
+ const boost::optional<TenantId>& tenantId) const {
for (const auto& validator : _validators) {
- const auto status = validator(newValue);
+ const auto status = validator(newValue, tenantId);
if (!status.isOK()) {
return status;
}
@@ -332,12 +333,12 @@ public:
/**
* Convenience wrapper for storing a value.
*/
- Status setValue(const element_type& newValue) {
- if (auto status = validateValue(newValue); !status.isOK()) {
+ Status setValue(const element_type& newValue, const boost::optional<TenantId>& tenantId) {
+ if (auto status = validateValue(newValue, tenantId); !status.isOK()) {
return status;
}
- _storage.store(newValue, boost::none);
+ _storage.store(newValue, tenantId);
if (_onUpdate) {
return _onUpdate(newValue);
@@ -349,8 +350,8 @@ public:
/**
* Convenience wrapper for fetching value from storage.
*/
- element_type getValue() const {
- return _storage.load(boost::none);
+ element_type getValue(const boost::optional<TenantId>& tenantId) const {
+ return _storage.load(tenantId);
}
/**
@@ -367,7 +368,7 @@ public:
// Update the actual storage, performing validation and any post-update functions as
// necessary.
- status = reset();
+ status = reset(boost::none);
});
return status;
}
@@ -378,14 +379,17 @@ public:
* Typically invoked by {getParameter:...} or {getClusterParameter:...} to produce a dictionary
* of SCP settings.
*/
- void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) final {
+ void append(OperationContext* opCtx,
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>& tenantId) final {
if (isRedact()) {
- b.append(name, "###");
+ b->append(name, "###");
} else if constexpr (paramType == SPT::kClusterWide) {
- b.append("_id"_sd, name);
- b.appendElementsUnique(getValue().toBSON());
+ b->append("_id"_sd, name);
+ b->appendElementsUnique(getValue(tenantId).toBSON());
} else {
- b.append(name, getValue());
+ b->append(name, getValue(tenantId));
}
}
@@ -409,13 +413,14 @@ public:
return newValue;
}
- Status validate(const BSONElement& newValueElement) const final {
+ Status validate(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) const final {
StatusWith<element_type> swNewValue = parseElement(newValueElement);
if (!swNewValue.isOK()) {
return swNewValue.getStatus();
}
- return validateValue(swNewValue.getValue());
+ return validateValue(swNewValue.getValue(), tenantId);
}
/**
@@ -424,22 +429,23 @@ public:
* Allows setting non-basic values (e.g. vector<string>)
* via the {setParameter: ...} call or {setClusterParameter: ...} call.
*/
- Status set(const BSONElement& newValueElement) final {
+ Status set(const BSONElement& newValueElement,
+ const boost::optional<TenantId>& tenantId) final {
StatusWith<element_type> swNewValue = parseElement(newValueElement);
if (!swNewValue.isOK()) {
return swNewValue.getStatus();
}
- return setValue(swNewValue.getValue());
+ return setValue(swNewValue.getValue(), tenantId);
}
/**
* Resets the current storage value in storage_wrapper with the default value.
*/
- Status reset() final {
- _storage.reset(boost::none);
+ Status reset(const boost::optional<TenantId>& tenantId) final {
+ _storage.reset(tenantId);
if (_onUpdate) {
- return _onUpdate(_storage.load(boost::none));
+ return _onUpdate(_storage.load(tenantId));
}
return Status::OK();
@@ -451,7 +457,7 @@ public:
* Typically invoked from commandline --setParameter usage. Prohibited for cluster server
* parameters.
*/
- Status setFromString(const std::string& str) final {
+ Status setFromString(StringData str, const boost::optional<TenantId>& tenantId) final {
if constexpr (paramType == SPT::kClusterWide) {
return {ErrorCodes::BadValue,
"Unable to set a cluster-wide server parameter from the command line or config "
@@ -462,7 +468,7 @@ public:
return swNewValue.getStatus();
}
- return setValue(swNewValue.getValue());
+ return setValue(swNewValue.getValue(), tenantId);
}
}
@@ -470,9 +476,9 @@ public:
* Retrieves the cluster parameter time from the chained ClusterServerParameter struct in
* storage. All other server parameters simply return the uninitialized LogicalTime.
*/
- LogicalTime getClusterParameterTime() const final {
+ LogicalTime getClusterParameterTime(const boost::optional<TenantId>& tenantId) const final {
if constexpr (hasClusterServerParameter<element_type>) {
- return getValue().getClusterParameterTime();
+ return getValue(tenantId).getClusterParameterTime();
}
return LogicalTime::kUninitialized;
@@ -493,7 +499,7 @@ public:
*
* Callback should return Status::OK() or ErrorCodes::BadValue.
*/
- using validator_t = Status(const element_type&);
+ using validator_t = Status(const element_type&, const boost::optional<TenantId>& tenantId);
void addValidator(std::function<validator_t> validator) {
_validators.push_back(std::move(validator));
}
@@ -503,15 +509,16 @@ public:
*/
template <class predicate>
void addBound(const element_type& bound) {
- addValidator([bound, spname = name()](const element_type& value) {
- if (!predicate::evaluate(value, bound)) {
- return Status(ErrorCodes::BadValue,
- str::stream()
- << "Invalid value for parameter " << spname << ": " << value
- << " is not " << predicate::description << " " << bound);
- }
- return Status::OK();
- });
+ addValidator(
+ [bound, spname = name()](const element_type& value, const boost::optional<TenantId>&) {
+ if (!predicate::evaluate(value, bound)) {
+ return Status(ErrorCodes::BadValue,
+ str::stream()
+ << "Invalid value for parameter " << spname << ": " << value
+ << " is not " << predicate::description << " " << bound);
+ }
+ return Status::OK();
+ });
}
private:
diff --git a/src/mongo/db/storage/storage_engine_parameters.cpp b/src/mongo/db/storage/storage_engine_parameters.cpp
index f49ab161253..e1c164315aa 100644
--- a/src/mongo/db/storage/storage_engine_parameters.cpp
+++ b/src/mongo/db/storage/storage_engine_parameters.cpp
@@ -34,12 +34,14 @@ namespace mongo {
QueueingPolicyEnum gTicketQueueingPolicy{QueueingPolicyEnum::FifoQueue};
void TicketQueueingPolicy::append(OperationContext*,
- BSONObjBuilder& builder,
- const std::string& name) {
- builder.append(name, QueueingPolicy_serializer(gTicketQueueingPolicy));
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ builder->append(name, QueueingPolicy_serializer(gTicketQueueingPolicy));
}
-Status TicketQueueingPolicy::setFromString(const std::string& protocolStr) {
+Status TicketQueueingPolicy::setFromString(StringData protocolStr,
+ const boost::optional<TenantId>&) {
if (protocolStr == QueueingPolicy_serializer(QueueingPolicyEnum::Semaphore)) {
gTicketQueueingPolicy = QueueingPolicyEnum::Semaphore;
} else if (protocolStr == QueueingPolicy_serializer(QueueingPolicyEnum::FifoQueue)) {
diff --git a/src/mongo/db/storage/storage_options.cpp b/src/mongo/db/storage/storage_options.cpp
index 3736cd69316..5df2299e0ab 100644
--- a/src/mongo/db/storage/storage_options.cpp
+++ b/src/mongo/db/storage/storage_options.cpp
@@ -62,15 +62,16 @@ void StorageGlobalParams::reset() {
StorageGlobalParams storageGlobalParams;
-Status StorageDirectoryPerDbParameter::setFromString(const std::string&) {
+Status StorageDirectoryPerDbParameter::setFromString(StringData, const boost::optional<TenantId>&) {
return {ErrorCodes::IllegalOperation,
str::stream() << name() << " cannot be set via setParameter"};
};
void StorageDirectoryPerDbParameter::append(OperationContext* opCtx,
- BSONObjBuilder& builder,
- const std::string& name) {
- builder.append(name, storageGlobalParams.directoryperdb);
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ builder->append(name, storageGlobalParams.directoryperdb);
}
diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
index 02831180a11..2ec7d42e175 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_parameters.cpp
@@ -42,12 +42,14 @@ namespace mongo {
using std::string;
void WiredTigerEngineRuntimeConfigParameter::append(OperationContext* opCtx,
- BSONObjBuilder& b,
- const std::string& name) {
- b << name << _data.first;
+ BSONObjBuilder* b,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ *b << name << _data.first;
}
-Status WiredTigerEngineRuntimeConfigParameter::setFromString(const std::string& str) {
+Status WiredTigerEngineRuntimeConfigParameter::setFromString(StringData str,
+ const boost::optional<TenantId>&) {
size_t pos = str.find('\0');
if (pos != std::string::npos) {
return Status(ErrorCodes::BadValue,
@@ -63,7 +65,7 @@ Status WiredTigerEngineRuntimeConfigParameter::setFromString(const std::string&
"config"_attr = str);
invariant(_data.second);
- int ret = _data.second->reconfigure(str.c_str());
+ int ret = _data.second->reconfigure(str.toString().c_str());
if (ret != 0) {
const char* errorStr = wiredtiger_strerror(ret);
string result = (str::stream() << "WiredTiger reconfiguration failed with error code ("
@@ -76,18 +78,20 @@ Status WiredTigerEngineRuntimeConfigParameter::setFromString(const std::string&
return Status(ErrorCodes::BadValue, result);
}
- _data.first = str;
+ _data.first = str.toString();
return Status::OK();
}
-Status WiredTigerDirectoryForIndexesParameter::setFromString(const std::string&) {
+Status WiredTigerDirectoryForIndexesParameter::setFromString(StringData,
+ const boost::optional<TenantId>&) {
return {ErrorCodes::IllegalOperation,
str::stream() << name() << " cannot be set via setParameter"};
};
void WiredTigerDirectoryForIndexesParameter::append(OperationContext* opCtx,
- BSONObjBuilder& builder,
- const std::string& name) {
- builder.append(name, wiredTigerGlobalOptions.directoryForIndexes);
+ BSONObjBuilder* builder,
+ StringData name,
+ const boost::optional<TenantId>&) {
+ builder->append(name, wiredTigerGlobalOptions.directoryForIndexes);
}
} // namespace mongo
diff --git a/src/mongo/db/traffic_recorder_validators.cpp b/src/mongo/db/traffic_recorder_validators.cpp
index c9c48501e8d..c74075f7738 100644
--- a/src/mongo/db/traffic_recorder_validators.cpp
+++ b/src/mongo/db/traffic_recorder_validators.cpp
@@ -35,7 +35,7 @@
namespace mongo {
-Status validateTrafficRecordDestination(const std::string& path) {
+Status validateTrafficRecordDestination(const std::string& path, const boost::optional<TenantId>&) {
if (!path.empty() && !boost::filesystem::is_directory(path)) {
return Status(ErrorCodes::FileNotOpen,
str::stream()
diff --git a/src/mongo/db/traffic_recorder_validators.h b/src/mongo/db/traffic_recorder_validators.h
index 94e2c10bff6..532280e203c 100644
--- a/src/mongo/db/traffic_recorder_validators.h
+++ b/src/mongo/db/traffic_recorder_validators.h
@@ -29,13 +29,15 @@
#pragma once
+#include <boost/optional.hpp>
#include <string>
#include "mongo/base/status.h"
+#include "mongo/db/tenant_id.h"
namespace mongo {
-Status validateTrafficRecordDestination(const std::string& path);
+Status validateTrafficRecordDestination(const std::string& path, const boost::optional<TenantId>&);
} // namespace mongo