File tree Expand file tree Collapse file tree 7 files changed +103
-7
lines changed Expand file tree Collapse file tree 7 files changed +103
-7
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments