diff options
author | Ben Caimano <ben.caimano@10gen.com> | 2019-04-26 15:03:46 -0400 |
---|---|---|
committer | Ben Caimano <ben.caimano@10gen.com> | 2019-06-21 17:02:30 -0400 |
commit | 1eff33bd1a8d48eb607675f87faf1836ba325006 (patch) | |
tree | 80149c8ff06158f7fdaaa0014500c06d080575a4 /src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp | |
parent | 8c4dfc2ba0568bd128a27f6481994758ce5f1c10 (diff) | |
download | mongo-1eff33bd1a8d48eb607675f87faf1836ba325006.tar.gz |
SERVER-39936 Use PeriodicRunner handles to simplify shutdown ordering
Diffstat (limited to 'src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp')
-rw-r--r-- | src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp b/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp index f3fa239daac..0f55d053fb3 100644 --- a/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp +++ b/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp @@ -58,13 +58,32 @@ Milliseconds getPeriod(const Argument& transactionLifetimeLimitSeconds) { return period; } + } // namespace -void startPeriodicThreadToAbortExpiredTransactions(ServiceContext* serviceContext) { - // Enforce calling this function once, and only once. - static bool firstCall = true; - invariant(firstCall); - firstCall = false; +auto PeriodicThreadToAbortExpiredTransactions::get(ServiceContext* serviceContext) + -> PeriodicThreadToAbortExpiredTransactions& { + auto& jobContainer = _serviceDecoration(serviceContext); + jobContainer._init(serviceContext); + + return jobContainer; +} + +auto PeriodicThreadToAbortExpiredTransactions::operator*() const noexcept -> PeriodicJobAnchor& { + stdx::lock_guard lk(_mutex); + return *_anchor; +} + +auto PeriodicThreadToAbortExpiredTransactions::operator-> () const noexcept -> PeriodicJobAnchor* { + stdx::lock_guard lk(_mutex); + return _anchor.get(); +} + +void PeriodicThreadToAbortExpiredTransactions::_init(ServiceContext* serviceContext) { + stdx::lock_guard lk(_mutex); + if (_anchor) { + return; + } auto periodicRunner = serviceContext->getPeriodicRunner(); invariant(periodicRunner); @@ -87,18 +106,17 @@ void startPeriodicThreadToAbortExpiredTransactions(ServiceContext* serviceContex }, getPeriod(gTransactionLifetimeLimitSeconds.load())); - auto handle = periodicRunner->makeJob(std::move(job)); - handle->start(); - - TransactionParticipant::observeTransactionLifetimeLimitSeconds - .addObserver([handle = std::move(handle)](const Argument& secs) { - try { - handle->setPeriod(getPeriod(secs)); - } catch (const DBException& ex) { - log() << "Failed to update period of thread which aborts expired transactions " - << ex.toStatus(); - } - }); + _anchor = std::make_shared<PeriodicJobAnchor>(periodicRunner->makeJob(std::move(job))); + + TransactionParticipant::observeTransactionLifetimeLimitSeconds.addObserver([anchor = _anchor]( + const Argument& secs) { + try { + anchor->setPeriod(getPeriod(secs)); + } catch (const DBException& ex) { + log() << "Failed to update period of thread which aborts expired transactions " + << ex.toStatus(); + } + }); } } // namespace mongo |