Skip to content

Commit d036eda

Browse files
add new error in server selection
1 parent 1e41d9d commit d036eda

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

src/sdam/topology.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,15 @@ function processWaitQueue(topology: Topology) {
978978
: server2;
979979
}
980980

981+
if (!selectedServer) {
982+
waitQueueMember.callback(
983+
new MongoServerSelectionError(
984+
'server selection returned a server description but the server was not found in the topology',
985+
topology.description
986+
)
987+
);
988+
return;
989+
}
981990
const transaction = waitQueueMember.transaction;
982991
if (isSharded && transaction && transaction.isActive && selectedServer) {
983992
transaction.pinServer(selectedServer);

test/unit/sdam/topology.test.js

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const mock = require('../../tools/mongodb-mock/index');
44
const { expect } = require('chai');
55
const sinon = require('sinon');
66
const net = require('net');
7-
const { MongoClient, ReadPreference } = require('../../../src');
7+
const { MongoClient, MongoServerSelectionError, ReadPreference } = require('../../../src');
88
const { Topology } = require('../../../src/sdam/topology');
99
const { Server } = require('../../../src/sdam/server');
1010
const { ServerDescription } = require('../../../src/sdam/server_description');
@@ -190,8 +190,73 @@ describe('Topology (unit)', function () {
190190

191191
describe('error handling', function () {
192192
let mockServer;
193-
beforeEach(() => mock.createServer().then(server => (mockServer = server)));
194-
afterEach(() => mock.cleanup());
193+
let secondMockServer;
194+
beforeEach(async () => {
195+
await mock.createServer(27218).then(server => (mockServer = server));
196+
await mock.createServer(27219).then(server => (secondMockServer = server));
197+
});
198+
afterEach(async () => {
199+
await mock.cleanup();
200+
sinon.restore();
201+
});
202+
203+
context(
204+
'when server selection returns a server description but the description is not in the topology',
205+
function () {
206+
beforeEach(() => {
207+
mockServer.setMessageHandler(request => {
208+
const doc = request.document;
209+
if (isHello(doc)) {
210+
request.reply(Object.assign({}, mock.HELLO, { maxWireVersion: 9 }));
211+
} else {
212+
request.reply({ ok: 1 });
213+
}
214+
});
215+
secondMockServer.setMessageHandler(request => {
216+
const doc = request.document;
217+
if (isHello(doc)) {
218+
request.reply(Object.assign({}, mock.HELLO, { maxWireVersion: 9 }));
219+
} else {
220+
request.reply({ ok: 1 });
221+
}
222+
});
223+
});
224+
context('when the topology originally only contained one server', function () {
225+
it('returns a MongoServerSelectionError', function (done) {
226+
topology = new Topology([mockServer.hostAddress(), secondMockServer.hostAddress()]);
227+
228+
topology.connect(err => {
229+
expect(err).to.not.exist;
230+
sinon.stub(topology.s.servers, 'get').callsFake(() => {
231+
return undefined;
232+
});
233+
topology.selectServer('primary', {}, (err, server) => {
234+
expect(err).to.be.instanceOf(MongoServerSelectionError);
235+
expect(server).not.to.exist;
236+
done();
237+
});
238+
});
239+
});
240+
});
241+
context('when the topology originally contained more than one server', function () {
242+
it('returns a MongoServerSelectionError', function (done) {
243+
topology = new Topology([mockServer.hostAddress(), secondMockServer.hostAddress()]);
244+
245+
topology.connect(err => {
246+
expect(err).to.not.exist;
247+
sinon.stub(topology.s.servers, 'get').callsFake(() => {
248+
return undefined;
249+
});
250+
topology.selectServer('primary', {}, (err, server) => {
251+
expect(err).to.be.instanceOf(MongoServerSelectionError);
252+
expect(server).not.to.exist;
253+
done();
254+
});
255+
});
256+
});
257+
});
258+
}
259+
);
195260

196261
it('should set server to unknown and reset pool on `node is recovering` error', function (done) {
197262
mockServer.setMessageHandler(request => {

0 commit comments

Comments
 (0)