Skip to content

Commit a91e9af

Browse files
await heartbeats part 2
1 parent 777d890 commit a91e9af

File tree

4 files changed

+71
-185
lines changed

4 files changed

+71
-185
lines changed

socket-connection-rtt-monitoring.cjs

Lines changed: 0 additions & 161 deletions
This file was deleted.

test/integration/node-specific/client_close.test.ts

Lines changed: 48 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { type TestConfiguration } from '../../tools/runner/config';
33
import { runScriptAndGetProcessInfo } from './resource_tracking_script_builder';
44

5-
describe.only('MongoClient.close() Integration', () => {
5+
describe.skip('MongoClient.close() Integration', () => {
66
// note: these tests are set-up in accordance of the resource ownership tree
77

88
let config: TestConfiguration;
@@ -120,13 +120,19 @@ describe.only('MongoClient.close() Integration', () => {
120120
'monitor interval timer is cleaned up by client.close()',
121121
metadata,
122122
async function () {
123-
const run = async function ({ MongoClient, uri, expect, getTimerCount, mongodb }) {
123+
const run = async function ({
124+
MongoClient,
125+
uri,
126+
expect,
127+
getTimerCount,
128+
promiseWithResolvers
129+
}) {
124130
const heartbeatFrequencyMS = 2000;
125131
const client = new MongoClient(uri, { heartbeatFrequencyMS });
126-
const { heartbeatPromise, resolve } = mongodb.promiseWithResolvers();
132+
const { promise, resolve } = promiseWithResolvers();
127133
client.once('serverHeartbeatSucceeded', () => resolve());
128134
await client.connect();
129-
await heartbeatPromise;
135+
await promise;
130136

131137
function monitorTimersExist(servers) {
132138
for (const [, server] of servers) {
@@ -153,12 +159,18 @@ describe.only('MongoClient.close() Integration', () => {
153159
'the new monitor interval timer is cleaned up by client.close()',
154160
metadata,
155161
async () => {
156-
const run = async function ({ MongoClient, expect, getTimerCount }) {
162+
const run = async function ({
163+
MongoClient,
164+
expect,
165+
getTimerCount,
166+
promiseWithResolvers
167+
}) {
157168
const heartbeatFrequencyMS = 2000;
158169
const client = new MongoClient('mongodb://fakeUri', { heartbeatFrequencyMS });
159-
const heartbeatPromise = client.once('serverHeartbeatFailed', v => v);
170+
const { promise, resolve } = promiseWithResolvers();
171+
client.once('serverHeartbeatFailed', () => resolve());
160172
client.connect();
161-
await heartbeatPromise;
173+
await promise;
162174

163175
function getMonitorTimer(servers) {
164176
for (const [, server] of servers) {
@@ -213,16 +225,22 @@ describe.only('MongoClient.close() Integration', () => {
213225
'the rtt pinger timer is cleaned up by client.close()',
214226
metadata,
215227
async function () {
216-
const run = async function ({ MongoClient, uri, expect, getTimerCount, mongodb }) {
228+
const run = async function ({
229+
MongoClient,
230+
uri,
231+
expect,
232+
getTimerCount,
233+
promiseWithResolvers
234+
}) {
217235
const heartbeatFrequencyMS = 2000;
218236
const client = new MongoClient(uri, {
219237
serverMonitoringMode: 'stream',
220238
heartbeatFrequencyMS
221239
});
222240
await client.connect();
223-
const { heartbeatPromise, resolve } = mongodb.promiseWithResolvers();
241+
const { promise, resolve } = promiseWithResolvers();
224242
client.once('serverHeartbeatSucceeded', () => resolve());
225-
await heartbeatPromise;
243+
await promise;
226244

227245
function getRttTimer(servers) {
228246
for (const [, server] of servers) {
@@ -248,8 +266,14 @@ describe.only('MongoClient.close() Integration', () => {
248266
describe('Node.js resource: Socket', () => {
249267
describe('when rtt monitoring is turned on', () => {
250268
it('no sockets remain after client.close()', metadata, async () => {
251-
const run = async ({ MongoClient, uri, expect, getSockets, mongodb }) => {
252-
const heartbeatFrequencyMS = 100;
269+
const run = async ({
270+
MongoClient,
271+
uri,
272+
expect,
273+
getSockets,
274+
promiseWithResolvers
275+
}) => {
276+
const heartbeatFrequencyMS = 500;
253277
const client = new MongoClient(uri, {
254278
serverMonitoringMode: 'stream',
255279
heartbeatFrequencyMS
@@ -258,27 +282,28 @@ describe.only('MongoClient.close() Integration', () => {
258282

259283
const socketsAddressesBeforeHeartbeat = getSockets().map(r => r.address);
260284

261-
const activeSocketsAfterHeartbeat = () =>
262-
getSockets()
263-
.filter(r => !socketsAddressesBeforeHeartbeat.includes(r.address))
264-
.map(r => r.remoteEndpoint?.host + ':' + r.remoteEndpoint?.port);
265-
266-
// set of servers whose hearbeats have occurred
285+
// set of servers whose heartbeats have occurred
267286
const heartbeatOccurredSet = new Set();
268287

269288
const servers = client.topology.s.servers;
289+
270290
while (heartbeatOccurredSet.size < servers.size) {
271-
const { heartbeatPromise, resolve } = mongodb.promiseWithResolvers();
272-
client.once('serverHeartbeatSucceeded', (ev) => {
291+
const { promise, resolve } = promiseWithResolvers();
292+
client.once('serverHeartbeatSucceeded', ev => {
273293
heartbeatOccurredSet.add(ev.connectionId);
274294
resolve();
275295
});
276-
await heartbeatPromise;
296+
await promise;
277297
}
278298

299+
const activeSocketsAfterHeartbeat = () =>
300+
getSockets()
301+
.filter(r => !socketsAddressesBeforeHeartbeat.includes(r.address))
302+
.map(r => r.remoteEndpoint?.host + ':' + r.remoteEndpoint?.port);
279303
// all servers should have had a heartbeat event and had a new socket created for rtt pinger
280-
for (const [server,] of servers) {
281-
expect(activeSocketsAfterHeartbeat()).to.deep.contain(server[0]);
304+
const activeSocketsBeforeClose = activeSocketsAfterHeartbeat();
305+
for (const [server] of servers) {
306+
expect(activeSocketsBeforeClose).to.deep.contain(server);
282307
}
283308

284309
// close the client

test/integration/node-specific/resource_tracking_script_builder.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export type ProcessResourceTestFunction = (options: {
3131
timers?: typeof timers;
3232
getSocketReport?: () => { host: string; port: string };
3333
getSocketEndpointReport?: () => any;
34+
promiseWithResolvers?: () => any;
3435
}) => Promise<void>;
3536

3637
const HEAP_RESOURCE_SCRIPT_PATH = path.resolve(

test/tools/fixtures/process_resource_script.in.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ const getSocketEndpoints = () =>
9898
.libuv.filter(r => r.type === 'tcp')
9999
.map(r => r.remoteEndpoint);
100100

101+
function promiseWithResolvers() {
102+
let resolve;
103+
let reject;
104+
const promise = new Promise((promiseResolve, promiseReject) => {
105+
resolve = promiseResolve;
106+
reject = promiseReject;
107+
});
108+
return { promise, resolve, reject };
109+
}
110+
101111
// A log function for debugging
102112
function log(message) {
103113
// remove outer parentheses for easier parsing
@@ -110,7 +120,18 @@ async function main() {
110120
process.on('beforeExit', () => {
111121
log({ beforeExitHappened: true });
112122
});
113-
await run({ MongoClient, uri, log, expect, mongodb, sleep, getTimerCount, getSockets, getSocketEndpoints });
123+
await run({
124+
MongoClient,
125+
uri,
126+
log,
127+
expect,
128+
mongodb,
129+
sleep,
130+
getTimerCount,
131+
getSockets,
132+
getSocketEndpoints,
133+
promiseWithResolvers
134+
});
114135
log({ newResources: getNewResources() });
115136
}
116137

0 commit comments

Comments
 (0)