summaryrefslogtreecommitdiff
path: root/jstests/sharding/warm_up_connection_pool.js
blob: 486fe4b1825693252a0697860a6aa38330d96326 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
 * This test checks that Mongos is pre-warming connections before accepting connections.
 *
 * This test requires users to persist across a restart.
 * @tags: [requires_persistence]
 */

(function() {
'use strict';
load("jstests/replsets/rslib.js");

function runTest(setParams, assertCheck, extraOptionsAction) {
    jsTestLog('Starting next iteration');
    const test = new ShardingTest({shards: 2, mongosOptions: setParams});
    var db = test.getDB("test");

    const shardCommand = {shardcollection: "test.foo", key: {num: 1}};

    // shard
    assert.commandWorked(test.s0.adminCommand({enablesharding: "test"}));
    assert.commandWorked(test.s0.adminCommand(shardCommand));

    var primary;
    var mId;
    if (extraOptionsAction !== undefined) {
        const resp = extraOptionsAction(test);
        primary = resp.connString;
        mId = resp.nodeId;
    }

    test.restartMongos(0);

    db = test.getDB("admin");
    var connPoolStats = db.runCommand({connPoolStats: 1});
    var shardList = db.runCommand({listShards: 1});

    for (var shard in shardList["shards"]) {
        var currentShard = getShardHostName(shardList, shard);
        assertCheck(connPoolStats, currentShard, primary);
    }

    if (extraOptionsAction !== undefined) {
        jsTestLog(`Restart ${mId}`);
        test.rs0.restart(mId);
        // Wait for mongos to recognize that the host is up.
        awaitRSClientHosts(test.s0, test.rs0.nodes[mId], {ok: true});
    }

    test.stop();
}

function getShardHostName(shardlist, shard) {
    return shardlist["shards"][shard]["host"].split("/")[1];
}

// Tests basic warm up of connection pool
var testWarmUpParams = {};
var testWarmUpAssertCheck = function(connPoolStats, currentShard) {
    assert.soon(() => connPoolStats["hosts"][currentShard]["inUse"] +
                        connPoolStats["hosts"][currentShard]["available"] +
                        connPoolStats["hosts"][currentShard]["refreshing"] >=
                    1,
                `Connections ${tojson(connPoolStats)}`,
                5 * 60 * 1000,
                1000);
};

runTest(testWarmUpParams, testWarmUpAssertCheck);

// Tests does not warm up connection pool when parameter is disabled
var warmUpDisabledParams = {
    setParameter: {warmMinConnectionsInShardingTaskExecutorPoolOnStartup: false}
};
var warmUpDisabledAssertCheck = function(connPoolStats, currentShard) {
    assert.eq(null, connPoolStats["hosts"][currentShard]);
};

runTest(warmUpDisabledParams, warmUpDisabledAssertCheck);

// Tests establishes more connections when parameter is set
var biggerPoolSizeParams = {setParameter: {ShardingTaskExecutorPoolMinSize: 3}};
var biggerPoolSizeAssertCheck = function(connPoolStats, currentShard) {
    assert.soon(() => connPoolStats["hosts"][currentShard]["inUse"] +
                        connPoolStats["hosts"][currentShard]["available"] +
                        connPoolStats["hosts"][currentShard]["refreshing"] >=
                    3,
                `Connections ${tojson(connPoolStats)}`,
                5 * 60 * 1000,
                1000);
};

runTest(biggerPoolSizeParams, biggerPoolSizeAssertCheck);

// Tests establishes connections it can and ignores the ones it can't
var shutdownNodeParams = {};
var shutdownNodeAssertCheck = function(connPoolStats, currentShard, primary) {
    if (currentShard == primary) {
        assert.soon(() => connPoolStats["hosts"][currentShard]["inUse"] +
                            connPoolStats["hosts"][currentShard]["available"] ===
                        0,
                    `Connections ${tojson(connPoolStats)}`,
                    5 * 60 * 1000,
                    1000);
    } else {
        assert.soon(() => connPoolStats["hosts"][currentShard]["inUse"] +
                            connPoolStats["hosts"][currentShard]["available"] +
                            connPoolStats["hosts"][currentShard]["refreshing"] >=
                        1,
                    `Connections ${tojson(connPoolStats)}`,
                    5 * 60 * 1000,
                    1000);
    }
};
var shutdownNodeExtraOptions = function(test) {
    const nodeList = test.rs0.nodeList();
    const master = test.rs0.getPrimary();
    var mId = test.rs0.getNodeId(master);

    test.rs0.stop(mId);
    return {connString: nodeList[mId], nodeId: mId};
};

runTest(shutdownNodeParams, shutdownNodeAssertCheck, shutdownNodeExtraOptions);
})();