@@ -267,10 +267,7 @@ func (coll *Collection) insert(ctx context.Context, documents []interface{},
267
267
sess = nil
268
268
}
269
269
270
- selector := coll .writeSelector
271
- if sess != nil && sess .PinnedServer != nil {
272
- selector = sess .PinnedServer
273
- }
270
+ selector := makePinnedSelector (sess , coll .writeSelector )
274
271
275
272
op := operation .NewInsert (docs ... ).
276
273
Session (sess ).WriteConcern (wc ).CommandMonitor (coll .client .monitor ).
@@ -386,10 +383,7 @@ func (coll *Collection) delete(ctx context.Context, filter interface{}, deleteOn
386
383
sess = nil
387
384
}
388
385
389
- selector := coll .writeSelector
390
- if sess != nil && sess .PinnedServer != nil {
391
- selector = sess .PinnedServer
392
- }
386
+ selector := makePinnedSelector (sess , coll .writeSelector )
393
387
394
388
var limit int32
395
389
if deleteOne {
@@ -490,10 +484,7 @@ func (coll *Collection) updateOrReplace(ctx context.Context, filter, update bson
490
484
sess = nil
491
485
}
492
486
493
- selector := coll .writeSelector
494
- if sess != nil && sess .PinnedServer != nil {
495
- selector = sess .PinnedServer
496
- }
487
+ selector := makePinnedSelector (sess , coll .writeSelector )
497
488
498
489
op := operation .NewUpdate (updateDoc ).
499
490
Session (sess ).WriteConcern (wc ).CommandMonitor (coll .client .monitor ).
@@ -672,13 +663,11 @@ func aggregate(a aggregateParams) (*Cursor, error) {
672
663
sess = nil
673
664
}
674
665
675
- selector := a .readSelector
666
+ defaultSelector := a .readSelector
676
667
if hasDollarOut {
677
- selector = a .writeSelector
678
- }
679
- if sess != nil && sess .PinnedServer != nil {
680
- selector = sess .PinnedServer
668
+ defaultSelector = a .writeSelector
681
669
}
670
+ selector := makePinnedSelector (sess , defaultSelector )
682
671
683
672
ao := options .MergeAggregateOptions (a .opts ... )
684
673
cursorOpts := driver.CursorOptions {
@@ -870,10 +859,7 @@ func (coll *Collection) Distinct(ctx context.Context, fieldName string, filter i
870
859
rc = nil
871
860
}
872
861
873
- selector := coll .readSelector
874
- if sess != nil && sess .PinnedServer != nil {
875
- selector = sess .PinnedServer
876
- }
862
+ selector := makePinnedSelector (sess , coll .readSelector )
877
863
878
864
option := options .MergeDistinctOptions (opts ... )
879
865
@@ -951,10 +937,7 @@ func (coll *Collection) Find(ctx context.Context, filter interface{},
951
937
rc = nil
952
938
}
953
939
954
- selector := coll .writeSelector
955
- if sess != nil && sess .PinnedServer != nil {
956
- selector = sess .PinnedServer
957
- }
940
+ selector := makePinnedSelector (sess , coll .writeSelector )
958
941
959
942
op := operation .NewFind (f ).
960
943
Session (sess ).ReadConcern (rc ).ReadPreference (coll .readPreference ).
@@ -1142,10 +1125,7 @@ func (coll *Collection) findAndModify(ctx context.Context, op *operation.FindAnd
1142
1125
sess = nil
1143
1126
}
1144
1127
1145
- selector := coll .writeSelector
1146
- if sess != nil && sess .PinnedServer != nil {
1147
- selector = sess .PinnedServer
1148
- }
1128
+ selector := makePinnedSelector (sess , coll .writeSelector )
1149
1129
1150
1130
retry := driver .RetryNone
1151
1131
if coll .client .retryWrites {
@@ -1378,10 +1358,7 @@ func (coll *Collection) Drop(ctx context.Context) error {
1378
1358
sess = nil
1379
1359
}
1380
1360
1381
- selector := coll .writeSelector
1382
- if sess != nil && sess .PinnedServer != nil {
1383
- selector = sess .PinnedServer
1384
- }
1361
+ selector := makePinnedSelector (sess , coll .writeSelector )
1385
1362
1386
1363
op := operation .NewDropCollection ().
1387
1364
Session (sess ).WriteConcern (wc ).CommandMonitor (coll .client .monitor ).
@@ -1397,3 +1374,15 @@ func (coll *Collection) Drop(ctx context.Context) error {
1397
1374
}
1398
1375
return nil
1399
1376
}
1377
+
1378
+ // makePinnedSelector makes a selector for a pinned session with a pinned server. Will attempt to do server selection on
1379
+ // the pinned server but if that fails it will go through a list of default selectors
1380
+ func makePinnedSelector (sess * session.Client , defaultSelector description.ServerSelector ) description.ServerSelectorFunc {
1381
+ return func (t description.Topology , svrs []description.Server ) ([]description.Server , error ) {
1382
+ if sess != nil && sess .PinnedServer != nil {
1383
+ return sess .PinnedServer .SelectServer (t , svrs )
1384
+ }
1385
+
1386
+ return defaultSelector .SelectServer (t , svrs )
1387
+ }
1388
+ }
0 commit comments