summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands')
-rw-r--r--src/mongo/db/commands/cluster_server_parameter_cmds.idl2
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_command.cpp6
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation.cpp40
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation.h18
-rw-r--r--src/mongo/db/commands/set_cluster_parameter_invocation_test.cpp38
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