diff options
Diffstat (limited to 'src/mongo/db/commands')
5 files changed, 66 insertions, 38 deletions
diff --git a/src/mongo/db/commands/cluster_server_parameter_cmds.idl b/src/mongo/db/commands/cluster_server_parameter_cmds.idl index 9c768f43f23..256b4cbd6d6 100644 --- a/src/mongo/db/commands/cluster_server_parameter_cmds.idl +++ b/src/mongo/db/commands/cluster_server_parameter_cmds.idl @@ -46,7 +46,7 @@ commands: api_version: "" namespace: type type: object - strict: true + strict: false getClusterParameter: description: "Retrieves the in-memory value of the specified cluster server parameter(s)" diff --git a/src/mongo/db/commands/set_cluster_parameter_command.cpp b/src/mongo/db/commands/set_cluster_parameter_command.cpp index 9d4074ac0bc..c4472f1ae12 100644 --- a/src/mongo/db/commands/set_cluster_parameter_command.cpp +++ b/src/mongo/db/commands/set_cluster_parameter_command.cpp @@ -42,6 +42,10 @@ namespace mongo { namespace { +const WriteConcernOptions kMajorityWriteConcern{WriteConcernOptions::kMajority, + WriteConcernOptions::SyncMode::UNSET, + WriteConcernOptions::kNoTimeout}; + class SetClusterParameterCommand final : public TypedCommand<SetClusterParameterCommand> { public: using Request = SetClusterParameter; @@ -76,7 +80,7 @@ public: SetClusterParameterInvocation invocation{std::move(parameterService), dbService}; - invocation.invoke(opCtx, request()); + invocation.invoke(opCtx, request(), boost::none, kMajorityWriteConcern); } private: diff --git a/src/mongo/db/commands/set_cluster_parameter_invocation.cpp b/src/mongo/db/commands/set_cluster_parameter_invocation.cpp index 513ae376564..8d29147d282 100644 --- a/src/mongo/db/commands/set_cluster_parameter_invocation.cpp +++ b/src/mongo/db/commands/set_cluster_parameter_invocation.cpp @@ -42,8 +42,10 @@ namespace mongo { -void SetClusterParameterInvocation::invoke(OperationContext* opCtx, - const SetClusterParameter& cmd) { +bool SetClusterParameterInvocation::invoke(OperationContext* opCtx, + const SetClusterParameter& cmd, + boost::optional<Timestamp> paramTime, + const WriteConcernOptions& writeConcern) { BSONObj cmdParamObj = cmd.getCommandParameter(); BSONElement commandElement = cmdParamObj.firstElement(); @@ -51,14 +53,16 @@ void SetClusterParameterInvocation::invoke(OperationContext* opCtx, const ServerParameter* serverParameter = _sps->getIfExists(parameterName); - uassert(6432601, + uassert(ErrorCodes::IllegalOperation, str::stream() << "Unknown Cluster Parameter " << parameterName, serverParameter != nullptr); - uassert(6432602, + + uassert(ErrorCodes::IllegalOperation, "Cluster parameter value must be an object", BSONType::Object == commandElement.type()); - LogicalTime clusterTime = _dbService.getUpdateClusterTime(opCtx); + LogicalTime clusterTime = + paramTime ? LogicalTime(*paramTime) : _dbService.getUpdateClusterTime(opCtx); BSONObjBuilder updateBuilder; updateBuilder << "_id" << parameterName << "clusterParameterTime" << clusterTime.toBSON(); @@ -67,11 +71,11 @@ void SetClusterParameterInvocation::invoke(OperationContext* opCtx, BSONObj query = BSON("_id" << parameterName); BSONObj update = updateBuilder.obj(); - LOGV2(6432603, "Updating cluster parameter on-disk", "clusterParameter"_attr = parameterName); + LOGV2_DEBUG( + 6432603, 2, "Updating cluster parameter on-disk", "clusterParameter"_attr = parameterName); uassertStatusOK(serverParameter->validate(update)); - Status updateResult = _dbService.updateParameterOnDisk(query, update); - uassertStatusOK(updateResult); + return uassertStatusOK(_dbService.updateParameterOnDisk(opCtx, query, update, writeConcern)); } LogicalTime ClusterParameterDBClientService::getUpdateClusterTime(OperationContext* opCtx) { @@ -79,23 +83,23 @@ LogicalTime ClusterParameterDBClientService::getUpdateClusterTime(OperationConte return vt.clusterTime(); } -Status ClusterParameterDBClientService::updateParameterOnDisk(BSONObj query, BSONObj update) { +StatusWith<bool> ClusterParameterDBClientService::updateParameterOnDisk( + OperationContext* opCtx, + BSONObj query, + BSONObj update, + const WriteConcernOptions& writeConcern) { BSONObj res; BSONObjBuilder set; set.append("$set", update); set.doneFast(); - const std::string configDb = "config"; - const auto kMajorityWriteConcern = BSON("writeConcern" << BSON("w" - << "majority")); - const NamespaceString kClusterParametersNamespace(configDb, "clusterParameters"); - try { _dbClient.runCommand( - configDb, + NamespaceString::kConfigDb.toString(), [&] { - write_ops::UpdateCommandRequest updateOp(kClusterParametersNamespace); + write_ops::UpdateCommandRequest updateOp( + NamespaceString::kClusterParametersNamespace); updateOp.setUpdates({[&] { write_ops::UpdateOpEntry entry; entry.setQ(query); @@ -105,7 +109,7 @@ Status ClusterParameterDBClientService::updateParameterOnDisk(BSONObj query, BSO return entry; }()}); - return updateOp.toBSON(kMajorityWriteConcern); + return updateOp.toBSON(writeConcern.toBSON()); }(), res); } catch (const DBException& ex) { @@ -119,7 +123,7 @@ Status ClusterParameterDBClientService::updateParameterOnDisk(BSONObj query, BSO return Status(ErrorCodes::FailedToParse, errmsg); } - return Status::OK(); + return response.getNModified() > 0 || response.getN() > 0; } const ServerParameter* ClusterParameterService::getIfExists(StringData name) { diff --git a/src/mongo/db/commands/set_cluster_parameter_invocation.h b/src/mongo/db/commands/set_cluster_parameter_invocation.h index 35b74530a95..d6ff09f0d47 100644 --- a/src/mongo/db/commands/set_cluster_parameter_invocation.h +++ b/src/mongo/db/commands/set_cluster_parameter_invocation.h @@ -48,7 +48,10 @@ public: class DBClientService { public: - virtual Status updateParameterOnDisk(BSONObj query, BSONObj update) = 0; + virtual StatusWith<bool> updateParameterOnDisk(OperationContext* opCtx, + BSONObj query, + BSONObj update, + const WriteConcernOptions&) = 0; virtual LogicalTime getUpdateClusterTime(OperationContext*) = 0; virtual ~DBClientService() = default; }; @@ -56,7 +59,10 @@ public: class ClusterParameterDBClientService final : public DBClientService { public: ClusterParameterDBClientService(DBDirectClient& dbDirectClient) : _dbClient(dbDirectClient) {} - Status updateParameterOnDisk(BSONObj query, BSONObj update) override; + StatusWith<bool> updateParameterOnDisk(OperationContext* opCtx, + BSONObj query, + BSONObj update, + const WriteConcernOptions&) override; LogicalTime getUpdateClusterTime(OperationContext*) override; private: @@ -69,13 +75,13 @@ public: DBClientService& dbClientService) : _sps(std::move(serverParmeterService)), _dbService(dbClientService) {} - void invoke(OperationContext*, const SetClusterParameter&); + bool invoke(OperationContext*, + const SetClusterParameter&, + boost::optional<Timestamp>, + const WriteConcernOptions&); private: std::unique_ptr<ServerParameterService> _sps; DBClientService& _dbService; - - Status updateParameterOnDisk(BSONObj query, BSONObj update); }; - } // namespace mongo 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 3934e890684..895b094d47d 100644 --- a/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp +++ b/src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp @@ -44,6 +44,10 @@ namespace mongo { namespace { +const WriteConcernOptions kMajorityWriteConcern{WriteConcernOptions::kMajority, + WriteConcernOptions::SyncMode::UNSET, + WriteConcernOptions::kNoTimeout}; + // Mocks class MockParameterService : public ServerParameterService { public: @@ -89,11 +93,14 @@ private: class DBClientMock : public DBClientService { public: - DBClientMock(std::function<Status(BSONObj, BSONObj)> updateParameterOnDiskMock) { + DBClientMock(std::function<StatusWith<bool>(BSONObj, BSONObj)> updateParameterOnDiskMock) { this->updateParameterOnDiskMockImpl = updateParameterOnDiskMock; } - Status updateParameterOnDisk(BSONObj cmd, BSONObj info) override { + StatusWith<bool> updateParameterOnDisk(OperationContext* opCtx, + BSONObj cmd, + BSONObj info, + const WriteConcernOptions&) override { return updateParameterOnDiskMockImpl(cmd, info); } @@ -103,7 +110,7 @@ public: } private: - std::function<Status(BSONObj, BSONObj)> updateParameterOnDiskMockImpl; + std::function<StatusWith<bool>(BSONObj, BSONObj)> updateParameterOnDiskMockImpl; }; MockServerParameter alwaysValidatingServerParameter(StringData name) { @@ -123,7 +130,7 @@ MockServerParameter alwaysInvalidatingServerParameter(StringData name) { } DBClientMock alwaysSucceedingDbClient() { - DBClientMock dbServiceMock([&](BSONObj cmd, BSONObj info) { return Status::OK(); }); + DBClientMock dbServiceMock([&](BSONObj cmd, BSONObj info) { return true; }); return dbServiceMock; } @@ -164,7 +171,7 @@ TEST(SetClusterParameterCommand, SucceedsWithObjectParameter) { << "majority"))); SetClusterParameter testCmd(obj); - fixture.invoke(&spyCtx, testCmd); + fixture.invoke(&spyCtx, testCmd, boost::none, kMajorityWriteConcern); } TEST(SetClusterParameterCommand, ThrowsWithNonObjectParameter) { @@ -189,7 +196,9 @@ TEST(SetClusterParameterCommand, ThrowsWithNonObjectParameter) { OperationContext spyCtx(clientPtr, 1234); SetClusterParameter testCmd(obj); - ASSERT_THROWS_CODE(fixture.invoke(&spyCtx, testCmd), DBException, 6432602); + ASSERT_THROWS_CODE(fixture.invoke(&spyCtx, testCmd, boost::none, kMajorityWriteConcern), + DBException, + ErrorCodes::IllegalOperation); } TEST(SetClusterParameterCommand, ThrowsWhenServerParameterValidationFails) { @@ -217,10 +226,11 @@ TEST(SetClusterParameterCommand, ThrowsWhenServerParameterValidationFails) { OperationContext spyCtx(clientPtr, 1234); SetClusterParameter testCmd(obj); - ASSERT_THROWS_CODE_AND_WHAT(fixture.invoke(&spyCtx, testCmd), - DBException, - ErrorCodes::BadValue, - "Parameter Validation Failed"_sd); + ASSERT_THROWS_CODE_AND_WHAT( + fixture.invoke(&spyCtx, testCmd, boost::none, kMajorityWriteConcern), + DBException, + ErrorCodes::BadValue, + "Parameter Validation Failed"_sd); } TEST(SetClusterParameterCommand, ThrowsWhenDBUpdateFails) { @@ -248,7 +258,9 @@ TEST(SetClusterParameterCommand, ThrowsWhenDBUpdateFails) { SetClusterParameter testCmd(obj); - ASSERT_THROWS_WHAT(fixture.invoke(&spyCtx, testCmd), DBException, "DB Client Update Failed"_sd); + ASSERT_THROWS_WHAT(fixture.invoke(&spyCtx, testCmd, boost::none, kMajorityWriteConcern), + DBException, + "DB Client Update Failed"_sd); } TEST(SetClusterParameterCommand, ThrowsWhenParameterNotPresent) { @@ -275,7 +287,9 @@ TEST(SetClusterParameterCommand, ThrowsWhenParameterNotPresent) { SetClusterParameter testCmd(obj); - ASSERT_THROWS_CODE(fixture.invoke(&spyCtx, testCmd), DBException, 6432601); + ASSERT_THROWS_CODE(fixture.invoke(&spyCtx, testCmd, boost::none, kMajorityWriteConcern), + DBException, + ErrorCodes::IllegalOperation); } } // namespace } // namespace mongo |