summaryrefslogtreecommitdiff
path: root/jstests/sharding/load_balancer_support/load_balanced_server_status_metrics.js
blob: 878eb60f448a9ccb50a0b997802168d33f223aea (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
/**
 * @tags: [requires_fcv_51, featureFlagLoadBalancer]
 *
 * Tests that load-balanced connections are reported correctly in server status metrics.
 */

(() => {
    "use strict";

    load('jstests/libs/fail_point_util.js');

    const numConnections = 10;

    function createTemporaryConnection(uri, dbName, collectionName) {
        // Retry connecting until you are successful
        var pollString = "var conn = null;" +
            "assert.soon(function() {" +
            "try { conn = new Mongo(\"" + uri + "\"); return conn" +
            "} catch (x) {return false;}}, " +
            "\"Timed out waiting for temporary connection to connect\", 30000, 5000);";
        // Poll the signal collection until it is told to terminate.
        pollString += "assert.soon(function() {" +
            "return conn.getDB('" + dbName + "').getCollection('" + collectionName + "')" +
            ".findOne().stop;}, \"Parallel shell never told to terminate\", 10 * 60000);";
        return startParallelShell(pollString, null, true);
    }

    function waitForConnections(db, expected) {
        assert.soon(() => admin.serverStatus().connections.loadBalanced == expected,
                    () => "Incorrect number of load-balanced connections: expected " + expected +
                        ", but serverStatus() reports " +
                        admin.serverStatus().connections.loadBalanced,
                    5 * 60000);
    }

    var st = new ShardingTest({shards: 1, mongos: 1});
    let admin = st.s.getDB("admin");

    assert(admin.adminCommand({getParameter: 1, featureFlagLoadBalancer: 1})
               .featureFlagLoadBalancer.value,
           'featureFlagLoadBalancer should be enabled for this test');
    assert.commandWorked(
        admin.adminCommand({configureFailPoint: 'clientIsFromLoadBalancer', mode: 'alwaysOn'}));

    var uri = "mongodb://" + admin.getMongo().host + "/?loadBalanced=true";

    var testDB = 'connectionsOpenedTest';
    var signalCollection = 'keepRunning';

    admin.getSiblingDB(testDB).dropDatabase();
    admin.getSiblingDB(testDB).getCollection(signalCollection).insert({stop: false});

    var connections = [];
    for (var i = 0; i < numConnections; i++) {
        connections.push(createTemporaryConnection(uri, testDB, signalCollection));
        waitForConnections(admin, i + 1);
    }

    admin.getSiblingDB(testDB).getCollection(signalCollection).update({}, {$set: {stop: true}});
    for (var i = 0; i < numConnections; i++) {
        connections[i]();
    }
    waitForConnections(admin, 0);

    assert.commandWorked(
        admin.adminCommand({configureFailPoint: 'clientIsFromLoadBalancer', mode: 'off'}));
    st.stop();
})();