summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Morrow <acm@mongodb.com>2019-02-28 12:45:20 -0500
committerAndrew Morrow <acm@mongodb.com>2019-03-13 16:20:23 -0400
commit79678803c2ba59777008156873d1d78108adf7b8 (patch)
tree484069ff8d5068b85dca17bdf2364c0486287c00
parent5f28b425c706faa9e308cbe97217e29adc3fba33 (diff)
downloadmongo-79678803c2ba59777008156873d1d78108adf7b8.tar.gz
SERVER-39830 Fix race between run() and stop() in periodic runner
(cherry picked from commit 481c786acfd066f07dfd18a9dd447e735d2af24b)
-rw-r--r--src/mongo/util/periodic_runner_impl.cpp8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/mongo/util/periodic_runner_impl.cpp b/src/mongo/util/periodic_runner_impl.cpp
index aad8d19c34f..f5fb19a8a2b 100644
--- a/src/mongo/util/periodic_runner_impl.cpp
+++ b/src/mongo/util/periodic_runner_impl.cpp
@@ -101,6 +101,8 @@ PeriodicRunnerImpl::PeriodicJobImpl::PeriodicJobImpl(PeriodicJob job,
: _job(std::move(job)), _clockSource(source), _serviceContext(svc) {}
void PeriodicRunnerImpl::PeriodicJobImpl::_run() {
+ stdx::lock_guard<stdx::mutex> lk(_mutex);
+ invariant(_execStatus == PeriodicJobImpl::ExecutionStatus::NOT_SCHEDULED);
_thread = stdx::thread([this] {
Client::initThread(_job.name, _serviceContext, nullptr);
while (true) {
@@ -125,14 +127,10 @@ void PeriodicRunnerImpl::PeriodicJobImpl::_run() {
}
}
});
+ _execStatus = PeriodicJobImpl::ExecutionStatus::RUNNING;
}
void PeriodicRunnerImpl::PeriodicJobImpl::start() {
- {
- stdx::lock_guard<stdx::mutex> lk(_mutex);
- invariant(_execStatus == PeriodicJobImpl::ExecutionStatus::NOT_SCHEDULED);
- _execStatus = PeriodicJobImpl::ExecutionStatus::RUNNING;
- }
_run();
}