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();
}
})();
|