diff options
Diffstat (limited to 'jstests/core/txns/no_implicit_collection_creation_in_txn.js')
-rw-r--r-- | jstests/core/txns/no_implicit_collection_creation_in_txn.js | 201 |
1 files changed, 98 insertions, 103 deletions
diff --git a/jstests/core/txns/no_implicit_collection_creation_in_txn.js b/jstests/core/txns/no_implicit_collection_creation_in_txn.js index 40de017b421..42494d50958 100644 --- a/jstests/core/txns/no_implicit_collection_creation_in_txn.js +++ b/jstests/core/txns/no_implicit_collection_creation_in_txn.js @@ -2,107 +2,102 @@ // multi-document transaction. // @tags: [uses_transactions] (function() { - "use strict"; - - const dbName = "test"; - const collName = "no_implicit_collection_creation_in_txn"; - const testDB = db.getSiblingDB(dbName); - const testColl = testDB[collName]; - - testDB.runCommand({drop: collName, writeConcern: {w: "majority"}}); - - const sessionOptions = {causalConsistency: false}; - const session = db.getMongo().startSession(sessionOptions); - const sessionDb = session.getDatabase(dbName); - const sessionColl = sessionDb[collName]; - - jsTest.log("Cannot implicitly create a collection in a transaction using insert."); - - // Insert succeeds when the collection exists. - assert.commandWorked( - testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - sessionColl.insert({_id: "doc"}); - assert.commandWorked(session.commitTransaction_forTesting()); - assert.eq({_id: "doc"}, testColl.findOne({_id: "doc"})); - - // Insert fails when the collection does not exist. - assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - assert.commandFailedWithCode(sessionColl.insert({_id: "doc"}), - ErrorCodes.OperationNotSupportedInTransaction); - - // Committing the transaction should fail, since it should never have been started. - assert.commandFailedWithCode(session.commitTransaction_forTesting(), - ErrorCodes.NoSuchTransaction); - assert.eq(null, testColl.findOne({_id: "doc"})); - - jsTest.log("Cannot implicitly create a collection in a transaction using update."); - - // Update with upsert=true succeeds when the collection exists. - assert.commandWorked( - testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: true}); - assert.commandWorked(session.commitTransaction_forTesting()); - assert.eq({_id: "doc", updated: true}, testColl.findOne({_id: "doc"})); - - // Update with upsert=true fails when the collection does not exist. - assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - assert.commandFailedWithCode( - sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: true}), - ErrorCodes.OperationNotSupportedInTransaction); - - // Committing the transaction should fail, since it should never have been started. - assert.commandFailedWithCode(session.commitTransaction_forTesting(), - ErrorCodes.NoSuchTransaction); - assert.eq(null, testColl.findOne({_id: "doc"})); - - // Update with upsert=false succeeds when the collection does not exist. - session.startTransaction({writeConcern: {w: "majority"}}); - assert.commandWorked( - sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: false})); - assert.commandWorked(session.commitTransaction_forTesting()); - assert.eq(null, testColl.findOne({_id: "doc"})); - - jsTest.log("Cannot implicitly create a collection in a transaction using findAndModify."); - - // findAndModify with upsert=true succeeds when the collection exists. - assert.commandWorked( - testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - let res = sessionColl.findAndModify( - {query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: true}); - assert.eq(null, res); - assert.commandWorked(session.commitTransaction_forTesting()); - assert.eq({_id: "doc", updated: true}, testColl.findOne({_id: "doc"})); - - // findAndModify with upsert=true fails when the collection does not exist. - assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); - - session.startTransaction({writeConcern: {w: "majority"}}); - res = assert.throws(() => sessionColl.findAndModify( - {query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: true})); - assert.commandFailedWithCode(res, ErrorCodes.OperationNotSupportedInTransaction); - - // Committing the transaction should fail, since it should never have been started. - assert.commandFailedWithCode(session.commitTransaction_forTesting(), - ErrorCodes.NoSuchTransaction); - assert.eq(null, testColl.findOne({_id: "doc"})); - - // findAndModify with upsert=false succeeds when the collection does not exist. - session.startTransaction({writeConcern: {w: "majority"}}); - res = sessionColl.findAndModify( - {query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: false}); - assert.eq(null, res); - assert.commandWorked(session.commitTransaction_forTesting()); - assert.eq(null, testColl.findOne({_id: "doc"})); - - session.endSession(); +"use strict"; + +const dbName = "test"; +const collName = "no_implicit_collection_creation_in_txn"; +const testDB = db.getSiblingDB(dbName); +const testColl = testDB[collName]; + +testDB.runCommand({drop: collName, writeConcern: {w: "majority"}}); + +const sessionOptions = { + causalConsistency: false +}; +const session = db.getMongo().startSession(sessionOptions); +const sessionDb = session.getDatabase(dbName); +const sessionColl = sessionDb[collName]; + +jsTest.log("Cannot implicitly create a collection in a transaction using insert."); + +// Insert succeeds when the collection exists. +assert.commandWorked(testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +sessionColl.insert({_id: "doc"}); +assert.commandWorked(session.commitTransaction_forTesting()); +assert.eq({_id: "doc"}, testColl.findOne({_id: "doc"})); + +// Insert fails when the collection does not exist. +assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +assert.commandFailedWithCode(sessionColl.insert({_id: "doc"}), + ErrorCodes.OperationNotSupportedInTransaction); + +// Committing the transaction should fail, since it should never have been started. +assert.commandFailedWithCode(session.commitTransaction_forTesting(), ErrorCodes.NoSuchTransaction); +assert.eq(null, testColl.findOne({_id: "doc"})); + +jsTest.log("Cannot implicitly create a collection in a transaction using update."); + +// Update with upsert=true succeeds when the collection exists. +assert.commandWorked(testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: true}); +assert.commandWorked(session.commitTransaction_forTesting()); +assert.eq({_id: "doc", updated: true}, testColl.findOne({_id: "doc"})); + +// Update with upsert=true fails when the collection does not exist. +assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +assert.commandFailedWithCode( + sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: true}), + ErrorCodes.OperationNotSupportedInTransaction); + +// Committing the transaction should fail, since it should never have been started. +assert.commandFailedWithCode(session.commitTransaction_forTesting(), ErrorCodes.NoSuchTransaction); +assert.eq(null, testColl.findOne({_id: "doc"})); + +// Update with upsert=false succeeds when the collection does not exist. +session.startTransaction({writeConcern: {w: "majority"}}); +assert.commandWorked(sessionColl.update({_id: "doc"}, {$set: {updated: true}}, {upsert: false})); +assert.commandWorked(session.commitTransaction_forTesting()); +assert.eq(null, testColl.findOne({_id: "doc"})); + +jsTest.log("Cannot implicitly create a collection in a transaction using findAndModify."); + +// findAndModify with upsert=true succeeds when the collection exists. +assert.commandWorked(testDB.createCollection(testColl.getName(), {writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +let res = + sessionColl.findAndModify({query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: true}); +assert.eq(null, res); +assert.commandWorked(session.commitTransaction_forTesting()); +assert.eq({_id: "doc", updated: true}, testColl.findOne({_id: "doc"})); + +// findAndModify with upsert=true fails when the collection does not exist. +assert.commandWorked(testDB.runCommand({drop: collName, writeConcern: {w: "majority"}})); + +session.startTransaction({writeConcern: {w: "majority"}}); +res = assert.throws(() => sessionColl.findAndModify( + {query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: true})); +assert.commandFailedWithCode(res, ErrorCodes.OperationNotSupportedInTransaction); + +// Committing the transaction should fail, since it should never have been started. +assert.commandFailedWithCode(session.commitTransaction_forTesting(), ErrorCodes.NoSuchTransaction); +assert.eq(null, testColl.findOne({_id: "doc"})); + +// findAndModify with upsert=false succeeds when the collection does not exist. +session.startTransaction({writeConcern: {w: "majority"}}); +res = sessionColl.findAndModify( + {query: {_id: "doc"}, update: {$set: {updated: true}}, upsert: false}); +assert.eq(null, res); +assert.commandWorked(session.commitTransaction_forTesting()); +assert.eq(null, testColl.findOne({_id: "doc"})); + +session.endSession(); }()); |