summaryrefslogtreecommitdiff
path: root/jstests/core/profile2.js
blob: 4694f5b8c6c84a71ee6c73057d10e927fad2caef (plain)
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
81
// Tests that large queries and updates are properly profiled.

// Special db so that it can be run in parallel tests.
// @tags: [
//   requires_profiling,
// ]

var coll = db.getSiblingDB("profile2").profile2;

assert.commandWorked(coll.getDB().runCommand({profile: 0}));
coll.drop();
coll.getDB().system.profile.drop();
assert.commandWorked(coll.getDB().runCommand({profile: 2}));

/**
 * Asserts that array 'results' contains a profiler generated document that corresponds to a
 * truncated command that matches a regular expression 'truncatedCommandRegexp'. Outputs a message
 * 'message' in case such document is not present.
 */
function assertContainsTruncatedCommand(results, truncatedCommandRegexp, message) {
    const document = results.find(
        element => element.hasOwnProperty('ns') && element.hasOwnProperty('millis') &&
            element.hasOwnProperty('command') && 'string' === typeof (element.command.$truncated) &&
            element.command.$truncated.match(truncatedCommandRegexp));
    assert(document, message + ` Retrieved documents: ${tojson(results)}`);
}

var str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
var hugeStr = str;
while (hugeStr.length < 2 * 1024 * 1024) {
    hugeStr += str;
}

// Test query with large string element.
coll.find({a: hugeStr}).itcount();
var results = coll.getDB().system.profile.find().toArray();
assertContainsTruncatedCommand(results,
                               /filter: { a: "a+\.\.\." }//* string value is truncated*/,
                               "Document corresponding to 'find' command not found.");

assert.commandWorked(coll.getDB().runCommand({profile: 0}));
coll.getDB().system.profile.drop();
assert.commandWorked(coll.getDB().runCommand({profile: 2}));

// Test update with large string element in query portion.
assert.commandWorked(coll.update({a: hugeStr}, {}));
var results = coll.getDB().system.profile.find().toArray();
assertContainsTruncatedCommand(
    results,
    /^{ q: { a: "a+\.\.\." }, u: {}, multi: false, upsert: false }$//* string value is truncated*/,
    "Document corresponding to 'update' command not found.");

assert.commandWorked(coll.getDB().runCommand({profile: 0}));
coll.getDB().system.profile.drop();
assert.commandWorked(coll.getDB().runCommand({profile: 2}));

// Test update with large string element in update portion.
assert.commandWorked(coll.update({}, {a: hugeStr}));
var results = coll.getDB().system.profile.find().toArray();
assertContainsTruncatedCommand(
    results,
    /^{ q: {}, u: { a: "a+\.\.\." }, multi: false, upsert: false }$//* string value is truncated*/,
    "Document corresponding to 'update' command not found.");

assert.commandWorked(coll.getDB().runCommand({profile: 0}));
coll.getDB().system.profile.drop();
assert.commandWorked(coll.getDB().runCommand({profile: 2}));

// Test query with many elements in query portion.
var doc = {};
for (var i = 0; i < 100 * 1000; ++i) {
    doc["a" + i] = 1;
}
coll.find(doc).itcount();
var results = coll.getDB().system.profile.find().toArray();
assertContainsTruncatedCommand(
    results,
    /filter: { a0: 1\.0, a1: .*\.\.\.$//* query object itself is truncated*/,
    "Document corresponding to 'find' command not found.");

assert.commandWorked(coll.getDB().runCommand({profile: 0}));