Skip to content

Commit 2175666

Browse files
committed
SPEC-222: Delegate to topology from cluster
1 parent bbc25d1 commit 2175666

File tree

7 files changed

+103
-7
lines changed

7 files changed

+103
-7
lines changed

lib/mongo/cluster.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,34 @@ def add(host)
8787
end
8888
end
8989

90+
# Determine if the cluster would select a readable server for the
91+
# provided read preference.
92+
#
93+
# @example Is a readable server present?
94+
# topology.has_readable_server?(server_selector)
95+
#
96+
# @param [ ServerSelector ] server_selector The server
97+
# selector.
98+
#
99+
# @return [ true, false ] If a readable server is present.
100+
#
101+
# @since 2.3.0
102+
def has_readable_server?(server_selector)
103+
topology.has_readable_server?(self, server_selector)
104+
end
105+
106+
# Determine if the cluster would select a writable server.
107+
#
108+
# @example Is a writable server present?
109+
# topology.has_writable_server?
110+
#
111+
# @return [ true, false ] If a writable server is present.
112+
#
113+
# @since 2.3.0
114+
def has_writable_server?
115+
topology.has_writable_server?(self)
116+
end
117+
90118
# Instantiate the new cluster.
91119
#
92120
# @api private

lib/mongo/cluster/topology/replica_set.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def elect_primary(description, servers)
9090
# topology.has_readable_server?(cluster, server_selector)
9191
#
9292
# @param [ Cluster ] cluster The cluster.
93-
# @param [ ServerSelector, Symbol ] server_selector The server
93+
# @param [ ServerSelector ] server_selector The server
9494
# selector.
9595
#
9696
# @return [ true, false ] If a readable server is present.

lib/mongo/cluster/topology/sharded.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def elect_primary(description, servers); self; end
6565
# topology.has_readable_server?(cluster, server_selector)
6666
#
6767
# @param [ Cluster ] cluster The cluster.
68-
# @param [ ServerSelector, Symbol ] server_selector The server
68+
# @param [ ServerSelector ] server_selector The server
6969
# selector.
7070
#
7171
# @return [ true, false ] If a readable server is present.

lib/mongo/cluster/topology/single.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@ def elect_primary(description, servers); self; end
6868
# topology.has_readable_server?(cluster, server_selector)
6969
#
7070
# @param [ Cluster ] cluster The cluster.
71-
# @param [ ServerSelector, Symbol ] server_selector The server
71+
# @param [ ServerSelector ] server_selector The server
7272
# selector.
7373
#
7474
# @return [ true, false ] If a readable server is present.
7575
#
7676
# @since 2.3.0
77-
def has_readable_server?(cluster, server_selector); true; end
77+
def has_readable_server?(cluster, server_selector)
78+
server_selector.candidates(cluster).any?
79+
end
7880

7981
# Determine if the topology would select a writable server for the
8082
# provided candidates.

lib/mongo/cluster/topology/unknown.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def elect_primary(description, servers)
7474
# topology.has_readable_server?(cluster, server_selector)
7575
#
7676
# @param [ Cluster ] cluster The cluster.
77-
# @param [ ServerSelector, Symbol ] server_selector The server
77+
# @param [ ServerSelector ] server_selector The server
7878
# selector.
7979
#
8080
# @return [ true, false ] If a readable server is present.

spec/mongo/cluster/topology/single_spec.rb

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,56 @@
9191

9292
describe '#has_readable_servers?' do
9393

94-
it 'returns true' do
95-
expect(topology).to have_readable_server(nil, nil)
94+
let(:cluster) do
95+
double('cluster', servers: servers, single?: true)
96+
end
97+
98+
let(:selector) do
99+
Mongo::ServerSelector.get(mode: :primary)
100+
end
101+
102+
context 'when using a direct connection to a primary' do
103+
104+
let(:servers) do
105+
[ double('server', primary?: true) ]
106+
end
107+
108+
it 'returns true' do
109+
expect(topology).to have_readable_server(cluster, selector)
110+
end
111+
end
112+
113+
context 'when using a direct connection to a secondary' do
114+
115+
let(:servers) do
116+
[ double('server', secondary?: true) ]
117+
end
118+
119+
it 'returns true' do
120+
expect(topology).to have_readable_server(cluster, selector)
121+
end
122+
end
123+
124+
context 'when using a direct connection to an arbiter' do
125+
126+
let(:servers) do
127+
[ double('server', secondary?: true) ]
128+
end
129+
130+
it 'returns true' do
131+
expect(topology).to have_readable_server(cluster, selector)
132+
end
133+
end
134+
135+
context 'when no servers have been scanned' do
136+
137+
let(:servers) do
138+
[]
139+
end
140+
141+
it 'returns false' do
142+
expect(topology).to_not have_readable_server(cluster, selector)
143+
end
96144
end
97145
end
98146

spec/mongo/cluster_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@
5959
end
6060
end
6161

62+
describe '#has_readable_server?' do
63+
64+
let(:selector) do
65+
Mongo::ServerSelector.get(mode: :primary)
66+
end
67+
68+
it 'delegates to the topology' do
69+
expect(cluster).to have_readable_server(selector)
70+
end
71+
end
72+
73+
describe '#has_writable_server?' do
74+
75+
it 'delegates to the topology' do
76+
expect(cluster).to_not have_writable_server
77+
end
78+
end
79+
6280
describe '#inspect' do
6381

6482
let(:preference) do

0 commit comments

Comments
 (0)