Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.

Commit 2d47126

Browse files
committed
test(mongos): test connection leak
1 parent eba08d6 commit 2d47126

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
'use strict';
2+
3+
const Mongos = require('../../../../lib/topologies/mongos');
4+
const expect = require('chai').expect;
5+
const mock = require('mongodb-mock-server');
6+
const genClusterTime = require('../common').genClusterTime;
7+
8+
const Connection = require('../../../../lib/connection/connection');
9+
10+
describe('Reconnect (Mongos)', function() {
11+
const fixture = {};
12+
13+
function startServer() {
14+
return mock.createServer(fixture.port).then(mockServer => {
15+
mockServer.setMessageHandler(request => {
16+
request.reply(
17+
Object.assign({}, mock.DEFAULT_ISMASTER, {
18+
$clusterTime: genClusterTime(Date.now()),
19+
msg: 'isdbgrid'
20+
})
21+
);
22+
});
23+
fixture.server = mockServer;
24+
fixture.port = mockServer.port;
25+
});
26+
}
27+
28+
function stopServer() {
29+
return mock.cleanup();
30+
}
31+
32+
beforeEach(() => startServer());
33+
beforeEach(() => Connection.enableConnectionAccounting());
34+
afterEach(() => Connection.disableConnectionAccounting());
35+
afterEach(() => stopServer());
36+
37+
it('should not connection swarm when reconnecting', function(done) {
38+
const reconnectInterval = 500;
39+
const socketTimeout = reconnectInterval * 5;
40+
const haInterval = reconnectInterval * 10;
41+
const reconnectTries = Number.MAX_VALUE;
42+
43+
const connectOptions = {
44+
haInterval,
45+
reconnectInterval,
46+
socketTimeout,
47+
reconnectTries,
48+
reconnect: true,
49+
poolSize: 500
50+
};
51+
52+
const mongos = new Mongos([fixture.server.address()], connectOptions);
53+
54+
function runIsMaster(assertion) {
55+
return new Promise((resolve, reject) => {
56+
mongos.command('admin.$cmd', { ismaster: 1 }, {}, (err, response) => {
57+
try {
58+
assertion(err, response);
59+
resolve();
60+
} catch (e) {
61+
reject(e);
62+
}
63+
});
64+
});
65+
}
66+
67+
function connectMongos() {
68+
return new Promise((resolve, reject) => {
69+
mongos.once('error', reject);
70+
mongos.once('connect', resolve);
71+
mongos.connect(connectOptions);
72+
});
73+
}
74+
75+
function assertSuccess(err, response) {
76+
expect(err).to.not.exist;
77+
expect(response).to.exist;
78+
}
79+
80+
function assertError(err, response) {
81+
expect(err).to.exist;
82+
expect(response).to.not.exist;
83+
}
84+
85+
function delay(ms) {
86+
return new Promise(resolve => setTimeout(resolve, ms));
87+
}
88+
89+
function cleanup(err) {
90+
mongos.destroy();
91+
return err;
92+
}
93+
94+
Promise.resolve()
95+
.then(() => connectMongos())
96+
.then(() => runIsMaster(assertSuccess))
97+
.then(() => stopServer())
98+
.then(() => runIsMaster(assertError))
99+
.then(() => delay(haInterval * 2))
100+
.then(() => startServer())
101+
.then(() => delay(haInterval * 2))
102+
.then(() => expect(Object.keys(Connection.connections())).to.have.a.lengthOf(1))
103+
.then(() => cleanup(), cleanup)
104+
.then(done);
105+
});
106+
});

0 commit comments

Comments
 (0)