diff options
author | Tess Avitabile <tess.avitabile@mongodb.com> | 2020-06-09 15:45:47 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-06-09 18:37:47 +0000 |
commit | 63572d7f6f3b84c7d65f3bd3fe62c7ccbcc42db0 (patch) | |
tree | abf1900a13fb0dd282bf0ab745d01b2a784c6eff | |
parent | 80884df534d2fb033c6ec60d0672f5c45395ec28 (diff) | |
download | mongo-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.yml | 1 | ||||
-rw-r--r-- | etc/backports_required_for_multiversion_tests.yml | 2 | ||||
-rw-r--r-- | jstests/replsets/invalidate_sessions_on_stepdown.js | 67 | ||||
-rw-r--r-- | src/mongo/db/kill_sessions_local.cpp | 20 | ||||
-rw-r--r-- | src/mongo/db/kill_sessions_local.h | 6 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/transaction_participant.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/transaction_validation.cpp | 4 |
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}, |