@@ -185,47 +185,48 @@ func selectForReplicaSet(rp *readpref.ReadPref, isOutputAggregate bool, t Topolo
185
185
return nil , err
186
186
}
187
187
188
+ // If underlying operation is an aggregate with an output stage, only apply read preference
189
+ // if all candidates are 5.0+. Otherwise, operate under primary read preference.
190
+ if isOutputAggregate {
191
+ for _ , s := range candidates {
192
+ if s .WireVersion .Max < 13 {
193
+ return selectByKind (candidates , RSPrimary ), nil
194
+ }
195
+ }
196
+ }
197
+
188
198
switch rp .Mode () {
189
199
case readpref .PrimaryMode :
190
200
return selectByKind (candidates , RSPrimary ), nil
191
201
case readpref .PrimaryPreferredMode :
192
202
selected := selectByKind (candidates , RSPrimary )
193
203
194
204
if len (selected ) == 0 {
195
- selected = selectSecondaries (rp , isOutputAggregate , candidates )
205
+ selected = selectSecondaries (rp , candidates )
196
206
return selectByTagSet (selected , rp .TagSets ()), nil
197
207
}
198
208
199
209
return selected , nil
200
210
case readpref .SecondaryPreferredMode :
201
- selected := selectSecondaries (rp , isOutputAggregate , candidates )
211
+ selected := selectSecondaries (rp , candidates )
202
212
selected = selectByTagSet (selected , rp .TagSets ())
203
213
if len (selected ) > 0 {
204
214
return selected , nil
205
215
}
206
216
return selectByKind (candidates , RSPrimary ), nil
207
217
case readpref .SecondaryMode :
208
- selected := selectSecondaries (rp , isOutputAggregate , candidates )
209
- selected = selectByTagSet (selected , rp .TagSets ())
210
-
211
- // When selecting a server for an aggregate with an output stage,
212
- // Secondary read preference functions identically to SecondaryPreferred:
213
- // if no secondaries are available (none >= wire version 13), we fall
214
- // back to primary.
215
- if ! isOutputAggregate || len (selected ) > 0 {
216
- return selected , nil
217
- }
218
- return selectByKind (candidates , RSPrimary ), nil
218
+ selected := selectSecondaries (rp , candidates )
219
+ return selectByTagSet (selected , rp .TagSets ()), nil
219
220
case readpref .NearestMode :
220
221
selected := selectByKind (candidates , RSPrimary )
221
- selected = append (selected , selectSecondaries (rp , isOutputAggregate , candidates )... )
222
+ selected = append (selected , selectSecondaries (rp , candidates )... )
222
223
return selectByTagSet (selected , rp .TagSets ()), nil
223
224
}
224
225
225
226
return nil , fmt .Errorf ("unsupported mode: %d" , rp .Mode ())
226
227
}
227
228
228
- func selectSecondaries (rp * readpref.ReadPref , isOutputAggregate bool , candidates []Server ) []Server {
229
+ func selectSecondaries (rp * readpref.ReadPref , candidates []Server ) []Server {
229
230
secondaries := selectByKind (candidates , RSSecondary )
230
231
if len (secondaries ) == 0 {
231
232
return secondaries
@@ -244,11 +245,7 @@ func selectSecondaries(rp *readpref.ReadPref, isOutputAggregate bool, candidates
244
245
for _ , secondary := range secondaries {
245
246
estimatedStaleness := baseTime .Sub (secondary .LastWriteTime ) + secondary .HeartbeatInterval
246
247
if estimatedStaleness <= maxStaleness {
247
- // If underlying operation is an aggregate with an output stage, only select secondaries with
248
- // wire version 13 or greater.
249
- if ! isOutputAggregate || secondary .WireVersion .Max >= 13 {
250
- selected = append (selected , secondary )
251
- }
248
+ selected = append (selected , secondary )
252
249
}
253
250
}
254
251
@@ -261,11 +258,7 @@ func selectSecondaries(rp *readpref.ReadPref, isOutputAggregate bool, candidates
261
258
for _ , secondary := range secondaries {
262
259
estimatedStaleness := secondary .LastUpdateTime .Sub (secondary .LastWriteTime ) - primary .LastUpdateTime .Sub (primary .LastWriteTime ) + secondary .HeartbeatInterval
263
260
if estimatedStaleness <= maxStaleness {
264
- // If underlying operation is an aggregate with an output stage, only select secondaries with
265
- // wire version 13 or greater.
266
- if ! isOutputAggregate || secondary .WireVersion .Max >= 13 {
267
- selected = append (selected , secondary )
268
- }
261
+ selected = append (selected , secondary )
269
262
}
270
263
}
271
264
return selected
0 commit comments