diff options
-rw-r--r-- | src/mongo/util/fail_point.cpp | 10 | ||||
-rw-r--r-- | src/mongo/util/fail_point.h | 2 |
2 files changed, 11 insertions, 1 deletions
diff --git a/src/mongo/util/fail_point.cpp b/src/mongo/util/fail_point.cpp index b705e6a01bf..7761f3a697a 100644 --- a/src/mongo/util/fail_point.cpp +++ b/src/mongo/util/fail_point.cpp @@ -89,7 +89,7 @@ void FailPoint::shouldFailCloseBlock() { } bool FailPoint::isSynced() const { - if (_syncConfig.waitFor.size() == 0) + if (_syncConfig.waitFor.empty()) return true; for (auto w : _syncConfig.waitFor) { if (_activeSignals.find(w) == _activeSignals.end()) { @@ -117,6 +117,11 @@ void FailPoint::sync() const { while (!isSynced()) { _condVar.wait_for(lk, timeout.toSystemDuration()); } + if (_syncConfig.clearSignals && !_syncConfig.waitFor.empty()) { + for (auto& w : _syncConfig.waitFor) { + _activeSignals.erase(w); + } + } } void FailPoint::setMode(Mode mode, @@ -330,6 +335,9 @@ FailPoint::parseBSON(const BSONObj& obj) { syncConfig.waitFor.insert(e.String()); } } + if (syncObj.hasField("clearSignals")) { + syncConfig.clearSignals = syncObj["clearSignals"].Bool(); + } syncConfig.enabled = true; } diff --git a/src/mongo/util/fail_point.h b/src/mongo/util/fail_point.h index 832d90349ef..6c8abc05e5d 100644 --- a/src/mongo/util/fail_point.h +++ b/src/mongo/util/fail_point.h @@ -85,6 +85,8 @@ public: std::unordered_set<std::string> signals; // Signals to wait for when the failpoint is reached. std::unordered_set<std::string> waitFor; + // Clear waitFor signals afterwards. + bool clearSignals = false; }; /** |