@@ -654,11 +654,10 @@ func aggregate(a aggregateParams) (*Cursor, error) {
654
654
sess = nil
655
655
}
656
656
657
- defaultSelector := a . readSelector
658
- if hasOutputStage {
659
- defaultSelector = a . writeSelector
657
+ selector := makePinnedSelector ( sess , a . writeSelector )
658
+ if ! hasOutputStage {
659
+ selector = makeReadPrefSelector ( sess , a . readSelector , a . client . localThreshold )
660
660
}
661
- selector := makePinnedSelector (sess , defaultSelector )
662
661
663
662
ao := options .MergeAggregateOptions (a .opts ... )
664
663
cursorOpts := driver.CursorOptions {
@@ -756,8 +755,7 @@ func (coll *Collection) CountDocuments(ctx context.Context, filter interface{},
756
755
rc = nil
757
756
}
758
757
759
- selector := makePinnedSelector (sess , coll .readSelector )
760
-
758
+ selector := makeReadPrefSelector (sess , coll .readSelector , coll .client .localThreshold )
761
759
op := operation .NewAggregate (pipelineArr ).Session (sess ).ReadConcern (rc ).ReadPreference (coll .readPreference ).
762
760
CommandMonitor (coll .client .monitor ).ServerSelector (selector ).ClusterClock (coll .client .clock ).Database (coll .db .name ).
763
761
Collection (coll .name ).Deployment (coll .client .topology )
@@ -832,8 +830,7 @@ func (coll *Collection) EstimatedDocumentCount(ctx context.Context,
832
830
rc = nil
833
831
}
834
832
835
- selector := makePinnedSelector (sess , coll .readSelector )
836
-
833
+ selector := makeReadPrefSelector (sess , coll .readSelector , coll .client .localThreshold )
837
834
op := operation .NewCount ().Session (sess ).ClusterClock (coll .client .clock ).
838
835
Database (coll .db .name ).Collection (coll .name ).CommandMonitor (coll .client .monitor ).
839
836
Deployment (coll .client .topology ).ReadConcern (rc ).ReadPreference (coll .readPreference ).
@@ -888,8 +885,7 @@ func (coll *Collection) Distinct(ctx context.Context, fieldName string, filter i
888
885
rc = nil
889
886
}
890
887
891
- selector := makePinnedSelector (sess , coll .readSelector )
892
-
888
+ selector := makeReadPrefSelector (sess , coll .readSelector , coll .client .localThreshold )
893
889
option := options .MergeDistinctOptions (opts ... )
894
890
895
891
op := operation .NewDistinct (fieldName , bsoncore .Document (f )).
@@ -971,8 +967,7 @@ func (coll *Collection) Find(ctx context.Context, filter interface{},
971
967
rc = nil
972
968
}
973
969
974
- selector := makePinnedSelector (sess , coll .readSelector )
975
-
970
+ selector := makeReadPrefSelector (sess , coll .readSelector , coll .client .localThreshold )
976
971
op := operation .NewFind (f ).
977
972
Session (sess ).ReadConcern (rc ).ReadPreference (coll .readPreference ).
978
973
CommandMonitor (coll .client .monitor ).ServerSelector (selector ).
@@ -1421,3 +1416,14 @@ func makePinnedSelector(sess *session.Client, defaultSelector description.Server
1421
1416
return defaultSelector .SelectServer (t , svrs )
1422
1417
}
1423
1418
}
1419
+
1420
+ func makeReadPrefSelector (sess * session.Client , selector description.ServerSelector , localThreshold time.Duration ) description.ServerSelectorFunc {
1421
+ if sess != nil && sess .TransactionRunning () {
1422
+ selector = description .CompositeSelector ([]description.ServerSelector {
1423
+ description .ReadPrefSelector (sess .CurrentRp ),
1424
+ description .LatencySelector (localThreshold ),
1425
+ })
1426
+ }
1427
+
1428
+ return makePinnedSelector (sess , selector )
1429
+ }
0 commit comments