mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-25 09:19:32 +01:00
83 lines
3.3 KiB
JavaScript
83 lines
3.3 KiB
JavaScript
// TODO: SERVER-34388 Simplify this test by wrapping all the statements
|
|
// in one transaction once a failing command won't abort the transaction
|
|
/**
|
|
* Test that explained aggregation commands behave correctly with the readConcern option.
|
|
*/
|
|
(function() {
|
|
"use strict";
|
|
|
|
load("jstests/multiVersion/libs/causal_consistency_helpers.js");
|
|
|
|
// Skip this test if running with --nojournal and WiredTiger.
|
|
if (jsTest.options().noJournal &&
|
|
(!jsTest.options().storageEngine || jsTest.options().storageEngine === "wiredTiger")) {
|
|
print("Skipping test because running WiredTiger without journaling isn't a valid" +
|
|
" replica set configuration");
|
|
return;
|
|
}
|
|
|
|
if (!supportsMajorityReadConcern()) {
|
|
jsTestLog("Skipping test since storage engine doesn't support majority read concern.");
|
|
return;
|
|
}
|
|
|
|
const rst = new ReplSetTest(
|
|
{name: "aggExplainReadConcernSet", nodes: 1, nodeOptions: {enableMajorityReadConcern: ""}});
|
|
rst.startSet();
|
|
rst.initiate();
|
|
|
|
const primary = rst.getPrimary();
|
|
const session = primary.getDB("test").getMongo().startSession({causalConsistency: false});
|
|
const sessionDB = session.getDatabase("test");
|
|
const coll = sessionDB.agg_explain_read_concern;
|
|
|
|
// Test that explain is legal with readConcern "local".
|
|
assert.commandWorked(coll.explain().aggregate([], {readConcern: {level: "local"}}));
|
|
assert.commandWorked(sessionDB.runCommand(
|
|
{aggregate: coll.getName(), pipeline: [], explain: true, readConcern: {level: "local"}}));
|
|
assert.commandWorked(sessionDB.runCommand({
|
|
explain: {aggregate: coll.getName(), pipeline: [], cursor: {}},
|
|
readConcern: {level: "local"}
|
|
}));
|
|
|
|
// Test that explain is illegal with other readConcern levels.
|
|
const nonLocalReadConcerns = ["majority", "available", "linearizable", "snapshot"];
|
|
nonLocalReadConcerns.forEach(function(readConcernLevel) {
|
|
let aggCmd = {
|
|
aggregate: coll.getName(),
|
|
pipeline: [],
|
|
explain: true,
|
|
readConcern: {level: readConcernLevel}
|
|
};
|
|
let explainCmd = {
|
|
explain: {aggregate: coll.getName(), pipeline: [], cursor: {}},
|
|
readConcern: {level: readConcernLevel}
|
|
};
|
|
|
|
if (readConcernLevel === "snapshot") {
|
|
if (!sessionDB.serverStatus().storageEngine.supportsSnapshotReadConcern) {
|
|
return;
|
|
}
|
|
aggCmd.txnNumber = NumberLong(0);
|
|
explainCmd.txnNumber = NumberLong(1);
|
|
|
|
} else {
|
|
assert.throws(
|
|
() => coll.explain().aggregate([], {readConcern: {level: readConcernLevel}}));
|
|
}
|
|
|
|
let cmdRes = sessionDB.runCommand(aggCmd);
|
|
assert.commandFailedWithCode(cmdRes, ErrorCodes.InvalidOptions, tojson(cmdRes));
|
|
let expectedErrStr = "aggregate command does not support non-local readConcern";
|
|
assert.neq(cmdRes.errmsg.indexOf(expectedErrStr), -1, tojson(cmdRes));
|
|
|
|
cmdRes = sessionDB.runCommand(explainCmd);
|
|
assert.commandFailedWithCode(cmdRes, ErrorCodes.InvalidOptions, tojson(cmdRes));
|
|
expectedErrStr = "Command does not support read concern";
|
|
assert.neq(cmdRes.errmsg.indexOf(expectedErrStr), -1, tojson(cmdRes));
|
|
});
|
|
|
|
session.endSession();
|
|
rst.stopSet();
|
|
}());
|