diff options
Diffstat (limited to 'jstests/replsets/internal_sessions_reaping_basic.js')
| -rw-r--r-- | jstests/replsets/internal_sessions_reaping_basic.js | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/jstests/replsets/internal_sessions_reaping_basic.js b/jstests/replsets/internal_sessions_reaping_basic.js index fabadc422b0..ca2dbc06597 100644 --- a/jstests/replsets/internal_sessions_reaping_basic.js +++ b/jstests/replsets/internal_sessions_reaping_basic.js @@ -1,7 +1,11 @@ /** - * Tests that the logical session cache reaper would only reap the config.transactions and - * config.image_collection entries for a transaction session if the logical session that it - * corresponds to has expired and been removed from the config.system.sessions collection. + * Tests that the reaper does not reap expired internal transaction sessions for non-retryable + * writes or non-internal transaction sessions until the logical sessions that they correspond to + * have expired. + * + * Tests that the logical session cache reaper reaps expired internal transaction sessions for old + * retryable writes even when the config.system.sessions entries for the logical sessions that they + * correspond to still exist (i.e. the logical sessions still haven't expired). * * @tags: [requires_fcv_60, uses_transactions] */ @@ -20,12 +24,9 @@ const rst = new ReplSetTest({ nodeOptions: { setParameter: { maxSessions: 1, - // Force batch size 1 on secondaries. - replBatchLimitOperations: 1, // Make transaction records expire immediately. TransactionRecordMinimumLifetimeMinutes: 0, - storeFindAndModifyImagesInSideCollection: true, - internalSessionsReapThreshold: 0 + storeFindAndModifyImagesInSideCollection: true } } }); @@ -96,17 +97,18 @@ let numTransactionsCollEntriesReaped = 0; assert.eq({_id: 0, x: 0, y: 0}, testColl.findOne({_id: 0})); - // Verify that the config.transactions entry for the internal transaction session does not get - // reaped automatically when the transaction committed. + // Verify that the config.transactions entry for the internal transaction session for + // non-retryable write does not get reaped automatically when the transaction committed. assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); assert.eq(1, transactionsColl.find(childLsidFilter).itcount()); assert.eq(1, imageColl.find(parentLsidFilter).itcount()); assert.eq(0, imageColl.find(childLsidFilter).itcount()); - // Force the logical session cache to reap, and verify that the config.transactions (and - // config.image_collection) entries for both transaction sessions do not get reaped because the - // config.system.sessions entry still has not been deleted. + // Force the logical session cache to reap, and verify that the config.transactions entries for + // the internal transaction session for non-retryable write and the non-internal transaction + // session do not get reaped because the config.system.sessions entry still has not been + // deleted. assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); @@ -115,8 +117,7 @@ let numTransactionsCollEntriesReaped = 0; assert.eq(0, imageColl.find(childLsidFilter).itcount()); // Delete the config.system.sessions entry, force the logical session cache to reap again, and - // verify that the config.transactions (and config.image_collection) entries for both sessions - // do get reaped this time. + // verify that the config.transactions entries for both sessions do get reaped this time. assert.commandWorked(sessionsColl.remove({})); assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); assert.eq(0, sessionsColl.find({"_id.id": sessionUUID}).itcount()); @@ -142,7 +143,6 @@ let numTransactionsCollEntriesReaped = 0; assert.commandWorked(primary.adminCommand({refreshLogicalSessionCacheNow: 1})); assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); - assert.eq(1, imageColl.find(parentLsidFilter).itcount()); parentTxnNumber++; const childLsid = {id: sessionUUID, txnNumber: NumberLong(parentTxnNumber), txnUUID: UUID()}; @@ -172,55 +172,51 @@ let numTransactionsCollEntriesReaped = 0; autocommit: false })); - // Verify that the config.transactions and config.image_collection entries for the internal - // transaction session do not get reaped automatically when the new txnNumber started since - // eager reaping is not enabled. + // Verify that the the config.transactions entry and config.image_collection entry for the + // internal transaction session for the previous retryable write do not get reaped automatically + // when the new txnNumber started. assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); assert.eq(1, transactionsColl.find(childLsidFilter).itcount()); assert.eq(1, imageColl.find(parentLsidFilter).itcount()); assert.eq(1, imageColl.find(childLsidFilter).itcount()); - // Force the logical session cache to reap, and verify that the config.transactions and - // config.image_collection entries for both transaction sessions do not get reaped because the - // config.system.sessions entry still has not been deleted. + // Force the logical session cache to reap, and verify that the config.transactions entry and + // config.image_collection entry for the internal transaction session for the previous + // retryable write do get reaped although the config.system.sessions entry still has not been + // deleted. assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); - assert.eq(1, transactionsColl.find(childLsidFilter).itcount()); + assert.eq(0, transactionsColl.find(childLsidFilter).itcount()); assert.eq(1, imageColl.find(parentLsidFilter).itcount()); - assert.eq(1, imageColl.find(childLsidFilter).itcount()); + assert.eq(0, imageColl.find(childLsidFilter).itcount()); + numTransactionsCollEntriesReaped++; assert.commandWorked( testDB.adminCommand(makeCommitTransactionCmdObj(parentLsid, parentTxnNumber))); assert.eq({_id: 1, x: 1, y: 1}, testColl.findOne({_id: 1})); assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); - assert.eq(1, transactionsColl.find(childLsidFilter).itcount()); assert.eq(1, imageColl.find(parentLsidFilter).itcount()); - assert.eq(1, imageColl.find(childLsidFilter).itcount()); - // Force the logical session cache to reap, and verify that the config.transactions and - // config.image_collection entries for both transaction sessions do not get reaped because the - // config.system.sessions entry still has not been deleted. + // Force the logical session cache to reap, and verify that the config.transactions entry and + // config.image_collection entry for the non-internal transaction session do not get reaped + // because the config.system.sessions entry still has not been deleted. assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); assert.eq(1, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(1, transactionsColl.find(parentLsidFilter).itcount()); - assert.eq(1, transactionsColl.find(childLsidFilter).itcount()); assert.eq(1, imageColl.find(parentLsidFilter).itcount()); - assert.eq(1, imageColl.find(childLsidFilter).itcount()); // Delete the config.system.sessions entry, force the logical session cache to reap again, and - // verify that the config.transactions and config.image_collection entries for both transaction - // sessions do get reaped this time. + // verify that the config.transactions entry for the expired transaction session does get + // reaped this time. assert.commandWorked(sessionsColl.remove({})); assert.commandWorked(primary.adminCommand({reapLogicalSessionCacheNow: 1})); assert.eq(0, sessionsColl.find({"_id.id": sessionUUID}).itcount()); assert.eq(0, transactionsColl.find(parentLsidFilter).itcount()); - assert.eq(0, transactionsColl.find(childLsidFilter).itcount()); assert.eq(0, imageColl.find(parentLsidFilter).itcount()); - assert.eq(0, imageColl.find(childLsidFilter).itcount()); - numTransactionsCollEntriesReaped += 2; + numTransactionsCollEntriesReaped++; } // Validate that writes to config.transactions do not generate oplog entries, with the exception of |
