summaryrefslogtreecommitdiff
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
parent4d9046298c4f7ddaeceebfbab9080527715624e3 (diff)
downloadmongo-ff31e4391df93b9186bee6366e194c08173fd1c7.tar.gz
add timeout
-rw-r--r--src/mongo/util/fail_point.cpp22
-rw-r--r--src/mongo/util/fail_point.h2
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;
};
/**