diff options
author | Andrew Shuvalov <andrew.shuvalov@mongodb.com> | 2021-07-19 20:31:06 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-07-19 21:09:32 +0000 |
commit | f335e286672490f71f368d82a2f842c7e03a587d (patch) | |
tree | 02b615aa95f60f7d9d229cce40ff228c17b91d15 | |
parent | 6109f0ff6d99133cba34aef32ac86810f0afbde7 (diff) | |
download | mongo-f335e286672490f71f368d82a2f842c7e03a587d.tar.gz |
SERVER-58623: make RSM to respect refresh interval fail injection after init
-rw-r--r-- | src/mongo/client/replica_set_monitor.cpp | 18 | ||||
-rw-r--r-- | src/mongo/client/replica_set_monitor.h | 15 | ||||
-rw-r--r-- | src/mongo/client/replica_set_monitor_internal.h | 8 |
3 files changed, 25 insertions, 16 deletions
diff --git a/src/mongo/client/replica_set_monitor.cpp b/src/mongo/client/replica_set_monitor.cpp index 60b77d7c8bc..ea2a0b7df43 100644 --- a/src/mongo/client/replica_set_monitor.cpp +++ b/src/mongo/client/replica_set_monitor.cpp @@ -178,14 +178,18 @@ const Seconds ReplicaSetMonitor::kDefaultFindHostTimeout(15); // Defaults to random selection as required by the spec bool ReplicaSetMonitor::useDeterministicHostSelection = false; -Seconds ReplicaSetMonitor::getDefaultRefreshPeriod() { +Seconds ReplicaSetMonitor::_getDefaultRefreshPeriod() { + return kDefaultRefreshPeriod; +} + +Seconds ReplicaSetMonitor::_overrideRefreshPeriod(Seconds original) { + static constexpr auto kPeriodField = "period"_sd; MONGO_FAIL_POINT_BLOCK_IF(modifyReplicaSetMonitorDefaultRefreshPeriod, data, - [&](const BSONObj& data) { return data.hasField("period"); }) { - return Seconds{data.getData().getIntField("period")}; + [&](const BSONObj& data) { return data.hasField(kPeriodField); }) { + return Seconds{data.getData().getIntField(kPeriodField)}; } - - return kDefaultRefreshPeriod; + return original; } ReplicaSetMonitor::ReplicaSetMonitor(const SetStatePtr& initialState) : _state(initialState) {} @@ -251,7 +255,7 @@ void ReplicaSetMonitor::_doScheduledRefresh(const CallbackHandle& currentHandle) Refresher::ensureScanInProgress(_state, lk); - Milliseconds period = _state->refreshPeriod; + Milliseconds period = _overrideRefreshPeriod(_state->refreshPeriod); if (_state->isExpedited) { if (_state->waiters.empty()) { // No current waiters so we can stop the expedited scanning. @@ -1020,7 +1024,7 @@ SetState::SetState(const MongoURI& uri, seedNodes(setUri.getServers().begin(), setUri.getServers().end()), latencyThresholdMicros(serverGlobalParams.defaultLocalThresholdMillis * int64_t(1000)), rand(std::random_device()()), - refreshPeriod(getDefaultRefreshPeriod()) { + refreshPeriod(_overrideRefreshPeriod(_getDefaultRefreshPeriod())) { uassert(13642, "Replica set seed list can't be empty", !seedNodes.empty()); if (name.empty()) diff --git a/src/mongo/client/replica_set_monitor.h b/src/mongo/client/replica_set_monitor.h index c78fde4b353..eb28f3ad18d 100644 --- a/src/mongo/client/replica_set_monitor.h +++ b/src/mongo/client/replica_set_monitor.h @@ -217,11 +217,6 @@ public: */ static void shutdown(); - /** - * Returns the refresh period that is given to all new SetStates. - */ - static Seconds getDefaultRefreshPeriod(); - // // internal types (defined in replica_set_monitor_internal.h) // @@ -264,6 +259,16 @@ private: Milliseconds maxWait); /** + * Returns the refresh period that is given to all new SetStates. + */ + static Seconds _getDefaultRefreshPeriod(); + + /** + * When fail injection is present, override refresh period. + */ + static Seconds _overrideRefreshPeriod(Seconds original); + + /** * Schedules a refresh via the task executor. (Task is automatically canceled in the d-tor.) */ void _scheduleRefresh(Date_t when, WithLock); diff --git a/src/mongo/client/replica_set_monitor_internal.h b/src/mongo/client/replica_set_monitor_internal.h index 4c6320da554..4d563b8f5a8 100644 --- a/src/mongo/client/replica_set_monitor_internal.h +++ b/src/mongo/client/replica_set_monitor_internal.h @@ -243,10 +243,10 @@ public: mutable PseudoRandom rand; // only used for host selection to balance load // For scheduling scans - Seconds refreshPeriod; // Normal refresh period when not expedited - bool isExpedited = false; // True when we are doing more frequent refreshes due to waiters - stdx::list<Waiter> waiters; // Everyone waiting for some ReadPreference to be satisfied - ScanStatePtr currentScan; // NULL if no scan in progress + const Seconds refreshPeriod; // Normal refresh period when not expedited + bool isExpedited = false; // True when we are doing more frequent refreshes due to waiters + stdx::list<Waiter> waiters; // Everyone waiting for some ReadPreference to be satisfied + ScanStatePtr currentScan; // NULL if no scan in progress }; struct ReplicaSetMonitor::ScanState { |