diff options
author | Lingzhi Deng <lingzhi.deng@mongodb.com> | 2019-07-16 13:45:39 -0400 |
---|---|---|
committer | Lingzhi Deng <lingzhi.deng@mongodb.com> | 2019-07-16 13:45:39 -0400 |
commit | ff31e4391df93b9186bee6366e194c08173fd1c7 (patch) | |
tree | 51fde237ab2fdab8e38a4710f51e49e5db0932c1 | |
parent | 4d9046298c4f7ddaeceebfbab9080527715624e3 (diff) | |
download | mongo-ff31e4391df93b9186bee6366e194c08173fd1c7.tar.gz |
add timeout
-rw-r--r-- | src/mongo/util/fail_point.cpp | 22 | ||||
-rw-r--r-- | src/mongo/util/fail_point.h | 2 |
2 files changed, 22 insertions, 2 deletions
diff --git a/src/mongo/util/fail_point.cpp b/src/mongo/util/fail_point.cpp index e51d6e22756..30e1fbe8e8a 100644 --- a/src/mongo/util/fail_point.cpp +++ b/src/mongo/util/fail_point.cpp @@ -113,9 +113,24 @@ void FailPoint::sync() const { _activeSignals.insert(s); } _condVar.notify_all(); - auto timeout = Seconds(60); + const auto deadline = _syncConfig.timeoutSec > 0 + ? Date_t::now() + Seconds(_syncConfig.timeoutSec) + : Date_t::max(); while (!isSynced()) { - _condVar.wait_for(lk, timeout.toSystemDuration()); + Milliseconds timeout; + if (deadline == Date_t::max()) { + timeout = Milliseconds::max(); + } else { + auto now = Date_t::now(); + if (deadline <= now) { + timeout = Milliseconds(0); + } else { + timeout = deadline - Date_t::now(); + } + } + uassert(ErrorCodes::ExceededTimeLimit, + "Timed out waiting for signals", + _condVar.wait_for(lk, timeout.toSystemDuration()) != stdx::cv_status::timeout); } if (_syncConfig.clearSignals && !_syncConfig.waitFor.empty()) { for (auto& w : _syncConfig.waitFor) { @@ -338,6 +353,9 @@ FailPoint::parseBSON(const BSONObj& obj) { if (syncObj.hasField("clearSignals")) { syncConfig.clearSignals = syncObj["clearSignals"].Bool(); } + if (syncObj.hasField("timeout")) { + syncConfig.timeoutSec = syncObj["timeout"].numberLong(); + } syncConfig.enabled = true; } diff --git a/src/mongo/util/fail_point.h b/src/mongo/util/fail_point.h index 6c8abc05e5d..7c00827fc73 100644 --- a/src/mongo/util/fail_point.h +++ b/src/mongo/util/fail_point.h @@ -87,6 +87,8 @@ public: std::unordered_set<std::string> waitFor; // Clear waitFor signals afterwards. bool clearSignals = false; + // The number of seconds to wait for signals. + long long timeoutSec = 0; }; /** |