summaryrefslogtreecommitdiff
path: root/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp
diff options
context:
space:
mode:
authorBen Caimano <ben.caimano@10gen.com>2019-04-26 15:03:46 -0400
committerBen Caimano <ben.caimano@10gen.com>2019-06-21 17:02:30 -0400
commit1eff33bd1a8d48eb607675f87faf1836ba325006 (patch)
tree80149c8ff06158f7fdaaa0014500c06d080575a4 /src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp
parent8c4dfc2ba0568bd128a27f6481994758ce5f1c10 (diff)
downloadmongo-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.cpp52
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