summaryrefslogtreecommitdiff
path: root/src/mongo/util/fail_point.cpp
diff options
context:
space:
mode:
authorLingzhi Deng <lingzhi.deng@mongodb.com>2019-07-16 13:45:39 -0400
committerLingzhi Deng <lingzhi.deng@mongodb.com>2019-07-16 13:45:39 -0400
commitff31e4391df93b9186bee6366e194c08173fd1c7 (patch)
tree51fde237ab2fdab8e38a4710f51e49e5db0932c1 /src/mongo/util/fail_point.cpp
parent4d9046298c4f7ddaeceebfbab9080527715624e3 (diff)
downloadmongo-ff31e4391df93b9186bee6366e194c08173fd1c7.tar.gz
add timeout
Diffstat (limited to 'src/mongo/util/fail_point.cpp')
-rw-r--r--src/mongo/util/fail_point.cpp22
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;
}