Skip to content

Commit abc3063

Browse files
committed
RUBY-899 Don't select servers in ServerSelector if cluster returns a nil list
1 parent 5b64dac commit abc3063

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

lib/mongo/server_selector/selectable.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ def select_server(cluster)
8989
if cluster.single?
9090
servers = cluster.servers
9191
elsif cluster.sharded?
92-
servers = near_servers(cluster.servers)
92+
servers = near_servers(cluster.servers) if cluster.servers
9393
else
94-
servers = select(cluster.servers)
94+
servers = select(cluster.servers) if cluster.servers
9595
end
9696
return servers.first if servers && !servers.compact.empty?
9797
cluster.scan!

spec/mongo/server_selector_spec.rb

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,55 @@
9898
end
9999
end
100100
end
101+
102+
shared_context 'a ServerSelector' do
103+
104+
context 'when cluster#servers is nil' do
105+
106+
let(:servers) { nil }
107+
108+
let(:cluster) do
109+
double('cluster').tap do |c|
110+
allow(c).to receive(:servers).and_return(servers)
111+
allow(c).to receive(:single?).and_return(single)
112+
allow(c).to receive(:sharded?).and_return(sharded)
113+
allow(c).to receive(:scan!).and_return(true)
114+
end
115+
end
116+
117+
let(:read_pref) do
118+
described_class.get({ mode: :primary }, server_selection_timeout: 1)
119+
end
120+
121+
it 'raises a NoServerAvailable error' do
122+
expect do
123+
read_pref.select_server(cluster)
124+
end.to raise_exception(Mongo::ServerSelector::NoServerAvailable)
125+
end
126+
end
127+
end
128+
129+
context 'when the cluster has a Single topology' do
130+
131+
let(:single) { true }
132+
let(:sharded) { false }
133+
134+
it_behaves_like 'a ServerSelector'
135+
end
136+
137+
context 'when the cluster has a ReplicaSet topology' do
138+
139+
let(:single) { false }
140+
let(:sharded) { false }
141+
142+
it_behaves_like 'a ServerSelector'
143+
end
144+
145+
context 'when the cluster has a Sharded topology' do
146+
147+
let(:single) { false }
148+
let(:sharded) { true }
149+
150+
it_behaves_like 'a ServerSelector'
151+
end
101152
end

0 commit comments

Comments
 (0)