summaryrefslogtreecommitdiff
path: root/jstests/sharding/analyze_shard_key/deprioritize_query_sampling_inserts.js
blob: 7bd5d0501f8cf6716927357a549c5fbfb8fea5c1 (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * Tests that inserts related to query sampling are deprioritized.
 *
 * @tags: [requires_fcv_70]
 */

(function() {

"use strict";

load("jstests/libs/fail_point_util.js");
load("jstests/sharding/analyze_shard_key/libs/query_sampling_util.js");

const sampleRate = 1000;
const queryAnalysisWriterIntervalSecs = 1;
const queryAnalysisSamplerConfigurationRefreshSecs = 1;
const mongodSetParameterOpts = {
    queryAnalysisWriterIntervalSecs,
};
const mongosSetParameterOpts = {
    queryAnalysisSamplerConfigurationRefreshSecs,
};

function runTest(conn, primary, {st, rst}) {
    const dbName = "testDb";
    const collName = "testColl";
    const ns = dbName + "." + collName;
    const testDb = conn.getDB(dbName);
    const testColl = testDb.getCollection(collName);
    const sampleCollName = "sampledQueries";
    const sampleDiffCollName = "sampledQueriesDiff";
    const sampleNs = "config." + sampleCollName;
    const sampleDiffNs = "config." + sampleDiffCollName;

    assert.commandWorked(testColl.insert([{x: 1}]));
    const collUuid = QuerySamplingUtil.getCollectionUuid(testDb, collName);

    assert.commandWorked(conn.adminCommand({configureQueryAnalyzer: ns, mode: "full", sampleRate}));
    QuerySamplingUtil.waitForActiveSampling(ns, collUuid, {st, rst});

    // Test insert to config.sampledQueries.
    const fp1 = configureFailPoint(primary, "hangInsertBeforeWrite", {ns: sampleNs});
    assert.commandWorked(testDb.runCommand({find: collName, filter: {x: 1}}));
    // Wait for the sampling buffer to be flushed.
    fp1.wait();

    let currentOpDocs =
        conn.getDB("admin")
            .aggregate(
                [{$currentOp: {allUsers: true}}, {$match: {"command.insert": sampleCollName}}])
            .toArray();
    assert.eq(currentOpDocs.length, 1, tojson(currentOpDocs));
    assert.eq(currentOpDocs[0]["admissionPriority"], "low", tojson(currentOpDocs[0]));

    fp1.off();

    // Test insert to config.sampledQueriesDiff.
    const fp2 = configureFailPoint(primary, "hangInsertBeforeWrite", {ns: sampleDiffNs});
    assert.commandWorked(
        testDb.runCommand({update: collName, updates: [{q: {x: 1}, u: {$set: {y: 1}}}]}));
    // Wait for the sampling buffer to be flushed.
    fp2.wait();

    currentOpDocs =
        conn.getDB("admin")
            .aggregate(
                [{$currentOp: {allUsers: true}}, {$match: {"command.insert": sampleDiffCollName}}])
            .toArray();
    assert.eq(currentOpDocs.length, 1, tojson(currentOpDocs));
    assert.eq(currentOpDocs[0]["admissionPriority"], "low", tojson(currentOpDocs[0]));

    fp2.off();
}

{
    const st = new ShardingTest({
        shards: 1,
        mongos: 1,
        rs: {nodes: 2, setParameter: mongodSetParameterOpts},
        mongosOptions: {setParameter: mongosSetParameterOpts}
    });

    jsTest.log("Testing deprioritized insert in sharded cluster.");
    runTest(st.s, st.rs0.getPrimary(), {st});

    st.stop();
}

{
    const rst = new ReplSetTest({nodes: 2, nodeOptions: {setParameter: mongodSetParameterOpts}});
    rst.startSet();
    rst.initiate();

    jsTest.log("Testing deprioritized insert in replica set.");
    runTest(rst.getPrimary(), rst.getPrimary(), {rst});

    rst.stopSet();
}
})();