diff options
author | Andrew Morrow <acm@mongodb.com> | 2019-02-28 12:45:20 -0500 |
---|---|---|
committer | Andrew Morrow <acm@mongodb.com> | 2019-03-13 16:20:23 -0400 |
commit | 79678803c2ba59777008156873d1d78108adf7b8 (patch) | |
tree | 484069ff8d5068b85dca17bdf2364c0486287c00 | |
parent | 5f28b425c706faa9e308cbe97217e29adc3fba33 (diff) | |
download | mongo-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.cpp | 8 |
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(); } |