Skip to content

Commit 1c84eee

Browse files
p-mongop
authored andcommitted
RUBY-1805 remove strict check that a server has a known description when looking at features (#1470)
1 parent d3e1458 commit 1c84eee

File tree

4 files changed

+104
-1
lines changed

4 files changed

+104
-1
lines changed

lib/mongo/client.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ class Client
3232
:write, :write_concern,
3333
:retry_reads, :max_read_retries, :read_retry_interval,
3434
:retry_writes, :max_write_retries,
35+
36+
# Options which cannot currently be here:
37+
#
38+
# :server_selection_timeout
39+
# Server selection timeout is used by cluster constructor to figure out
40+
# how long to wait for initial scan in compatibility mode, but once
41+
# the cluster is initialized it no longer uses this timeout.
42+
# Unfortunately server selector reads server selection timeout out of
43+
# the cluster, and this behavior is required by Cluster#next_primary
44+
# which takes no arguments. When next_primary is removed we can revsit
45+
# using the same cluster object with different server selection timeouts.
3546
].freeze
3647

3748
# Valid client options.

lib/mongo/server/description.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def initialize(address, config = {}, average_round_trip_time = nil)
217217
# @return [ Features ] features The features for the server.
218218
def features
219219
if unknown?
220-
raise ArgumentError, "An unknown server's features are not known"
220+
return Features.new(0..0, address.to_s)
221221
end
222222
@features
223223
end

spec/integration/client_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
require 'spec_helper'
2+
3+
describe 'Client' do
4+
context 'after client is disconnected' do
5+
let(:client) { authorized_client.with(server_selection_timeout: 1) }
6+
7+
before do
8+
client.close
9+
end
10+
11+
it 'is still usable for operations' do
12+
resp = client.database.command(ismaster: 1)
13+
expect(resp).to be_a(Mongo::Operation::Result)
14+
end
15+
16+
it 'is still usable for operations that can use sessions' do
17+
client['collection'].insert_one(test: 1)
18+
end
19+
20+
context 'after all servers are marked unknown' do
21+
before do
22+
client.cluster.servers.each do |server|
23+
server.unknown!
24+
end
25+
end
26+
27+
context 'operation that never uses sessions' do
28+
it 'fails server selection' do
29+
expect do
30+
client.database.command(ismaster: 1)
31+
end.to raise_error(Mongo::Error::NoServerAvailable)
32+
end
33+
end
34+
35+
context 'operation that can use sessions' do
36+
it 'fails server selection' do
37+
expect do
38+
client['collection'].insert_one(test: 1)
39+
end.to raise_error(Mongo::Error::NoServerAvailable)
40+
end
41+
end
42+
end
43+
end
44+
end

spec/integration/server_spec.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
require 'spec_helper'
2+
3+
describe 'Server' do
4+
let(:client) { authorized_client }
5+
6+
let(:server) { client.cluster.next_primary }
7+
8+
let(:collection) { client['collection'] }
9+
let(:view) { Mongo::Collection::View.new(collection) }
10+
11+
describe 'operations when client/cluster are disconnected' do
12+
# Server versions lower than 3.4 use the legacy find result
13+
min_server_fcv '3.4'
14+
15+
context 'normal server' do
16+
it 'can be used for reads' do
17+
result = view.send(:send_initial_query, server)
18+
expect(result).to be_a(Mongo::Operation::Find::Result)
19+
end
20+
end
21+
22+
context 'known server in disconnected cluster' do
23+
before do
24+
client.close
25+
expect(server).not_to be_unknown
26+
end
27+
28+
it 'can be used for reads' do
29+
result = view.send(:send_initial_query, server)
30+
expect(result).to be_a(Mongo::Operation::Find::Result)
31+
end
32+
end
33+
34+
context 'unknown server in disconnected cluster' do
35+
before do
36+
client.close
37+
server.unknown!
38+
expect(server).to be_unknown
39+
end
40+
41+
it 'can be used for reads' do
42+
result = view.send(:send_initial_query, server)
43+
# Driver falls back to the oldest MongoDB protocol
44+
expect(result).to be_a(Mongo::Operation::Find::Legacy::Result)
45+
end
46+
end
47+
end
48+
end

0 commit comments

Comments
 (0)