Skip to content

Commit

Permalink
fix(NODE-4608): prevent parallel monitor checks (#3404)
Browse files Browse the repository at this point in the history
  • Loading branch information
baileympearson committed Oct 4, 2022
1 parent 1a550df commit 78bcfe4
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 43 deletions.
4 changes: 4 additions & 0 deletions src/sdam/monitor.ts
Expand Up @@ -328,6 +328,10 @@ function checkServer(monitor: Monitor, callback: Callback<Document | null>) {

function monitorServer(monitor: Monitor) {
return (callback: Callback) => {
if (monitor.s.state === STATE_MONITORING) {
process.nextTick(callback);
return;
}
stateTransition(monitor, STATE_MONITORING);
function done() {
if (!isInCloseState(monitor)) {
Expand Down
@@ -1,50 +1,8 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { Socket } from 'net';
import * as path from 'path';

import { loadSpecTests } from '../../spec';
import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner';
import { TestFilter } from '../../tools/unified-spec-runner/schema';
import { sleep } from '../../tools/utils';

const filter: TestFilter = ({ description }) => {
switch (description) {
case 'Network error on Monitor check':
case 'Network timeout on Monitor check':
return 'TODO(NODE-4608): Disallow parallel monitor checks';
default:
return false;
}
};

describe('SDAM Unified Tests', function () {
afterEach(async function () {
if (this.currentTest!.pending) {
return;
}
// TODO(NODE-4573): fix socket leaks
const LEAKY_TESTS = [
'Command error on Monitor handshake',
'Network error on Monitor check',
'Network timeout on Monitor check',
'Network error on Monitor handshake',
'Network timeout on Monitor handshake'
];

await sleep(250);
const sockArray = (process as any)._getActiveHandles().filter(handle => {
// Stdio are instanceof Socket so look for fd to be null
return handle.fd == null && handle instanceof Socket && handle.destroyed !== true;
});
if (!sockArray.length) {
return;
}
for (const sock of sockArray) {
sock.destroy();
}
if (!LEAKY_TESTS.some(test => test === this.currentTest!.title)) {
this.test!.error(new Error(`Test failed to clean up ${sockArray.length} socket(s)`));
}
});
runUnifiedSuite(loadSpecTests(path.join('server-discovery-and-monitoring', 'unified')), filter);
runUnifiedSuite(loadSpecTests(path.join('server-discovery-and-monitoring', 'unified')));
});

0 comments on commit 78bcfe4

Please sign in to comment.