summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTess Avitabile <tess.avitabile@mongodb.com>2020-06-09 15:45:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-06-09 18:37:47 +0000
commit63572d7f6f3b84c7d65f3bd3fe62c7ccbcc42db0 (patch)
treeabf1900a13fb0dd282bf0ab745d01b2a784c6eff
parent80884df534d2fb033c6ec60d0672f5c45395ec28 (diff)
downloadmongo-63572d7f6f3b84c7d65f3bd3fe62c7ccbcc42db0.tar.gz
Revert "SERVER-47645 Must invalidate all sessions on stepdown"
This reverts commit 5f1a69aaf69bc12124f68e7b489a1437f9cdd575.
-rw-r--r--buildscripts/resmokeconfig/suites/replica_sets_multiversion.yml1
-rw-r--r--etc/backports_required_for_multiversion_tests.yml2
-rw-r--r--jstests/replsets/invalidate_sessions_on_stepdown.js67
-rw-r--r--src/mongo/db/kill_sessions_local.cpp20
-rw-r--r--src/mongo/db/kill_sessions_local.h6
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp2
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp2
-rw-r--r--src/mongo/db/transaction_participant.cpp3
-rw-r--r--src/mongo/db/transaction_validation.cpp4
9 files changed, 2 insertions, 105 deletions
diff --git a/buildscripts/resmokeconfig/suites/replica_sets_multiversion.yml b/buildscripts/resmokeconfig/suites/replica_sets_multiversion.yml
index 09256abc246..87577f23687 100644
--- a/buildscripts/resmokeconfig/suites/replica_sets_multiversion.yml
+++ b/buildscripts/resmokeconfig/suites/replica_sets_multiversion.yml
@@ -10,7 +10,6 @@ selector:
- jstests/replsets/initial_sync_rename_collection.js
- jstests/replsets/initial_sync_drop_collection.js
- jstests/replsets/step_down_chaining_disabled.js
- - jstests/replsets/invalidate_sessions_on_stepdown.js
executor:
config:
shell_options:
diff --git a/etc/backports_required_for_multiversion_tests.yml b/etc/backports_required_for_multiversion_tests.yml
index 469938a0b38..23156558590 100644
--- a/etc/backports_required_for_multiversion_tests.yml
+++ b/etc/backports_required_for_multiversion_tests.yml
@@ -84,5 +84,3 @@ replica_sets_multiversion:
test_file: jstests/replsets/transactions_during_step_down.js
- ticket: SERVER-43614
test_file: jstests/replsets/read_operations_during_step_up.js
-- ticket: SERVER-47645
- test_file: jstests/replsets/invalidate_sessions_on_stepdown.js
diff --git a/jstests/replsets/invalidate_sessions_on_stepdown.js b/jstests/replsets/invalidate_sessions_on_stepdown.js
deleted file mode 100644
index 50916865780..00000000000
--- a/jstests/replsets/invalidate_sessions_on_stepdown.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Tests that a txnNumber for a transaction that was aborted in-memory can be reused by a new
- * primary. Mongos does this as an optimization.
- * @tags: [uses_transactions, uses_prepare_transaction]
- */
-(function() {
-"use strict";
-
-const rst = new ReplSetTest({name: "invalidate_sessions_on_stepdown", nodes: 2});
-rst.startSet();
-rst.initiateWithHighElectionTimeout();
-
-const dbName = "test";
-const collName = "coll";
-const node0 = rst.getPrimary();
-const node1 = rst.getSecondary();
-const node0Session = node0.startSession();
-const sessionId = node0Session.getSessionId();
-const node0SessionDB = node0Session.getDatabase(dbName);
-
-assert.commandWorked(node0SessionDB.coll.insert({a: 1}, {writeConcern: {"w": "majority"}}));
-
-jsTestLog("Run a transaction with txnNumber 0 on the primary.");
-assert.commandWorked(node0SessionDB.runCommand({
- insert: collName,
- documents: [{b: 1}],
- txnNumber: NumberLong(0),
- startTransaction: true,
- autocommit: false
-}));
-
-jsTestLog("Step up the secondary. The primary will abort the transaction when it steps down.");
-assert.commandWorked(node1.adminCommand({replSetStepUp: 1}));
-assert.eq(node1, rst.getPrimary());
-
-const node1DB = node1.getDB(dbName);
-
-jsTestLog("Run a transaction with txnNumber 0 and the same session ID on the new primary.");
-assert.commandWorked(node1DB.runCommand({
- insert: collName,
- documents: [{c: 1}],
- lsid: sessionId,
- txnNumber: NumberLong(0),
- startTransaction: true,
- autocommit: false
-}));
-let res = assert.commandWorked(node1DB.adminCommand({
- prepareTransaction: 1,
- lsid: sessionId,
- txnNumber: NumberLong(0),
- autocommit: false,
- writeConcern: {w: "majority"}
-}));
-assert.commandWorked(node1DB.adminCommand({
- commitTransaction: 1,
- commitTimestamp: res.prepareTimestamp,
- lsid: sessionId,
- txnNumber: NumberLong(0),
- autocommit: false,
- writeConcern: {w: "majority"}
-}));
-assert.eq(2, node0SessionDB.coll.find().itcount());
-assert.eq(0, node0SessionDB.coll.find({b: 1}).itcount());
-assert.eq(1, node0SessionDB.coll.find({c: 1}).itcount());
-
-rst.stopSet();
-})();
diff --git a/src/mongo/db/kill_sessions_local.cpp b/src/mongo/db/kill_sessions_local.cpp
index d1570e2f2e9..d1b57090e54 100644
--- a/src/mongo/db/kill_sessions_local.cpp
+++ b/src/mongo/db/kill_sessions_local.cpp
@@ -218,24 +218,4 @@ void yieldLocksForPreparedTransactions(OperationContext* opCtx) {
ErrorCodes::InterruptedDueToReplStateChange);
}
-void invalidateSessionsForStepdown(OperationContext* opCtx) {
- // It is illegal to invalidate the sessions if the operation has a session checked out.
- invariant(!OperationContextSession::get(opCtx));
-
- SessionKiller::Matcher matcherAllSessions(
- KillAllSessionsByPatternSet{makeKillAllSessionsByPattern(opCtx)});
- killSessionsAction(opCtx,
- matcherAllSessions,
- [](const ObservableSession& session) {
- return !TransactionParticipant::get(session).transactionIsPrepared();
- },
- [](OperationContext* killerOpCtx, const SessionToKill& session) {
- auto txnParticipant = TransactionParticipant::get(session);
- if (!txnParticipant.transactionIsPrepared()) {
- txnParticipant.invalidate(killerOpCtx);
- }
- },
- ErrorCodes::InterruptedDueToReplStateChange);
-}
-
} // namespace mongo
diff --git a/src/mongo/db/kill_sessions_local.h b/src/mongo/db/kill_sessions_local.h
index e489589bdce..6b4da948e1c 100644
--- a/src/mongo/db/kill_sessions_local.h
+++ b/src/mongo/db/kill_sessions_local.h
@@ -71,10 +71,4 @@ void killSessionsAbortAllPreparedTransactions(OperationContext* opCtx);
*/
void yieldLocksForPreparedTransactions(OperationContext* opCtx);
-/**
- * Invalidates sessions that do not have prepared transactions, since txnNumbers for transactions
- * that were aborted in-memory may be reused on the new primary.
- */
-void invalidateSessionsForStepdown(OperationContext* opCtx);
-
} // namespace mongo
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp
index 531accbbeb6..58695c67f68 100644
--- a/src/mongo/db/repl/replication_coordinator_impl.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl.cpp
@@ -2707,7 +2707,6 @@ void ReplicationCoordinatorImpl::stepDown(OperationContext* opCtx,
lk.unlock();
yieldLocksForPreparedTransactions(opCtx);
- invalidateSessionsForStepdown(opCtx);
lk.lock();
@@ -3573,7 +3572,6 @@ void ReplicationCoordinatorImpl::_finishReplSetReconfig(OperationContext* opCtx,
lk.unlock();
yieldLocksForPreparedTransactions(opCtx);
- invalidateSessionsForStepdown(opCtx);
lk.lock();
diff --git a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp
index fc90826da9f..694b1e7647f 100644
--- a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp
@@ -508,7 +508,6 @@ void ReplicationCoordinatorImpl::_stepDownFinish(
lk.unlock();
yieldLocksForPreparedTransactions(opCtx.get());
- invalidateSessionsForStepdown(opCtx.get());
lk.lock();
@@ -785,7 +784,6 @@ void ReplicationCoordinatorImpl::_heartbeatReconfigFinish(
lk.unlock();
yieldLocksForPreparedTransactions(opCtx.get());
- invalidateSessionsForStepdown(opCtx.get());
lk.lock();
diff --git a/src/mongo/db/transaction_participant.cpp b/src/mongo/db/transaction_participant.cpp
index 9b7d6ae21d3..2c32352c856 100644
--- a/src/mongo/db/transaction_participant.cpp
+++ b/src/mongo/db/transaction_participant.cpp
@@ -590,9 +590,6 @@ void TransactionParticipant::Participant::beginOrContinueTransactionUnconditiona
if (o().activeTxnNumber != txnNumber) {
_beginMultiDocumentTransaction(opCtx, txnNumber);
- } else {
- invariant(o().txnState.isInSet(TransactionState::kInProgress | TransactionState::kPrepared),
- str::stream() << "Current state: " << o().txnState);
}
// Assume we need to write an abort if we abort this transaction. This method is called only
diff --git a/src/mongo/db/transaction_validation.cpp b/src/mongo/db/transaction_validation.cpp
index f2360df18b6..9342e07d1b9 100644
--- a/src/mongo/db/transaction_validation.cpp
+++ b/src/mongo/db/transaction_validation.cpp
@@ -53,8 +53,8 @@ const StringMap<int> retryableWriteCommands = {{"delete", 1},
{"_recvChunkStart", 1}};
// Commands that can be sent with session info but should not check out a session.
-const StringMap<int> skipSessionCheckoutList = {
- {"coordinateCommitTransaction", 1}, {"_recvChunkStart", 1}, {"replSetStepDown", 1}};
+const StringMap<int> skipSessionCheckoutList = {{"coordinateCommitTransaction", 1},
+ {"_recvChunkStart", 1}};
const StringMap<int> transactionCommands = {{"commitTransaction", 1},
{"coordinateCommitTransaction", 1},