Skip to content

Commit 6f3717b

Browse files
RUBY-2841 Ignore read pref if any pre-5.0 (#2370)
1 parent 8f2ef83 commit 6f3717b

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

lib/mongo/server_selector/base.rb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,15 +305,21 @@ def select_server(cluster, ping = nil, session = nil, write_aggregation: false)
305305
#
306306
# @api private
307307
def try_select_server(cluster, write_aggregation: false)
308-
servers = suitable_servers(cluster)
308+
servers = if write_aggregation && cluster.replica_set?
309+
# 1. Check if ALL servers in cluster support secondary writes.
310+
is_write_supported = cluster.servers.reduce(true) do |res, server|
311+
res && server.features.merge_out_on_secondary_enabled?
312+
end
309313

310-
if write_aggregation && cluster.replica_set?
311-
# If secondary preferred, list of servers has is ordered in a way
312-
# that secondaries go first, and the primary is the last one.
313-
servers.select! do |server|
314-
server.features.merge_out_on_secondary_enabled? || server.primary?
314+
if is_write_supported
315+
# 2. If all servers support secondary writes, we respect read preference.
316+
suitable_servers(cluster)
317+
else
318+
# 3. Otherwise we fallback to primary for replica set.
319+
[cluster.servers.detect(&:primary?)]
315320
end
316-
servers = [cluster.servers.detect(&:primary?)] if servers.empty?
321+
else
322+
suitable_servers(cluster)
317323
end
318324

319325
# This list of servers may be ordered in a specific way

0 commit comments

Comments
 (0)