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