summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Shuvalov <andrew.shuvalov@mongodb.com>2021-07-19 20:31:06 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-07-19 21:09:32 +0000
commitf335e286672490f71f368d82a2f842c7e03a587d (patch)
tree02b615aa95f60f7d9d229cce40ff228c17b91d15
parent6109f0ff6d99133cba34aef32ac86810f0afbde7 (diff)
downloadmongo-f335e286672490f71f368d82a2f842c7e03a587d.tar.gz
SERVER-58623: make RSM to respect refresh interval fail injection after init
-rw-r--r--src/mongo/client/replica_set_monitor.cpp18
-rw-r--r--src/mongo/client/replica_set_monitor.h15
-rw-r--r--src/mongo/client/replica_set_monitor_internal.h8
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 {