From 36b8246daa269b1a21d63d3f0e11c31b274e6703 Mon Sep 17 00:00:00 2001 From: Gabriel Marks Date: Tue, 30 Aug 2022 19:28:35 +0000 Subject: SERVER-68342 Modify ServerParameter to take tenantId --- src/mongo/db/auth/authorization_manager_global.cpp | 10 +-- src/mongo/db/auth/authorization_manager_impl.cpp | 17 +++-- src/mongo/db/change_stream_options_manager.cpp | 22 ++++--- src/mongo/db/change_streams_cluster_parameter.cpp | 3 +- src/mongo/db/change_streams_cluster_parameter.h | 7 +- .../db/commands/feature_compatibility_version.cpp | 10 +-- .../commands/get_cluster_parameter_invocation.cpp | 4 +- src/mongo/db/commands/parameters.cpp | 59 +++++++++-------- .../commands/set_cluster_parameter_invocation.cpp | 13 ++-- .../db/commands/set_cluster_parameter_invocation.h | 3 +- .../set_cluster_parameter_invocation_test.cpp | 19 ++++-- src/mongo/db/free_mon/free_mon_mongod.cpp | 2 +- src/mongo/db/free_mon/free_mon_mongod.h | 4 +- src/mongo/db/ftdc/ftdc_mongod.cpp | 3 +- src/mongo/db/ftdc/ftdc_mongod.h | 5 +- src/mongo/db/ftdc/ftdc_server.cpp | 14 ++-- src/mongo/db/global_settings.cpp | 15 +++-- src/mongo/db/initialize_server_global_state.cpp | 23 ++++--- src/mongo/db/mirror_maestro.cpp | 13 ++-- .../db/process_health/fault_state_machine_test.cpp | 2 +- .../health_monitoring_server_parameters.cpp | 39 ++++++----- src/mongo/db/query/ce_mode_parameter.cpp | 2 +- src/mongo/db/query/ce_mode_parameter.h | 3 +- src/mongo/db/query/ce_mode_parameter_test.cpp | 10 +-- src/mongo/db/query/framework_control.cpp | 9 ++- .../query/sbe_plan_cache_on_parameter_change.cpp | 2 +- .../db/query/sbe_plan_cache_on_parameter_change.h | 2 +- src/mongo/db/repl/initial_syncer_test.cpp | 4 +- src/mongo/db/repl/replication_info.cpp | 2 +- .../configsvr_set_cluster_parameter_command.cpp | 8 ++- .../db/s/transaction_coordinator_test_fixture.cpp | 2 +- src/mongo/db/server_options_helpers.cpp | 6 +- src/mongo/db/server_options_test.cpp | 9 ++- src/mongo/db/server_parameter.cpp | 46 +++++++------ src/mongo/db/server_parameter.h | 46 +++++++------ src/mongo/db/server_parameter_with_storage.h | 75 ++++++++++++---------- src/mongo/db/storage/storage_engine_parameters.cpp | 10 +-- src/mongo/db/storage/storage_options.cpp | 9 +-- .../storage/wiredtiger/wiredtiger_parameters.cpp | 24 ++++--- src/mongo/db/traffic_recorder_validators.cpp | 2 +- src/mongo/db/traffic_recorder_validators.h | 4 +- 41 files changed, 333 insertions(+), 229 deletions(-) (limited to 'src/mongo/db') 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&) { 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&) { 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 strList; - str::splitStringDelim(str, &strList, ','); + str::splitStringDelim(str.toString(), &strList, ','); std::vector 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&) { + return authorizationManagerPinnedUsers.append(*out, name.toString()); } -Status AuthorizationManagerPinnedUsersServerParameter::set(const BSONElement& newValue) { +Status AuthorizationManagerPinnedUsersServerParameter::set(const BSONElement& newValue, + const boost::optional&) { return authorizationManagerPinnedUsers.set(newValue); } -Status AuthorizationManagerPinnedUsersServerParameter::setFromString(const std::string& str) { +Status AuthorizationManagerPinnedUsersServerParameter::setFromString( + StringData str, const boost::optional&) { 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 ChangeStreamOptionsManager::setOptions( } void ChangeStreamOptionsParameter::append(OperationContext* opCtx, - BSONObjBuilder& bob, - const std::string& name) { + BSONObjBuilder* bob, + StringData name, + const boost::optional& 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) { 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) 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) { // 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) 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) { 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 + #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); } // 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&) { 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&) { 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&) { + 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&) { 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&) { 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&) { BSONObj currentSettings; getLogComponentVerbosity(¤tSettings); - builder.append(name, currentSettings); + builder->append(name, currentSettings); } -Status LogComponentVerbosityServerParameter::set(const BSONElement& newValueElement) { +Status LogComponentVerbosityServerParameter::set(const BSONElement& newValueElement, + const boost::optional&) { 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&) 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&) { const stdx::lock_guard 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&) { 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&) { auto kMaxSize = 64U; if (str.size() > kMaxSize) return {ErrorCodes::Overflow, @@ -511,7 +520,7 @@ Status AutomationServiceDescriptorServerParameter::setFromString(const std::stri { const stdx::lock_guard 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 SetClusterParameterInvocation::normalizeParameter( BSONObj cmdParamObj, const boost::optional& paramTime, ServerParameter* sp, - StringData parameterName) { + StringData parameterName, + const boost::optional& tenantId) { BSONElement commandElement = cmdParamObj.firstElement(); uassert(ErrorCodes::IllegalOperation, "Cluster parameter value must be an object", @@ -88,7 +89,7 @@ std::pair 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 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& paramTime, ServerParameter* sp, - StringData parameterName); + StringData parameterName, + const boost::optional& tenantId); private: std::unique_ptr _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&) {} void appendSupportingRoundtrip(OperationContext* opCtx, - BSONObjBuilder& b, - const std::string& name) {} + BSONObjBuilder* b, + StringData name, + const boost::optional&) {} - Status set(const BSONElement& newValueElement) { + Status set(const BSONElement& newValueElement, const boost::optional& 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) { + 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) 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&) { // 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 #include #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&); } // 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 value) { +Status validateCollectionStatsNamespaces(const std::vector value, + const boost::optional& 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 #include #include #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 value); +Status validateCollectionStatsNamespaces(std::vector value, + const boost::optional& 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 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&) { + b->append(name, ftdcDirectoryPathParameter->generic_string()); } -Status DiagnosticDataCollectionDirectoryPathServerParameter::setFromString(const std::string& str) { +Status DiagnosticDataCollectionDirectoryPathServerParameter::setFromString( + StringData str, const boost::optional&) { 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&) { 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&) { std::shared_ptr> 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&) { 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&) { #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&) { #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&) { #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&) { #ifndef _WIN32 - b << name << static_cast(getUmaskOverride()); + *b << name << static_cast(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&) { + 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&) 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&) 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(); 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&) { 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&) { 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&) { 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&) { *_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&) { *_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&) { 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&) { 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&) { 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&) { 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&) { 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 #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&); } // 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&) { + *b << name << QueryFrameworkControl_serializer(_data.get()); } -Status QueryFrameworkControl::setFromString(const std::string& value) { +Status QueryFrameworkControl::setFromString(StringData value, const boost::optional&) { _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&) { 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&); /** * 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 applySetParameterOptions(const std::mapappend(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&) final { + bob->append(name, val); } - Status setFromString(const std::string& str) final { + Status setFromString(StringData str, const boost::optional&) 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) { + 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) { 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) { 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) { 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) { 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&) final {} - Status validate(const BSONElement& newValueElement) const final { + Status validate(const BSONElement& newValueElement, + const boost::optional& 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&) 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&) final { + return setFromString("", boost::none); } - Status reset() final { - return setFromString(""); + Status reset(const boost::optional&) 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) = 0; virtual void appendSupportingRoundtrip(OperationContext* opCtx, - BSONObjBuilder& b, - const std::string& name) { - append(opCtx, b, name); + BSONObjBuilder* b, + StringData name, + const boost::optional& tenantId) { + append(opCtx, b, name, tenantId); } - virtual Status validate(const BSONElement& newValueElement) const { + virtual Status validate(const BSONElement& newValueElement, + const boost::optional& 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) 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); /** * 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) { 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) { + return set(BSON("" << newValueObj).firstElement(), tenantId); } - virtual Status setFromString(const std::string& str) = 0; + virtual Status setFromString(StringData str, const boost::optional& 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) 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) final; + Status reset(const boost::optional& tenantId) final; + Status set(const BSONElement& newValueElement, const boost::optional& tenantId) final; + Status setFromString(StringData str, const boost::optional& 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) 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) { + 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) 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) 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) const final { StatusWith 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) * via the {setParameter: ...} call or {setClusterParameter: ...} call. */ - Status set(const BSONElement& newValueElement) final { + Status set(const BSONElement& newValueElement, + const boost::optional& tenantId) final { StatusWith 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) 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) 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) const final { if constexpr (hasClusterServerParameter) { - 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); void addValidator(std::function validator) { _validators.push_back(std::move(validator)); } @@ -503,15 +509,16 @@ public: */ template 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&) { + 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&) { + builder->append(name, QueueingPolicy_serializer(gTicketQueueingPolicy)); } -Status TicketQueueingPolicy::setFromString(const std::string& protocolStr) { +Status TicketQueueingPolicy::setFromString(StringData protocolStr, + const boost::optional&) { 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&) { 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&) { + 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&) { + *b << name << _data.first; } -Status WiredTigerEngineRuntimeConfigParameter::setFromString(const std::string& str) { +Status WiredTigerEngineRuntimeConfigParameter::setFromString(StringData str, + const boost::optional&) { 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&) { 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&) { + 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&) { 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 #include #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&); } // namespace mongo -- cgit v1.2.1