summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chan <jason.chan@10gen.com>2019-04-09 11:33:37 -0400
committerJason Chan <jason.chan@10gen.com>2019-04-09 11:34:04 -0400
commit9f40ea669153868ee1df20ff8952b4f264198ce1 (patch)
treeb585b9dc77779227fb631c368c332ed4afe1284a
parent3e7d0821ad83fb29b25ced2b6cf9db313b19ce9b (diff)
downloadmongo-9f40ea669153868ee1df20ff8952b4f264198ce1.tar.gz
SERVER-40331 Add commit and abort jstests for transactions larger than 16MB
-rw-r--r--buildscripts/resmokeconfig/suites/core_txns_multi_oplog_entries.yml4
-rw-r--r--jstests/core/txns/commit_and_abort_large_prepared_transactions.js62
-rw-r--r--jstests/core/txns/commit_and_abort_large_unprepared_transactions.js59
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(), []);
+}());