diff options
author | Jason Chan <jason.chan@10gen.com> | 2019-04-09 11:33:37 -0400 |
---|---|---|
committer | Jason Chan <jason.chan@10gen.com> | 2019-04-09 11:34:04 -0400 |
commit | 9f40ea669153868ee1df20ff8952b4f264198ce1 (patch) | |
tree | b585b9dc77779227fb631c368c332ed4afe1284a | |
parent | 3e7d0821ad83fb29b25ced2b6cf9db313b19ce9b (diff) | |
download | mongo-9f40ea669153868ee1df20ff8952b4f264198ce1.tar.gz |
SERVER-40331 Add commit and abort jstests for transactions larger than 16MB
3 files changed, 121 insertions, 4 deletions
diff --git a/buildscripts/resmokeconfig/suites/core_txns_multi_oplog_entries.yml b/buildscripts/resmokeconfig/suites/core_txns_multi_oplog_entries.yml index 8d445830c75..5bd0935c5ea 100644 --- a/buildscripts/resmokeconfig/suites/core_txns_multi_oplog_entries.yml +++ b/buildscripts/resmokeconfig/suites/core_txns_multi_oplog_entries.yml @@ -10,10 +10,6 @@ test_kind: js_test selector: roots: - jstests/core/txns/**/*.js - exclude_with_any_tags: - # Exclude prepared transactions until they are supported with the new multiple transactions oplog - # entry format. - - uses_prepare_transaction executor: archive: hooks: diff --git a/jstests/core/txns/commit_and_abort_large_prepared_transactions.js b/jstests/core/txns/commit_and_abort_large_prepared_transactions.js new file mode 100644 index 00000000000..abcf4a79d9d --- /dev/null +++ b/jstests/core/txns/commit_and_abort_large_prepared_transactions.js @@ -0,0 +1,62 @@ +/** + * Tests support for prepared transactions larger than 16MB. + * + * @tags: [uses_transactions, uses_prepare_transaction] + */ + +(function() { + "use strict"; + load("jstests/core/txns/libs/prepare_helpers.js"); + + const dbName = "test"; + const collName = "large_prepared_transactions"; + const testDB = db.getSiblingDB(dbName); + const testColl = testDB.getCollection(collName); + + const paramResult = + testDB.adminCommand({"getParameter": 1, useMultipleOplogEntryFormatForTransactions: 1}); + if (!paramResult["useMultipleOplogEntryFormatForTransactions"]) { + // TODO: SERVER-39810 Remove this early return once the new oplog format for large + // transactions is made the default. + jsTestLog( + "Skipping the test because useMultipleOplogEntryFormatForTransactions is not set to true."); + return; + } + + // As we are not able to send a single request larger than 16MB, we insert two documents + // of 10MB each to create a "large" transaction. + const kSize10MB = 10 * 1024 * 1024; + function createLargeDocument(id) { + return {_id: id, longString: new Array(kSize10MB).join("a")}; + } + + testColl.drop({writeConcern: {w: "majority"}}); + assert.commandWorked( + testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); + + const session = db.getMongo().startSession({causalConsistency: false}); + const sessionDB = session.getDatabase(dbName); + const sessionColl = sessionDB.getCollection(collName); + + // Test preparing and committing a large transaction with two 10MB inserts. + let doc1 = createLargeDocument(1); + let doc2 = createLargeDocument(2); + session.startTransaction(); + assert.commandWorked(sessionColl.insert(doc1)); + assert.commandWorked(sessionColl.insert(doc2)); + + let prepareTimestamp = PrepareHelpers.prepareTransaction(session); + assert.commandWorked(PrepareHelpers.commitTransaction(session, prepareTimestamp)); + assert.sameMembers(sessionColl.find().toArray(), [doc1, doc2]); + + // Test preparing and aborting a large transaction with two 10MB inserts. + let doc3 = createLargeDocument(3); + let doc4 = createLargeDocument(4); + session.startTransaction(); + assert.commandWorked(sessionColl.insert(doc3)); + assert.commandWorked(sessionColl.insert(doc4)); + + PrepareHelpers.prepareTransaction(session); + assert.commandWorked(session.abortTransaction_forTesting()); + assert.sameMembers(sessionColl.find({_id: {$gt: 2}}).toArray(), []); +}()); diff --git a/jstests/core/txns/commit_and_abort_large_unprepared_transactions.js b/jstests/core/txns/commit_and_abort_large_unprepared_transactions.js new file mode 100644 index 00000000000..1087f6cd335 --- /dev/null +++ b/jstests/core/txns/commit_and_abort_large_unprepared_transactions.js @@ -0,0 +1,59 @@ +/** + * Tests support for unprepared transactions larger than 16MB. + * + * @tags: [uses_transactions] + */ + +(function() { + "use strict"; + + const dbName = "test"; + const collName = "large_unprepared_transactions"; + const testDB = db.getSiblingDB(dbName); + const testColl = testDB.getCollection(collName); + + const paramResult = + testDB.adminCommand({"getParameter": 1, useMultipleOplogEntryFormatForTransactions: 1}); + if (!paramResult["useMultipleOplogEntryFormatForTransactions"]) { + // TODO: SERVER-39810 Remove this early return once the new oplog format for large + // transactions is made the default. + jsTestLog( + "skipping the test because useMultipleOplogEntryFormatForTransactions is not set to true."); + return; + } + + // As we are not able to send a single request larger than 16MB, we insert two documents + // of 10MB each to create a "large" transaction. + const kSize10MB = 10 * 1024 * 1024; + function createLargeDocument(id) { + return {_id: id, longString: new Array(kSize10MB).join("a")}; + } + + testColl.drop({writeConcern: {w: "majority"}}); + assert.commandWorked( + testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); + + const session = db.getMongo().startSession({causalConsistency: false}); + const sessionDB = session.getDatabase(dbName); + const sessionColl = sessionDB.getCollection(collName); + + // Test committing an unprepared large transaction with two 10MB inserts. + let doc1 = createLargeDocument(1); + let doc2 = createLargeDocument(2); + session.startTransaction(); + assert.commandWorked(sessionColl.insert(doc1)); + assert.commandWorked(sessionColl.insert(doc2)); + + assert.commandWorked(session.commitTransaction_forTesting()); + assert.sameMembers(sessionColl.find().toArray(), [doc1, doc2]); + + // Test aborting an unprepared large transaction with two 10MB inserts. + let doc3 = createLargeDocument(3); + let doc4 = createLargeDocument(4); + session.startTransaction(); + assert.commandWorked(sessionColl.insert(doc3)); + assert.commandWorked(sessionColl.insert(doc4)); + + assert.commandWorked(session.abortTransaction_forTesting()); + assert.sameMembers(sessionColl.find({_id: {$gt: 2}}).toArray(), []); +}()); |