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

Commit 78dab5d

Browse files
committed
feat(txns): support mongos pinning in unified topology
1 parent f89eb61 commit 78dab5d

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

lib/sdam/topology.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ class Topology extends EventEmitter {
206206
translateReadPreference(options);
207207
const readPreference = options.readPreference || ReadPreference.primary;
208208

209-
this.selectServer(readPreferenceServerSelector(readPreference), (err, server) => {
209+
this.selectServer(readPreferenceServerSelector(readPreference), options, (err, server) => {
210210
if (err) {
211211
if (typeof callback === 'function') {
212212
callback(err, null);
@@ -310,14 +310,29 @@ class Topology extends EventEmitter {
310310
options
311311
);
312312

313+
const isSharded = this.description.type === TopologyType.Sharded;
314+
const session = options.session;
315+
const transaction = session && session.transaction;
316+
317+
if (isSharded && transaction && transaction.server) {
318+
callback(null, transaction.server);
319+
return;
320+
}
321+
313322
selectServers(
314323
this,
315324
selector,
316325
options.serverSelectionTimeoutMS,
317326
process.hrtime(),
318327
(err, servers) => {
319328
if (err) return callback(err, null);
320-
callback(null, randomSelection(servers));
329+
330+
const selectedServer = randomSelection(servers);
331+
if (isSharded && transaction && transaction.isActive) {
332+
transaction.pinServer(selectedServer);
333+
}
334+
335+
callback(null, selectedServer);
321336
}
322337
);
323338
}
@@ -505,7 +520,7 @@ class Topology extends EventEmitter {
505520
translateReadPreference(options);
506521
const readPreference = options.readPreference || ReadPreference.primary;
507522

508-
this.selectServer(readPreferenceServerSelector(readPreference), (err, server) => {
523+
this.selectServer(readPreferenceServerSelector(readPreference), options, (err, server) => {
509524
if (err) {
510525
callback(err, null);
511526
return;
@@ -868,7 +883,7 @@ function executeWriteOperation(args, options, callback) {
868883
isRetryableWritesSupported(topology) &&
869884
!options.session.inTransaction();
870885

871-
topology.selectServer(writableServerSelector(), (err, server) => {
886+
topology.selectServer(writableServerSelector(), options, (err, server) => {
872887
if (err) {
873888
callback(err, null);
874889
return;

0 commit comments

Comments
 (0)