summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Chan <jason.chan@10gen.com>2020-11-10 12:07:35 -0500
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-11-12 07:02:09 +0000
commite399bf8689f592129c9655933bdb6a0e551a47b8 (patch)
tree0609ae3f7617076eb13c6d7f38453f44a74cfdac /src
parent0ed9f1bf7d27e43174ce806291a597947b1f98ae (diff)
downloadmongo-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.cpp16
-rw-r--r--src/mongo/db/session.cpp15
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);