diff options
author | Jason Chan <jason.chan@10gen.com> | 2020-11-10 12:07:35 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-11-12 07:02:09 +0000 |
commit | e399bf8689f592129c9655933bdb6a0e551a47b8 (patch) | |
tree | 0609ae3f7617076eb13c6d7f38453f44a74cfdac /src | |
parent | 0ed9f1bf7d27e43174ce806291a597947b1f98ae (diff) | |
download | mongo-e399bf8689f592129c9655933bdb6a0e551a47b8.tar.gz |
SERVER-51598 Add new abort_multi_stmt_txn_test suites
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp | 16 | ||||
-rw-r--r-- | src/mongo/db/session.cpp | 15 |
2 files changed, 30 insertions, 1 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 e14f93d4d24..5eab0381527 100644 --- a/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp +++ b/src/mongo/db/periodic_runner_job_abort_expired_transactions.cpp @@ -38,10 +38,13 @@ #include "mongo/db/kill_sessions_local.h" #include "mongo/db/service_context.h" #include "mongo/db/session.h" +#include "mongo/util/fail_point_service.h" #include "mongo/util/log.h" #include "mongo/util/periodic_runner.h" namespace mongo { +// Used in our core transaction passthrough suites to test the abort logic for expired transactions. +MONGO_FAIL_POINT_DEFINE(increaseFrequencyOfPeriodicThreadToExpireTransactions); namespace { const auto gServiceDecoration = @@ -74,6 +77,17 @@ void PeriodicThreadToAbortExpiredTransactions::_init(ServiceContext* serviceCont auto periodicRunner = serviceContext->getPeriodicRunner(); invariant(periodicRunner); + auto jobPeriodMillis = Milliseconds(1000); + + if (MONGO_FAIL_POINT(increaseFrequencyOfPeriodicThreadToExpireTransactions)) { + // This failpoint is used in test suites in conjunction with the + // setTransactionLifetimeToRandomMillis failpoint, which sets the the transaction lifetime + // to expire in milliseconds. + jobPeriodMillis = Milliseconds(5); + log() << "increaseFrequencyOfPeriodicThreadToExpireTransactions failpoint enabled -- " + "setting frequency of periodic thread to " + << jobPeriodMillis << " ms."; + } // We want this job period to be dynamic, to run every (transactionLifetimeLimitSeconds/2) // seconds, where transactionLifetimeLimitSeconds is an adjustable server parameter, or within @@ -115,7 +129,7 @@ void PeriodicThreadToAbortExpiredTransactions::_init(ServiceContext* serviceCont killAllExpiredTransactions(opCtx.get()); }, - Seconds(1)); + jobPeriodMillis); _anchor = std::make_shared<PeriodicJobAnchor>(periodicRunner->makeJob(std::move(job))); } diff --git a/src/mongo/db/session.cpp b/src/mongo/db/session.cpp index edcc5be1294..c087ae93ce6 100644 --- a/src/mongo/db/session.cpp +++ b/src/mongo/db/session.cpp @@ -58,6 +58,7 @@ #include "mongo/db/stats/fill_locker_info.h" #include "mongo/db/stats/top.h" #include "mongo/db/transaction_history_iterator.h" +#include "mongo/platform/random.h" #include "mongo/stdx/memory.h" #include "mongo/transport/transport_layer.h" #include "mongo/util/fail_point_service.h" @@ -88,6 +89,9 @@ MONGO_EXPORT_SERVER_PARAMETER(transactionLifetimeLimitSeconds, std::int32_t, 60) return Status::OK(); }); +// Used in our core transaction passthrough suites to test the abort logic for expired transactions. +MONGO_FAIL_POINT_DEFINE(setTransactionLifetimeToRandomMillis); + namespace { @@ -588,6 +592,17 @@ void Session::_beginOrContinueTxn(WithLock wl, const auto now = curTimeMicros64(); _transactionExpireDate = Date_t::fromMillisSinceEpoch(now / 1000) + Seconds{transactionLifetimeLimitSeconds.load()}; + + if (MONGO_FAIL_POINT(setTransactionLifetimeToRandomMillis)) { + PseudoRandom prng(SecureRandom::create()->nextInt64()); + // Override the transaction lifetime to expire in the next 0-20 ms. + const auto expireMillis = prng.nextInt32(20); + log() << "setTransactionLifetimeToRandomMillis failpoint enabled -- " + << "setting transaction to expire in " << expireMillis << "ms."; + _transactionExpireDate = + Date_t::fromMillisSinceEpoch(now / 1000) + Milliseconds{expireMillis}; + } + // Tracks various transactions metrics. { stdx::lock_guard<stdx::mutex> ls(_statsMutex); |