@@ -206,7 +206,7 @@ class Topology extends EventEmitter {
206
206
translateReadPreference ( options ) ;
207
207
const readPreference = options . readPreference || ReadPreference . primary ;
208
208
209
- this . selectServer ( readPreferenceServerSelector ( readPreference ) , ( err , server ) => {
209
+ this . selectServer ( readPreferenceServerSelector ( readPreference ) , options , ( err , server ) => {
210
210
if ( err ) {
211
211
if ( typeof callback === 'function' ) {
212
212
callback ( err , null ) ;
@@ -310,14 +310,29 @@ class Topology extends EventEmitter {
310
310
options
311
311
) ;
312
312
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
+
313
322
selectServers (
314
323
this ,
315
324
selector ,
316
325
options . serverSelectionTimeoutMS ,
317
326
process . hrtime ( ) ,
318
327
( err , servers ) => {
319
328
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 ) ;
321
336
}
322
337
) ;
323
338
}
@@ -505,7 +520,7 @@ class Topology extends EventEmitter {
505
520
translateReadPreference ( options ) ;
506
521
const readPreference = options . readPreference || ReadPreference . primary ;
507
522
508
- this . selectServer ( readPreferenceServerSelector ( readPreference ) , ( err , server ) => {
523
+ this . selectServer ( readPreferenceServerSelector ( readPreference ) , options , ( err , server ) => {
509
524
if ( err ) {
510
525
callback ( err , null ) ;
511
526
return ;
@@ -868,7 +883,7 @@ function executeWriteOperation(args, options, callback) {
868
883
isRetryableWritesSupported ( topology ) &&
869
884
! options . session . inTransaction ( ) ;
870
885
871
- topology . selectServer ( writableServerSelector ( ) , ( err , server ) => {
886
+ topology . selectServer ( writableServerSelector ( ) , options , ( err , server ) => {
872
887
if ( err ) {
873
888
callback ( err , null ) ;
874
889
return ;
0 commit comments