1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/**
* Tests explain when profileOperationResourceConsumptionMetrics is set to true and explain
* verbosity is "executionStats" or "allPlansExecution".
* @tags: [
* requires_replication,
* requires_sharding,
* requires_wiredtiger
* ]
*/
(function() {
"use strict";
const dbName = jsTestName();
const collName = 'coll';
const runTest = (db) => {
for (const verbosity of ["executionStats", "allPlansExecution"]) {
jsTestLog("Testing with verbosity: " + verbosity);
const coll = db[collName];
coll.drop();
const docs = [{a: 0, b: 0}, {a: 0, b: 0}, {a: 0, b: 0}];
assert.commandWorked(coll.insertMany(docs));
const result = assert.commandWorked(coll.find().explain(verbosity));
assert(result.hasOwnProperty("executionStats"), result);
const execStats = result.executionStats;
assert(execStats.hasOwnProperty("operationMetrics"), execStats);
const operationMetrics = execStats.operationMetrics;
assert.eq(132, operationMetrics.docBytesRead, result);
assert.eq(3, operationMetrics.docUnitsRead, result);
const aggResult =
assert.commandWorked(coll.explain(verbosity).aggregate({$project: {a: "$a"}}));
assert(aggResult.hasOwnProperty("executionStats"), aggResult);
const aggExecStats = aggResult.executionStats;
assert(aggExecStats.hasOwnProperty("operationMetrics"), aggExecStats);
const aggOperationMetrics = aggExecStats.operationMetrics;
assert.eq(132, aggOperationMetrics.docBytesRead, aggResult);
assert.eq(3, aggOperationMetrics.docUnitsRead, aggResult);
assert.commandWorked(coll.createIndex({a: 1}));
const idxFindResult = assert.commandWorked(coll.find({a: 0}).explain(verbosity));
assert(idxFindResult.hasOwnProperty("executionStats"), idxFindResult);
const idxFindExecutionStats = idxFindResult.executionStats;
assert(idxFindExecutionStats.hasOwnProperty("operationMetrics"), idxFindExecutionStats);
const idxFindOperationMetrics = idxFindExecutionStats.operationMetrics;
assert.eq(132, idxFindOperationMetrics.docBytesRead, idxFindResult);
assert.eq(3, idxFindOperationMetrics.docUnitsRead, idxFindResult);
assert.eq(12, idxFindOperationMetrics.idxEntryBytesRead, idxFindResult);
assert.eq(3, idxFindOperationMetrics.idxEntryUnitsRead, idxFindResult);
// The number of cursorSeeks can change depending on whether a yield has occurred. We
// account for this by incrementing the expected value by the number of calls to
// 'restoreState'.
const numAdditionalCursorSeeks = idxFindExecutionStats.executionStages.restoreState;
assert.eq(4 + numAdditionalCursorSeeks, idxFindOperationMetrics.cursorSeeks, idxFindResult);
}
};
const setParams = {
profileOperationResourceConsumptionMetrics: true
};
jsTestLog("Testing standalone");
(function testStandalone() {
const conn = MongoRunner.runMongod({setParameter: setParams});
const db = conn.getDB(dbName);
runTest(db);
MongoRunner.stopMongod(conn);
})();
jsTestLog("Testing replica set");
(function testReplicaSet() {
const rst = new ReplSetTest({nodes: 2, nodeOptions: {setParameter: setParams}});
rst.startSet();
rst.initiate();
const db = rst.getPrimary().getDB(dbName);
runTest(db);
rst.stopSet();
})();
})();
|