summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/query_engine_stats.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/query_engine_stats.js')
-rw-r--r--jstests/noPassthrough/query_engine_stats.js136
1 files changed, 91 insertions, 45 deletions
diff --git a/jstests/noPassthrough/query_engine_stats.js b/jstests/noPassthrough/query_engine_stats.js
index 250943806d1..48339e1927e 100644
--- a/jstests/noPassthrough/query_engine_stats.js
+++ b/jstests/noPassthrough/query_engine_stats.js
@@ -10,10 +10,10 @@
load("jstests/libs/profiler.js");
load("jstests/libs/sbe_util.js"); // For 'checkSBEEnabled()'.
-const conn = MongoRunner.runMongod({});
+let conn = MongoRunner.runMongod({});
assert.neq(null, conn, "mongod was unable to start up");
-const db = conn.getDB(jsTestName());
+let db = conn.getDB(jsTestName());
// This test assumes that SBE is being used for most queries.
if (!checkSBEEnabled(db, ["featureFlagSbeFull"])) {
@@ -24,7 +24,7 @@ if (!checkSBEEnabled(db, ["featureFlagSbeFull"])) {
assert.commandWorked(db.dropDatabase());
-const coll = db.collection;
+let coll = db.collection;
// Set logLevel to 1 so that all queries will be logged.
assert.commandWorked(db.setLogLevel(1));
@@ -40,78 +40,87 @@ assert.commandWorked(coll.insertMany([
{_id: 3, a: 4, b: 2, c: 4}
]));
-const engine = {
- find: {sbe: "sbe", classic: "classic"},
+const framework = {
+ find: {sbe: "sbe", classic: "classic", cqf: "findCQF"},
aggregate: {
sbeHybrid: "sbeHybrid",
classicHybrid: "classicHybrid",
sbeOnly: "sbeOnly",
- classicOnly: "classicOnly"
+ classicOnly: "classicOnly",
+ cqf: "aggCQF"
}
};
-// Ensure the slow query log contains the correct information about the queryExecutionEngine used.
-function verifySlowQueryLog(expectedComment, execEngine) {
+/**
+ * Ensure the slow query log contains the correct information about the queryFramework used.
+ */
+function verifySlowQueryLog(expectedComment, queryFramework) {
const logId = 51803;
const expectedLog = {};
expectedLog.command = {};
expectedLog.command.comment = expectedComment;
- if (execEngine) {
- expectedLog.queryExecutionEngine = execEngine;
+ if (queryFramework) {
+ expectedLog.queryFramework = queryFramework;
}
assert(checkLog.checkContainsWithCountJson(db, logId, expectedLog, 1, null, true),
"failed to find [" + tojson(expectedLog) + "] in the slow query log");
}
-// Ensure the profile filter contains the correct information about the queryExecutionEngine used.
-function verifyProfiler(expectedComment, execEngine) {
+// Ensure the profile filter contains the correct information about the queryFramework used.
+function verifyProfiler(expectedComment, queryFramework) {
const profileEntryFilter = {ns: "query_engine_stats.collection"};
const profileObj = getLatestProfilerEntry(db, profileEntryFilter);
try {
assert.eq(profileObj.command.comment, expectedComment);
- if (execEngine) {
- assert.eq(profileObj.queryExecutionEngine, execEngine);
+ if (queryFramework) {
+ assert.eq(profileObj.queryFramework, queryFramework);
}
} catch (e) {
- print('failed to find [{ "queryExecutionEngine" : "' + execEngine + '", { "comment" : "' +
+ print('failed to find [{ "queryFramework" : "' + queryFramework + '", { "comment" : "' +
expectedComment + '"} }] in the latest profiler entry.');
throw (e);
}
}
-// Create an object with the correct queryExecutionEngine counter values after the specified type of
+// Create an object with the correct queryFramework counter values after the specified type of
// query.
-function generateExpectedCounters(execEngine) {
- let counters = db.serverStatus().metrics.query.queryExecutionEngine;
+function generateExpectedCounters(queryFramework) {
+ let counters = db.serverStatus().metrics.query.queryFramework;
assert(counters, "counters did not exist");
let expected = Object.assign(counters);
- switch (execEngine) {
- case engine.find.sbe:
+ switch (queryFramework) {
+ case framework.find.sbe:
expected.find.sbe = NumberLong(expected.find.sbe + 1);
break;
- case engine.find.classic:
+ case framework.find.classic:
expected.find.classic = NumberLong(expected.find.classic + 1);
break;
- case engine.aggregate.sbeOnly:
+ case framework.find.cqf:
+ expected.find.cqf = NumberLong(expected.find.cqf + 1);
+ break;
+ case framework.aggregate.sbeOnly:
expected.aggregate.sbeOnly = NumberLong(expected.aggregate.sbeOnly + 1);
break;
- case engine.aggregate.classicOnly:
+ case framework.aggregate.classicOnly:
expected.aggregate.classicOnly = NumberLong(expected.aggregate.classicOnly + 1);
break;
- case engine.aggregate.sbeHybrid:
+ case framework.aggregate.sbeHybrid:
expected.aggregate.sbeHybrid = NumberLong(expected.aggregate.sbeHybrid + 1);
break;
- case engine.aggregate.classicHybrid:
+ case framework.aggregate.classicHybrid:
expected.aggregate.classicHybrid = NumberLong(expected.aggregate.classicHybrid + 1);
break;
+ case framework.aggregate.cqf:
+ expected.aggregate.cqf = NumberLong(expected.aggregate.cqf + 1);
+ break;
}
return expected;
}
-// Compare the values of the queryExecutionEngine counters to an object that represents the expected
+// Compare the values of the queryFramework counters to an object that represents the expected
// values.
function compareQueryEngineCounters(expectedCounters) {
- let counters = db.serverStatus().metrics.query.queryExecutionEngine;
+ let counters = db.serverStatus().metrics.query.queryFramework;
assert.docEq(counters, expectedCounters);
}
@@ -119,23 +128,23 @@ function compareQueryEngineCounters(expectedCounters) {
assert.commandWorked(db.adminCommand({setParameter: 1, internalQueryForceClassicEngine: true}));
// Run a find command.
-let expectedCounters = generateExpectedCounters(engine.find.classic);
+let expectedCounters = generateExpectedCounters(framework.find.classic);
let queryComment = "findSbeOff";
assert.eq(coll.find({a: 3}).comment(queryComment).itcount(), 1);
-verifySlowQueryLog(queryComment, engine.find.classic);
+verifySlowQueryLog(queryComment, framework.find.classic);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.classic);
+verifyProfiler(queryComment, framework.find.classic);
// Run an aggregation that doesn't use DocumentSource.
-expectedCounters = generateExpectedCounters(engine.aggregate.classicOnly);
+expectedCounters = generateExpectedCounters(framework.aggregate.classicOnly);
queryComment = "aggSbeOff";
assert.eq(coll.aggregate([{$match: {b: 1, c: 3}}], {comment: queryComment}).itcount(), 1);
-verifySlowQueryLog(queryComment, engine.find.classic);
+verifySlowQueryLog(queryComment, framework.find.classic);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.classic);
+verifyProfiler(queryComment, framework.find.classic);
// Run an aggregation that uses DocumentSource.
-expectedCounters = generateExpectedCounters(engine.aggregate.classicHybrid);
+expectedCounters = generateExpectedCounters(framework.aggregate.classicHybrid);
queryComment = "docSourceSbeOff";
assert.eq(coll.aggregate(
[
@@ -146,31 +155,31 @@ assert.eq(coll.aggregate(
{comment: queryComment})
.itcount(),
0);
-verifySlowQueryLog(queryComment, engine.find.classic);
+verifySlowQueryLog(queryComment, framework.find.classic);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.classic);
+verifyProfiler(queryComment, framework.find.classic);
// Turn SBE on.
assert.commandWorked(db.adminCommand({setParameter: 1, internalQueryForceClassicEngine: false}));
// Run a find command.
-expectedCounters = generateExpectedCounters(engine.find.sbe);
+expectedCounters = generateExpectedCounters(framework.find.sbe);
queryComment = "findSbeOn";
assert.eq(coll.find({a: 3}).comment(queryComment).itcount(), 1);
-verifySlowQueryLog(queryComment, engine.find.sbe);
+verifySlowQueryLog(queryComment, framework.find.sbe);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.sbe);
+verifyProfiler(queryComment, framework.find.sbe);
// Run an aggregation that doesn't use DocumentSource.
-expectedCounters = generateExpectedCounters(engine.aggregate.sbeOnly);
+expectedCounters = generateExpectedCounters(framework.aggregate.sbeOnly);
queryComment = "aggSbeOn";
assert.eq(coll.aggregate([{$match: {b: 1, c: 3}}], {comment: queryComment}).itcount(), 1);
-verifySlowQueryLog(queryComment, engine.find.sbe);
+verifySlowQueryLog(queryComment, framework.find.sbe);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.sbe);
+verifyProfiler(queryComment, framework.find.sbe);
// Run an aggregation that uses DocumentSource.
-expectedCounters = generateExpectedCounters(engine.aggregate.sbeHybrid);
+expectedCounters = generateExpectedCounters(framework.aggregate.sbeHybrid);
queryComment = "docSourceSbeOn";
assert.eq(coll.aggregate(
[
@@ -181,9 +190,46 @@ assert.eq(coll.aggregate(
{comment: queryComment})
.itcount(),
0);
-verifySlowQueryLog(queryComment, engine.find.sbe);
+verifySlowQueryLog(queryComment, framework.find.sbe);
+compareQueryEngineCounters(expectedCounters);
+verifyProfiler(queryComment, framework.find.sbe);
+
+MongoRunner.stopMongod(conn);
+
+conn = MongoRunner.runMongod({restart: conn, setParameter: 'featureFlagCommonQueryFramework=1'});
+assert.neq(null, conn, "mongod was unable to start up");
+
+db = conn.getDB(jsTestName());
+
+assert.commandWorked(db.setLogLevel(1));
+assert.commandWorked(db.setProfilingLevel(2));
+
+coll = db.collection;
+
+// Run find using CQF
+expectedCounters = generateExpectedCounters(framework.find.cqf);
+queryComment = "cqfFind";
+assert.eq(coll.find({a: 1}).comment(queryComment).itcount(), 1);
+verifySlowQueryLog(queryComment, "cqf");
+compareQueryEngineCounters(expectedCounters);
+verifyProfiler(queryComment, "cqf");
+
+// Run aggregate using CQF
+expectedCounters = generateExpectedCounters(framework.aggregate.cqf);
+queryComment = "cqfAggregate";
+assert.eq(
+ coll.aggregate([{$match: {a: 1}}, {$project: {_id: 0}}], {comment: queryComment}).itcount(), 1);
+verifySlowQueryLog(queryComment, "cqf");
+compareQueryEngineCounters(expectedCounters);
+verifyProfiler(queryComment, "cqf");
+
+// Run CQF query which falls back to SBE (unsupported match expression)
+expectedCounters = generateExpectedCounters(framework.find.sbe);
+queryComment = "cqfFallback";
+assert.eq(coll.find({a: {$mod: [4, 0]}}).comment(queryComment).itcount(), 1);
+verifySlowQueryLog(queryComment, framework.find.sbe);
compareQueryEngineCounters(expectedCounters);
-verifyProfiler(queryComment, engine.find.sbe);
+verifyProfiler(queryComment, framework.find.sbe);
MongoRunner.stopMongod(conn);
})();