diff options
Diffstat (limited to 'jstests/noPassthrough/readConcern_snapshot.js')
-rw-r--r-- | jstests/noPassthrough/readConcern_snapshot.js | 248 |
1 files changed, 122 insertions, 126 deletions
diff --git a/jstests/noPassthrough/readConcern_snapshot.js b/jstests/noPassthrough/readConcern_snapshot.js index 63413d16820..0416cd689ce 100644 --- a/jstests/noPassthrough/readConcern_snapshot.js +++ b/jstests/noPassthrough/readConcern_snapshot.js @@ -1,138 +1,134 @@ // Test parsing of readConcern level 'snapshot'. // @tags: [requires_replication, uses_transactions] (function() { - "use strict"; - - const dbName = "test"; - const collName = "coll"; - - // - // Configurations. - // - - // Transactions should fail on storage engines that do not support them. - let rst = new ReplSetTest({nodes: 1}); - rst.startSet(); - rst.initiate(); - let session = - rst.getPrimary().getDB(dbName).getMongo().startSession({causalConsistency: false}); - let sessionDb = session.getDatabase(dbName); - if (!sessionDb.serverStatus().storageEngine.supportsSnapshotReadConcern) { - // Transactions with readConcern snapshot fail. - session.startTransaction({readConcern: {level: "snapshot"}}); - assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), - ErrorCodes.IllegalOperation); - assert.commandFailedWithCode(session.abortTransaction_forTesting(), - [ErrorCodes.NoSuchTransaction, ErrorCodes.IllegalOperation]); - - // Transactions without readConcern snapshot fail. - session.startTransaction(); - assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), - ErrorCodes.IllegalOperation); - assert.commandFailedWithCode(session.abortTransaction_forTesting(), - [ErrorCodes.NoSuchTransaction, ErrorCodes.IllegalOperation]); - - rst.stopSet(); - return; - } - session.endSession(); - rst.stopSet(); - - // readConcern 'snapshot' is not allowed on a standalone. - const conn = MongoRunner.runMongod(); - session = conn.startSession({causalConsistency: false}); - sessionDb = session.getDatabase(dbName); - assert.neq(null, conn, "mongod was unable to start up"); +"use strict"; + +const dbName = "test"; +const collName = "coll"; + +// +// Configurations. +// + +// Transactions should fail on storage engines that do not support them. +let rst = new ReplSetTest({nodes: 1}); +rst.startSet(); +rst.initiate(); +let session = rst.getPrimary().getDB(dbName).getMongo().startSession({causalConsistency: false}); +let sessionDb = session.getDatabase(dbName); +if (!sessionDb.serverStatus().storageEngine.supportsSnapshotReadConcern) { + // Transactions with readConcern snapshot fail. session.startTransaction({readConcern: {level: "snapshot"}}); assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), ErrorCodes.IllegalOperation); assert.commandFailedWithCode(session.abortTransaction_forTesting(), - ErrorCodes.IllegalOperation); - session.endSession(); - MongoRunner.stopMongod(conn); - - // readConcern 'snapshot' is allowed on a replica set primary. - rst = new ReplSetTest({nodes: 2}); - rst.startSet(); - rst.initiate(); - assert.commandWorked(rst.getPrimary().getDB(dbName).runCommand( - {create: collName, writeConcern: {w: "majority"}})); - session = rst.getPrimary().getDB(dbName).getMongo().startSession({causalConsistency: false}); - sessionDb = session.getDatabase(dbName); - session.startTransaction({writeConcern: {w: "majority"}, readConcern: {level: "snapshot"}}); - assert.commandWorked(sessionDb.coll.insert({})); - assert.commandWorked(sessionDb.runCommand({find: collName})); - assert.commandWorked(session.commitTransaction_forTesting()); - - // readConcern 'snapshot' is allowed with 'afterClusterTime'. + [ErrorCodes.NoSuchTransaction, ErrorCodes.IllegalOperation]); + + // Transactions without readConcern snapshot fail. session.startTransaction(); - let pingRes = assert.commandWorked(rst.getPrimary().adminCommand({ping: 1})); - assert(pingRes.hasOwnProperty("$clusterTime"), tojson(pingRes)); - assert(pingRes.$clusterTime.hasOwnProperty("clusterTime"), tojson(pingRes)); - assert.commandWorked(sessionDb.runCommand({ - find: collName, - readConcern: {level: "snapshot", afterClusterTime: pingRes.$clusterTime.clusterTime} - })); - assert.commandWorked(session.commitTransaction_forTesting()); - - // readConcern 'snapshot' is not allowed with 'afterOpTime'. - session.startTransaction( - {readConcern: {level: "snapshot", afterOpTime: {ts: Timestamp(1, 2), t: 1}}}); - assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), ErrorCodes.InvalidOptions); + assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), + ErrorCodes.IllegalOperation); assert.commandFailedWithCode(session.abortTransaction_forTesting(), - ErrorCodes.NoSuchTransaction); - session.endSession(); - - pingRes = assert.commandWorked(rst.getSecondary().adminCommand({ping: 1})); - assert(pingRes.hasOwnProperty("$clusterTime"), tojson(pingRes)); - assert(pingRes.$clusterTime.hasOwnProperty("clusterTime"), tojson(pingRes)); - - session.startTransaction( - {readConcern: {level: "snapshot", afterClusterTime: pingRes.$clusterTime.clusterTime}}); - assert.commandWorked(sessionDb.runCommand({find: collName})); - assert.commandWorked(session.commitTransaction_forTesting()); - - session.endSession(); - rst.stopSet(); + [ErrorCodes.NoSuchTransaction, ErrorCodes.IllegalOperation]); - // - // Commands. - // - - rst = new ReplSetTest({nodes: 1}); - rst.startSet(); - rst.initiate(); - let testDB = rst.getPrimary().getDB(dbName); - let coll = testDB.coll; - assert.commandWorked(coll.createIndex({geo: "2d"})); - assert.commandWorked(testDB.runCommand({ - createIndexes: collName, - indexes: [{key: {haystack: "geoHaystack", a: 1}, name: "haystack_geo", bucketSize: 1}], - writeConcern: {w: "majority"} - })); - - session = testDB.getMongo().startSession({causalConsistency: false}); - sessionDb = session.getDatabase(dbName); - - // readConcern 'snapshot' is supported by find. - session.startTransaction({readConcern: {level: "snapshot"}, writeConcern: {w: "majority"}}); - assert.commandWorked(sessionDb.runCommand({find: collName})); - - // readConcern 'snapshot' is supported by aggregate. - assert.commandWorked(sessionDb.runCommand({aggregate: collName, pipeline: [], cursor: {}})); - - // readConcern 'snapshot' is supported by distinct. - assert.commandWorked(sessionDb.runCommand({distinct: collName, key: "x"})); - - // readConcern 'snapshot' is supported by geoSearch. - assert.commandWorked( - sessionDb.runCommand({geoSearch: collName, near: [0, 0], maxDistance: 1, search: {a: 1}})); - - // readConcern 'snapshot' is not supported by non-CRUD commands. - assert.commandFailedWithCode( - sessionDb.runCommand({createIndexes: collName, indexes: [{key: {a: 1}, name: "a_1"}]}), - ErrorCodes.OperationNotSupportedInTransaction); - assert.commandWorked(session.abortTransaction_forTesting()); - session.endSession(); rst.stopSet(); + return; +} +session.endSession(); +rst.stopSet(); + +// readConcern 'snapshot' is not allowed on a standalone. +const conn = MongoRunner.runMongod(); +session = conn.startSession({causalConsistency: false}); +sessionDb = session.getDatabase(dbName); +assert.neq(null, conn, "mongod was unable to start up"); +session.startTransaction({readConcern: {level: "snapshot"}}); +assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), ErrorCodes.IllegalOperation); +assert.commandFailedWithCode(session.abortTransaction_forTesting(), ErrorCodes.IllegalOperation); +session.endSession(); +MongoRunner.stopMongod(conn); + +// readConcern 'snapshot' is allowed on a replica set primary. +rst = new ReplSetTest({nodes: 2}); +rst.startSet(); +rst.initiate(); +assert.commandWorked( + rst.getPrimary().getDB(dbName).runCommand({create: collName, writeConcern: {w: "majority"}})); +session = rst.getPrimary().getDB(dbName).getMongo().startSession({causalConsistency: false}); +sessionDb = session.getDatabase(dbName); +session.startTransaction({writeConcern: {w: "majority"}, readConcern: {level: "snapshot"}}); +assert.commandWorked(sessionDb.coll.insert({})); +assert.commandWorked(sessionDb.runCommand({find: collName})); +assert.commandWorked(session.commitTransaction_forTesting()); + +// readConcern 'snapshot' is allowed with 'afterClusterTime'. +session.startTransaction(); +let pingRes = assert.commandWorked(rst.getPrimary().adminCommand({ping: 1})); +assert(pingRes.hasOwnProperty("$clusterTime"), tojson(pingRes)); +assert(pingRes.$clusterTime.hasOwnProperty("clusterTime"), tojson(pingRes)); +assert.commandWorked(sessionDb.runCommand({ + find: collName, + readConcern: {level: "snapshot", afterClusterTime: pingRes.$clusterTime.clusterTime} +})); +assert.commandWorked(session.commitTransaction_forTesting()); + +// readConcern 'snapshot' is not allowed with 'afterOpTime'. +session.startTransaction( + {readConcern: {level: "snapshot", afterOpTime: {ts: Timestamp(1, 2), t: 1}}}); +assert.commandFailedWithCode(sessionDb.runCommand({find: collName}), ErrorCodes.InvalidOptions); +assert.commandFailedWithCode(session.abortTransaction_forTesting(), ErrorCodes.NoSuchTransaction); +session.endSession(); + +pingRes = assert.commandWorked(rst.getSecondary().adminCommand({ping: 1})); +assert(pingRes.hasOwnProperty("$clusterTime"), tojson(pingRes)); +assert(pingRes.$clusterTime.hasOwnProperty("clusterTime"), tojson(pingRes)); + +session.startTransaction( + {readConcern: {level: "snapshot", afterClusterTime: pingRes.$clusterTime.clusterTime}}); +assert.commandWorked(sessionDb.runCommand({find: collName})); +assert.commandWorked(session.commitTransaction_forTesting()); + +session.endSession(); +rst.stopSet(); + +// +// Commands. +// + +rst = new ReplSetTest({nodes: 1}); +rst.startSet(); +rst.initiate(); +let testDB = rst.getPrimary().getDB(dbName); +let coll = testDB.coll; +assert.commandWorked(coll.createIndex({geo: "2d"})); +assert.commandWorked(testDB.runCommand({ + createIndexes: collName, + indexes: [{key: {haystack: "geoHaystack", a: 1}, name: "haystack_geo", bucketSize: 1}], + writeConcern: {w: "majority"} +})); + +session = testDB.getMongo().startSession({causalConsistency: false}); +sessionDb = session.getDatabase(dbName); + +// readConcern 'snapshot' is supported by find. +session.startTransaction({readConcern: {level: "snapshot"}, writeConcern: {w: "majority"}}); +assert.commandWorked(sessionDb.runCommand({find: collName})); + +// readConcern 'snapshot' is supported by aggregate. +assert.commandWorked(sessionDb.runCommand({aggregate: collName, pipeline: [], cursor: {}})); + +// readConcern 'snapshot' is supported by distinct. +assert.commandWorked(sessionDb.runCommand({distinct: collName, key: "x"})); + +// readConcern 'snapshot' is supported by geoSearch. +assert.commandWorked( + sessionDb.runCommand({geoSearch: collName, near: [0, 0], maxDistance: 1, search: {a: 1}})); + +// readConcern 'snapshot' is not supported by non-CRUD commands. +assert.commandFailedWithCode( + sessionDb.runCommand({createIndexes: collName, indexes: [{key: {a: 1}, name: "a_1"}]}), + ErrorCodes.OperationNotSupportedInTransaction); +assert.commandWorked(session.abortTransaction_forTesting()); +session.endSession(); +rst.stopSet(); }()); |