diff options
Diffstat (limited to 'jstests/replsets/sessions_collection_reaping.js')
-rw-r--r-- | jstests/replsets/sessions_collection_reaping.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/jstests/replsets/sessions_collection_reaping.js b/jstests/replsets/sessions_collection_reaping.js new file mode 100644 index 00000000000..a93e756dd63 --- /dev/null +++ b/jstests/replsets/sessions_collection_reaping.js @@ -0,0 +1,75 @@ +(function() { + "use strict"; + + // This test makes assertions about the number of sessions, which are not compatible with + // implicit sessions. + TestData.disableImplicitSessions = true; + + let replTest = new ReplSetTest({ + name: 'reaping', + nodes: [ + {/* primary */}, + {/* secondary */ rsConfig: {priority: 0}}, + {/* arbiter */ rsConfig: {arbiterOnly: true}} + ], + nodeOptions: {setParameter: {TransactionRecordMinimumLifetimeMinutes: 0}} + }); + let nodes = replTest.startSet(); + + replTest.initiate(); + let primary = replTest.getPrimary(); + let sessionsCollOnPrimary = primary.getDB("config").system.sessions; + let transactionsCollOnPrimary = primary.getDB("config").transactions; + + replTest.awaitSecondaryNodes(); + let secondary = replTest.getSecondary(); + let arbiter = replTest.getArbiter(); + + const dbName = jsTestName(); + const collName = "test"; + const reapErrorMsgRegex = + new RegExp("Sessions collection is not set up.*waiting until next sessions reap interval"); + + // Set up a session with a retryable write. + let session = primary.startSession({retryWrites: 1}); + assert.commandWorked(session.getDatabase(dbName)[collName].save({x: 1})); + assert.commandWorked(primary.adminCommand({refreshLogicalSessionCacheNow: 1})); + assert.eq(1, sessionsCollOnPrimary.count()); + assert.eq(1, transactionsCollOnPrimary.count()); + + // Remove the session doc so the session gets reaped when reapLogicalSessionCacheNow is run. + assert.commandWorked(sessionsCollOnPrimary.remove({})); + + // Test that a reap on a secondary does not lead to the on-disk state reaping of the session + // since the session does not exist in the secondary's session catalog. + { + assert.commandWorked(secondary.adminCommand({clearLog: 'global'})); + assert.commandWorked(secondary.adminCommand({reapLogicalSessionCacheNow: 1})); + + assert.eq(1, transactionsCollOnPrimary.count()); + assert.eq(false, checkLog.checkContainsOnce(secondary, reapErrorMsgRegex)); + } + + // Test that a reap on an arbiter does not lead to reaping of the session. + { + assert.commandWorked(arbiter.adminCommand({clearLog: 'global'})); + assert.commandWorked(arbiter.adminCommand({reapLogicalSessionCacheNow: 1})); + + assert.eq(1, transactionsCollOnPrimary.count()); + + if (!jsTest.options().useRandomBinVersionsWithinReplicaSet) { + // Verify that the arbiter did not try to reap the session. + assert.eq(false, checkLog.checkContainsOnce(arbiter, reapErrorMsgRegex)); + } + } + + // Test that a reap on the primary works as expected. + { + assert.commandWorked(primary.adminCommand({clearLog: 'global'})); + assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); + + assert.eq(0, transactionsCollOnPrimary.count()); + } + + replTest.stopSet(); +})(); |