diff options
Diffstat (limited to 'src/mongo/idl/cluster_server_parameter_initializer.h')
| -rw-r--r-- | src/mongo/idl/cluster_server_parameter_initializer.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/mongo/idl/cluster_server_parameter_initializer.h b/src/mongo/idl/cluster_server_parameter_initializer.h index 49d501a7e6d..0eb02bb058c 100644 --- a/src/mongo/idl/cluster_server_parameter_initializer.h +++ b/src/mongo/idl/cluster_server_parameter_initializer.h @@ -52,6 +52,23 @@ public: static ClusterServerParameterInitializer* get(OperationContext* opCtx); static ClusterServerParameterInitializer* get(ServiceContext* serviceContext); + void updateParameter(BSONObj doc, StringData mode); + void clearParameter(ServerParameter* sp); + void clearParameter(StringData id); + void clearAllParameters(); + + /** + * Used to initialize in-memory cluster parameter state based on the on-disk contents after + * startup recovery or initial sync is complete. + */ + void initializeAllParametersFromDisk(OperationContext* opCtx); + + /** + * Used on rollback and rename with drop. + * Updates settings which are present and clears settings which are not. + */ + void resynchronizeAllParametersFromDisk(OperationContext* opCtx); + // Virtual methods coming from the ReplicaSetAwareService void onStartup(OperationContext* opCtx) override final {} @@ -65,6 +82,35 @@ public: void onStepUpComplete(OperationContext* opCtx, long long term) override final {} void onStepDown() override final {} void onBecomeArbiter() override final {} + +private: + template <typename OnEntry> + void doLoadAllParametersFromDisk(OperationContext* opCtx, + StringData mode, + OnEntry onEntry) try { + std::vector<Status> failures; + + DBDirectClient client(opCtx); + FindCommandRequest findRequest{NamespaceString::kClusterParametersNamespace}; + client.find(std::move(findRequest), ReadPreferenceSetting{}, [&](BSONObj doc) { + try { + onEntry(doc, mode); + } catch (const DBException& ex) { + failures.push_back(ex.toStatus()); + } + }); + if (!failures.empty()) { + StringBuilder msg; + for (const auto& failure : failures) { + msg << failure.toString() << ", "; + } + msg.reset(msg.len() - 2); + uasserted(ErrorCodes::OperationFailed, msg.str()); + } + } catch (const DBException& ex) { + uassertStatusOK(ex.toStatus().withContext( + str::stream() << "Failed " << mode << " cluster server parameters from disk")); + } }; } // namespace mongo |
