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

Commit 0d3c32c

Browse files
committed
refactor(topology): translate read preferences at the surface api
This will eventually be handled by options management in `native` but for now we need to emulate the same behavior as the legacy topology classes and translate read preferences.
1 parent 5c630ab commit 0d3c32c

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

lib/sdam/monitoring.js

-4
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,6 @@ function monitorServer(server, options) {
194194
// an ismaster call fails we reset the server's pool. If a server was once connected,
195195
// change its type to `Unknown` only after retrying once.
196196
server.s.pool.reset(() => {
197-
if (server.description.type === ServerType.Unknown) {
198-
return;
199-
}
200-
201197
// otherwise re-attempt monitoring once
202198
checkServer((error, isMaster) => {
203199
if (error) {

lib/sdam/server.js

-1
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,6 @@ function connectEventHandler(server) {
375375
function errorEventHandler(server) {
376376
return function(err) {
377377
if (err) {
378-
server.s.state = STATE_DISCONNECTED;
379378
server.emit('error', new MongoNetworkError(err));
380379
}
381380

lib/sdam/topology.js

+29-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22
const EventEmitter = require('events');
33
const ServerDescription = require('./server_description').ServerDescription;
4+
const ServerType = require('./server_description').ServerType;
45
const TopologyDescription = require('./topology_description').TopologyDescription;
56
const TopologyType = require('./topology_description').TopologyType;
67
const monitoring = require('./monitoring');
@@ -19,7 +20,6 @@ const createCompressionInfo = require('../topologies/shared').createCompressionI
1920
const isRetryableError = require('../error').isRetryableError;
2021
const MongoParseError = require('../error').MongoParseError;
2122
const ClientSession = require('../sessions').ClientSession;
22-
const ServerType = require('./server_description').ServerType;
2323
const createClientInfo = require('../topologies/shared').createClientInfo;
2424
const MongoError = require('../error').MongoError;
2525
const resolveClusterTime = require('../topologies/shared').resolveClusterTime;
@@ -122,6 +122,7 @@ class Topology extends EventEmitter {
122122
options.replicaSet,
123123
null,
124124
null,
125+
null,
125126
options
126127
),
127128
serverSelectionTimeoutMS: options.serverSelectionTimeoutMS,
@@ -201,7 +202,10 @@ class Topology extends EventEmitter {
201202

202203
// otherwise, wait for a server to properly connect based on user provided read preference,
203204
// or primary.
204-
const readPreference = resolveReadPreference(options);
205+
206+
translateReadPreference(options);
207+
const readPreference = options.readPreference || ReadPreference.primary;
208+
205209
this.selectServer(readPreferenceServerSelector(readPreference), (err, server) => {
206210
if (err) {
207211
if (typeof callback === 'function') {
@@ -486,9 +490,8 @@ class Topology extends EventEmitter {
486490
(callback = options), (options = {}), (options = options || {});
487491
}
488492

489-
// TODO: type resolution should happen elsewhere
490-
const readPreference = resolveReadPreference(options);
491-
options = Object.assign(options, { readPreference });
493+
translateReadPreference(options);
494+
const readPreference = options.readPreference || ReadPreference.primary;
492495

493496
this.selectServer(readPreferenceServerSelector(readPreference), (err, server) => {
494497
if (err) {
@@ -548,6 +551,7 @@ class Topology extends EventEmitter {
548551
options = options || {};
549552
const topology = options.topology || this;
550553
const CursorClass = options.cursorFactory || this.s.Cursor;
554+
translateReadPreference(options);
551555

552556
return new CursorClass(this.s.bson, ns, cmd, options, topology, this.s.options);
553557
}
@@ -577,7 +581,10 @@ class Topology extends EventEmitter {
577581
lastIsMaster() {
578582
const serverDescriptions = Array.from(this.description.servers.values());
579583
if (serverDescriptions.length === 0) return {};
580-
return serverDescriptions.filter(sd => sd.type !== ServerType.Unknown)[0] || {};
584+
585+
const sd = serverDescriptions.filter(sd => sd.type !== ServerType.Unknown)[0];
586+
const result = sd || { maxWireVersion: this.description.commonWireVersion };
587+
return result;
581588
}
582589

583590
get logicalSessionTimeoutMinutes() {
@@ -911,17 +918,26 @@ function resetServerState(server, error, options) {
911918
resetState();
912919
}
913920

914-
function resolveReadPreference(options) {
915-
let readPreference = options.readPreference || new ReadPreference('primary');
916-
if (typeof readPreference === 'string') {
917-
readPreference = new ReadPreference(readPreference);
921+
function translateReadPreference(options) {
922+
if (options.readPreference == null) {
923+
return;
918924
}
919925

920-
if (!(readPreference instanceof ReadPreference)) {
921-
throw new MongoError('read preference must be a ReadPreference instance');
926+
let r = options.readPreference;
927+
if (typeof r === 'string') {
928+
options.readPreference = new ReadPreference(r);
929+
} else if (r && !(r instanceof ReadPreference) && typeof r === 'object') {
930+
const mode = r.mode || r.preference;
931+
if (mode && typeof mode === 'string') {
932+
options.readPreference = new ReadPreference(mode, r.tags, {
933+
maxStalenessSeconds: r.maxStalenessSeconds
934+
});
935+
}
936+
} else if (!(r instanceof ReadPreference)) {
937+
throw new TypeError('Invalid read preference: ' + r);
922938
}
923939

924-
return readPreference;
940+
return options;
925941
}
926942

927943
/**

0 commit comments

Comments
 (0)