summaryrefslogtreecommitdiff
path: root/jstests/sharding/server_status_crud_metrics.js
blob: 522f2f89222f41318d4fc8067486a5d0162572a8 (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
/**
 * Tests for the 'metrics.query' section of the mongoS serverStatus response dealing with CRUD
 * operations.
 */

(function() {
    "use strict";

    const st = new ShardingTest({shards: 2});
    const testDB = st.s.getDB("test");
    const testColl = testDB.coll;
    const unshardedColl = testDB.unsharded;

    assert.commandWorked(st.s0.adminCommand({enableSharding: testDB.getName()}));
    st.ensurePrimaryShard(testDB.getName(), st.shard0.shardName);

    // Shard testColl on {x:1}, split it at {x:0}, and move chunk {x:1} to shard1.
    st.shardColl(testColl, {x: 1}, {x: 0}, {x: 1});

    // Insert one document on each shard.
    assert.commandWorked(testColl.insert({x: 1, _id: 1}));
    assert.commandWorked(testColl.insert({x: -1, _id: 0}));

    assert.commandWorked(unshardedColl.insert({x: 1, _id: 1}));

    // Verification for 'updateOneOpStyleBroadcastWithExactIDCount' metric.

    // Should increment the metric as the update cannot target single shard and are {multi:false}.
    assert.commandWorked(testDB.coll.update({_id: "missing"}, {$set: {a: 1}}, {multi: false}));
    assert.commandWorked(testDB.coll.update({_id: 1}, {$set: {a: 2}}, {multi: false}));

    // Should increment the metric because we broadcast by _id, even though the update subsequently
    // fails on the individual shard.
    assert.commandFailedWithCode(testDB.coll.update({_id: 1}, {$set: {x: 2}}, {multi: false}),
                                 [ErrorCodes.ImmutableField, 31025]);
    assert.commandFailedWithCode(
        testDB.coll.update({_id: 1}, {$set: {x: 2, $invalidField: 4}}, {multi: false}),
        ErrorCodes.DollarPrefixedFieldName);

    let mongosServerStatus = testDB.adminCommand({serverStatus: 1});

    // Verify that the above four updates incremented the metric counter.
    assert.eq(4, mongosServerStatus.metrics.query.updateOneOpStyleBroadcastWithExactIDCount);

    // Shouldn't increment the metric when {multi:true}.
    assert.commandWorked(testDB.coll.update({_id: 1}, {$set: {a: 3}}, {multi: true}));
    assert.commandWorked(testDB.coll.update({}, {$set: {a: 3}}, {multi: true}));

    // Shouldn't increment the metric when update can target single shard.
    assert.commandWorked(testDB.coll.update({x: 11}, {$set: {a: 2}}, {multi: false}));
    assert.commandWorked(testDB.coll.update({x: 1}, {$set: {a: 2}}, {multi: false}));

    // Shouldn't increment the metric for replacement style updates.
    assert.commandWorked(testDB.coll.update({_id: 1}, {x: 1, a: 2}));
    assert.commandWorked(testDB.coll.update({x: 1}, {x: 1, a: 1}));

    // Shouldn't increment the metric when routing fails.
    assert.commandFailedWithCode(testDB.coll.update({}, {$set: {x: 2}}, {multi: false}),
                                 [ErrorCodes.InvalidOptions, ErrorCodes.ShardKeyNotFound]);
    assert.commandFailedWithCode(testDB.coll.update({_id: 1}, {$set: {x: 2}}, {upsert: true}),
                                 ErrorCodes.ShardKeyNotFound);

    // Shouldn't increment the metrics for unsharded collection.
    assert.commandWorked(unshardedColl.update({_id: "missing"}, {$set: {a: 1}}, {multi: false}));
    assert.commandWorked(unshardedColl.update({_id: 1}, {$set: {a: 2}}, {multi: false}));

    // Shouldn't incement the metrics when query had invalid operator.
    assert.commandFailedWithCode(
        testDB.coll.update({_id: 1, $invalidOperator: 1}, {$set: {a: 2}}, {multi: false}),
        ErrorCodes.BadValue);

    mongosServerStatus = testDB.adminCommand({serverStatus: 1});

    // Verify that only the first four upserts incremented the metric counter.
    assert.eq(4, mongosServerStatus.metrics.query.updateOneOpStyleBroadcastWithExactIDCount);

    st.stop();
})();