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 /src/mongo/util/fail_point.cpp | |
parent | 4d9046298c4f7ddaeceebfbab9080527715624e3 (diff) | |
download | mongo-ff31e4391df93b9186bee6366e194c08173fd1c7.tar.gz |
add timeout
Diffstat (limited to 'src/mongo/util/fail_point.cpp')
-rw-r--r-- | src/mongo/util/fail_point.cpp | 22 |
1 files changed, 20 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; } |