mongo 2.4.0.rc1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +4 -2
- data/lib/mongo/client.rb +7 -4
- data/lib/mongo/cluster.rb +55 -5
- data/lib/mongo/cluster/app_metadata.rb +7 -1
- data/lib/mongo/cluster/topology.rb +7 -6
- data/lib/mongo/cluster/topology/replica_set.rb +48 -2
- data/lib/mongo/cluster/topology/sharded.rb +47 -1
- data/lib/mongo/cluster/topology/single.rb +55 -4
- data/lib/mongo/cluster/topology/unknown.rb +65 -9
- data/lib/mongo/error/invalid_server_preference.rb +3 -1
- data/lib/mongo/event.rb +8 -0
- data/lib/mongo/event/description_changed.rb +20 -2
- data/lib/mongo/event/member_discovered.rb +65 -0
- data/lib/mongo/event/primary_elected.rb +3 -1
- data/lib/mongo/event/standalone_discovered.rb +1 -1
- data/lib/mongo/monitoring.rb +41 -0
- data/lib/mongo/monitoring/event.rb +6 -0
- data/lib/mongo/monitoring/event/server_closed.rb +46 -0
- data/lib/mongo/monitoring/event/server_description_changed.rb +58 -0
- data/lib/mongo/monitoring/event/server_opening.rb +46 -0
- data/lib/mongo/monitoring/event/topology_changed.rb +46 -0
- data/lib/mongo/monitoring/event/topology_closed.rb +41 -0
- data/lib/mongo/monitoring/event/topology_opening.rb +41 -0
- data/lib/mongo/monitoring/publishable.rb +12 -0
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +54 -0
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +30 -0
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +33 -0
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +30 -0
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +40 -0
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +30 -0
- data/lib/mongo/server.rb +6 -0
- data/lib/mongo/server/connection.rb +1 -1
- data/lib/mongo/server/description.rb +23 -3
- data/lib/mongo/server/description/inspector.rb +4 -2
- data/lib/mongo/server/description/inspector/description_changed.rb +2 -2
- data/lib/mongo/server/description/inspector/member_discovered.rb +59 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +2 -0
- data/lib/mongo/server_selector.rb +10 -5
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector/selectable.rb +24 -12
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/mongo/auth/cr_spec.rb +6 -1
- data/spec/mongo/auth/ldap_spec.rb +6 -1
- data/spec/mongo/auth/scram_spec.rb +6 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +69 -0
- data/spec/mongo/auth/x509_spec.rb +9 -4
- data/spec/mongo/client_spec.rb +40 -2
- data/spec/mongo/cluster/topology/replica_set_spec.rb +218 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +17 -2
- data/spec/mongo/cluster/topology/single_spec.rb +19 -4
- data/spec/mongo/cluster/topology/unknown_spec.rb +19 -1
- data/spec/mongo/cluster/topology_spec.rb +11 -7
- data/spec/mongo/cluster_spec.rb +25 -7
- data/spec/mongo/max_staleness_spec.rb +40 -22
- data/spec/mongo/monitoring_spec.rb +2 -2
- data/spec/mongo/sdam_monitoring_spec.rb +60 -0
- data/spec/mongo/sdam_spec.rb +77 -0
- data/spec/mongo/server/connection_pool_spec.rb +6 -1
- data/spec/mongo/server/connection_spec.rb +6 -1
- data/spec/mongo/server/description_spec.rb +90 -1
- data/spec/mongo/server_selection_spec.rb +7 -6
- data/spec/mongo/server_selector/nearest_spec.rb +7 -7
- data/spec/mongo/server_selector/primary_preferred_spec.rb +7 -7
- data/spec/mongo/server_selector/primary_spec.rb +4 -4
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
- data/spec/mongo/server_selector/secondary_spec.rb +6 -6
- data/spec/mongo/server_selector_spec.rb +8 -0
- data/spec/mongo/server_spec.rb +6 -1
- data/spec/mongo/uri_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +4 -4
- data/spec/support/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +15 -0
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/Secondary.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +23 -0
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +4 -4
- data/spec/support/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +5 -5
- data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness2.yml → LongHeartbeat.yml} +4 -4
- data/spec/support/max_staleness/ReplicaSetWithPrimary/{ShortHeartbeartShortMaxStaleness.yml → LongHeartbeat2.yml} +6 -10
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +3 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/support/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +1 -1
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/support/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +7 -11
- data/spec/support/max_staleness/Sharded/Incompatible.yml +4 -4
- data/spec/support/max_staleness/Sharded/SmallMaxStaleness.yml +10 -2
- data/spec/support/max_staleness/Single/Incompatible.yml +4 -4
- data/spec/support/max_staleness/Single/SmallMaxStaleness.yml +2 -2
- data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +14 -0
- data/spec/support/sdam/rs/primary_mismatched_me.yml +2 -2
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +2 -2
- data/spec/support/sdam_monitoring.rb +144 -0
- data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +112 -0
- data/spec/support/sdam_monitoring/replica_set_with_primary.yml +111 -0
- data/spec/support/sdam_monitoring/replica_set_with_removal.yml +106 -0
- data/spec/support/sdam_monitoring/required_replica_set.yml +84 -0
- data/spec/support/sdam_monitoring/standalone.yml +70 -0
- data/spec/support/server_discovery_and_monitoring.rb +34 -1
- data/spec/support/server_selection.rb +14 -11
- data/spec/support/shared/server_selector.rb +6 -0
- metadata +49 -13
- metadata.gz.sig +0 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +0 -115
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18d9f304edd2e651c1dfde03646f780951e4d068
|
4
|
+
data.tar.gz: d7bc0adaa7a4dc5eb8f319caafb1a98fd1357233
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83e651334a083f7acb5e11c9c7cb650a8ce13ab3f7fb10ee4a839e05d7d2edca3adcdb3aeae3b795771b3c8b370772471565a0812cbdf30754c8a50b7e5c217a
|
7
|
+
data.tar.gz: 34db7e14619cc5b08235fff572034a19c282c982439f6feb7d3769ed5c402b05c60029309fc877d3505e8df6de31baee0519b4ebd6e36bfdeae926807f9e146b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
@@ -60,17 +60,19 @@ module Mongo
|
|
60
60
|
#
|
61
61
|
# @since 2.0.0
|
62
62
|
def start
|
63
|
+
login = LOGIN.merge(mechanism: X509::MECHANISM)
|
64
|
+
login[:user] = user.name if user.name
|
63
65
|
Protocol::Query.new(
|
64
66
|
Auth::EXTERNAL,
|
65
67
|
Database::COMMAND,
|
66
|
-
|
68
|
+
login,
|
67
69
|
limit: -1
|
68
70
|
)
|
69
71
|
end
|
70
72
|
|
71
73
|
# Create the new conversation.
|
72
74
|
#
|
73
|
-
# @example Create the new
|
75
|
+
# @example Create the new conversation.
|
74
76
|
# Conversation.new(user, "admin")
|
75
77
|
#
|
76
78
|
# @param [ Auth::User ] user The user to converse about.
|
data/lib/mongo/client.rb
CHANGED
@@ -48,6 +48,7 @@ module Mongo
|
|
48
48
|
:min_pool_size,
|
49
49
|
:monitoring,
|
50
50
|
:password,
|
51
|
+
:platform,
|
51
52
|
:read,
|
52
53
|
:read_retry_interval,
|
53
54
|
:replica_set,
|
@@ -200,10 +201,10 @@ module Mongo
|
|
200
201
|
# certification authority certifications used to validate certs passed from the
|
201
202
|
# other end of the connection. One of :ssl_ca_cert, :ssl_ca_cert_string or
|
202
203
|
# :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
|
203
|
-
# @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object An array of
|
204
|
-
#
|
205
|
-
# other end of the connection. One of :ssl_ca_cert,
|
206
|
-
# :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
|
204
|
+
# @option options [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object An array of
|
205
|
+
# OpenSSL::X509::Certificate representing the certification authority certifications used
|
206
|
+
# to validate certs passed from the other end of the connection. One of :ssl_ca_cert,
|
207
|
+
# :ssl_ca_cert_string or :ssl_ca_cert_object (in order of priority) is required for :ssl_verify.
|
207
208
|
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
208
209
|
# execute operations on a socket.
|
209
210
|
# @option options [ String ] :user The user name.
|
@@ -222,6 +223,8 @@ module Mongo
|
|
222
223
|
# for documents. Must respond to #generate.
|
223
224
|
# @option options [ String, Symbol ] :app_name Application name that is printed to the
|
224
225
|
# mongod logs upon establishing a connection in server versions >= 3.4.
|
226
|
+
# @option options [ String ] :platform Platform information to include in the
|
227
|
+
# metadata printed to the mongod logs upon establishing a connection in server versions >= 3.4.
|
225
228
|
#
|
226
229
|
# @since 2.0.0
|
227
230
|
def initialize(addresses_or_uri, options = Options::Redacted.new)
|
data/lib/mongo/cluster.rb
CHANGED
@@ -24,6 +24,7 @@ module Mongo
|
|
24
24
|
# @since 2.0.0
|
25
25
|
class Cluster
|
26
26
|
extend Forwardable
|
27
|
+
include Monitoring::Publishable
|
27
28
|
include Event::Subscriber
|
28
29
|
include Loggable
|
29
30
|
|
@@ -37,9 +38,17 @@ module Mongo
|
|
37
38
|
# @since 2.1.1
|
38
39
|
READ_RETRY_INTERVAL = 5
|
39
40
|
|
41
|
+
# How often an idle primary writes a no-op to the oplog.
|
42
|
+
#
|
43
|
+
# @since 2.4.0
|
44
|
+
IDLE_WRITE_PERIOD_SECONDS = 10
|
45
|
+
|
40
46
|
# @return [ Hash ] The options hash.
|
41
47
|
attr_reader :options
|
42
48
|
|
49
|
+
# @return [ Monitoring ] monitoring The monitoring.
|
50
|
+
attr_reader :monitoring
|
51
|
+
|
43
52
|
# @return [ Object ] The cluster topology.
|
44
53
|
attr_reader :topology
|
45
54
|
|
@@ -49,7 +58,8 @@ module Mongo
|
|
49
58
|
# @since 2.4.0
|
50
59
|
attr_reader :app_metadata
|
51
60
|
|
52
|
-
def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
|
61
|
+
def_delegators :topology, :replica_set?, :replica_set_name, :sharded?,
|
62
|
+
:single?, :unknown?, :member_discovered
|
53
63
|
def_delegators :@cursor_reaper, :register_cursor, :schedule_kill_cursor, :unregister_cursor
|
54
64
|
|
55
65
|
# Determine if this cluster of servers is equal to another object. Checks the
|
@@ -84,7 +94,6 @@ module Mongo
|
|
84
94
|
address = Address.new(host)
|
85
95
|
if !addresses.include?(address)
|
86
96
|
if addition_allowed?(address)
|
87
|
-
log_debug("Adding #{address.to_s} to the cluster.")
|
88
97
|
@update_lock.synchronize { @addresses.push(address) }
|
89
98
|
server = Server.new(address, self, @monitoring, event_listeners, options)
|
90
99
|
@update_lock.synchronize { @servers.push(server) }
|
@@ -93,6 +102,34 @@ module Mongo
|
|
93
102
|
end
|
94
103
|
end
|
95
104
|
|
105
|
+
# Determine if the cluster would select a readable server for the
|
106
|
+
# provided read preference.
|
107
|
+
#
|
108
|
+
# @example Is a readable server present?
|
109
|
+
# topology.has_readable_server?(server_selector)
|
110
|
+
#
|
111
|
+
# @param [ ServerSelector ] server_selector The server
|
112
|
+
# selector.
|
113
|
+
#
|
114
|
+
# @return [ true, false ] If a readable server is present.
|
115
|
+
#
|
116
|
+
# @since 2.4.0
|
117
|
+
def has_readable_server?(server_selector = nil)
|
118
|
+
topology.has_readable_server?(self, server_selector)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Determine if the cluster would select a writable server.
|
122
|
+
#
|
123
|
+
# @example Is a writable server present?
|
124
|
+
# topology.has_writable_server?
|
125
|
+
#
|
126
|
+
# @return [ true, false ] If a writable server is present.
|
127
|
+
#
|
128
|
+
# @since 2.4.0
|
129
|
+
def has_writable_server?
|
130
|
+
topology.has_writable_server?(self)
|
131
|
+
end
|
132
|
+
|
96
133
|
# Instantiate the new cluster.
|
97
134
|
#
|
98
135
|
# @api private
|
@@ -114,16 +151,26 @@ module Mongo
|
|
114
151
|
@event_listeners = Event::Listeners.new
|
115
152
|
@options = options.freeze
|
116
153
|
@app_metadata ||= AppMetadata.new(self)
|
117
|
-
@topology = Topology.initial(seeds, options)
|
118
154
|
@update_lock = Mutex.new
|
119
155
|
@pool_lock = Mutex.new
|
156
|
+
@topology = Topology.initial(seeds, monitoring, options)
|
157
|
+
|
158
|
+
publish_sdam_event(
|
159
|
+
Monitoring::TOPOLOGY_OPENING,
|
160
|
+
Monitoring::Event::TopologyOpening.new(@topology)
|
161
|
+
)
|
120
162
|
|
121
163
|
subscribe_to(Event::STANDALONE_DISCOVERED, Event::StandaloneDiscovered.new(self))
|
122
164
|
subscribe_to(Event::DESCRIPTION_CHANGED, Event::DescriptionChanged.new(self))
|
123
|
-
subscribe_to(Event::
|
165
|
+
subscribe_to(Event::MEMBER_DISCOVERED, Event::MemberDiscovered.new(self))
|
124
166
|
|
125
167
|
seeds.each{ |seed| add(seed) }
|
126
168
|
|
169
|
+
publish_sdam_event(
|
170
|
+
Monitoring::TOPOLOGY_CHANGED,
|
171
|
+
Monitoring::Event::TopologyChanged.new(@topology, @topology)
|
172
|
+
) if @servers.size > 1
|
173
|
+
|
127
174
|
@cursor_reaper = CursorReaper.new
|
128
175
|
@cursor_reaper.run!
|
129
176
|
|
@@ -259,11 +306,14 @@ module Mongo
|
|
259
306
|
#
|
260
307
|
# @since 2.0.0
|
261
308
|
def remove(host)
|
262
|
-
log_debug("#{host} being removed from the cluster.")
|
263
309
|
address = Address.new(host)
|
264
310
|
removed_servers = @servers.select { |s| s.address == address }
|
265
311
|
@update_lock.synchronize { @servers = @servers - removed_servers }
|
266
312
|
removed_servers.each{ |server| server.disconnect! } if removed_servers
|
313
|
+
publish_sdam_event(
|
314
|
+
Monitoring::SERVER_CLOSED,
|
315
|
+
Monitoring::Event::ServerClosed.new(address, topology)
|
316
|
+
)
|
267
317
|
@update_lock.synchronize { @addresses.reject! { |addr| addr == address } }
|
268
318
|
end
|
269
319
|
|
@@ -53,6 +53,7 @@ module Mongo
|
|
53
53
|
# @since 2.4.0
|
54
54
|
def initialize(cluster)
|
55
55
|
@app_name = cluster.options[:app_name]
|
56
|
+
@platform = cluster.options[:platform]
|
56
57
|
end
|
57
58
|
|
58
59
|
# Get the bytes of the ismaster message including this metadata.
|
@@ -133,7 +134,12 @@ module Mongo
|
|
133
134
|
end
|
134
135
|
|
135
136
|
def platform
|
136
|
-
[
|
137
|
+
[
|
138
|
+
@platform,
|
139
|
+
RUBY_VERSION,
|
140
|
+
RUBY_PLATFORM,
|
141
|
+
RbConfig::CONFIG['build']
|
142
|
+
].compact.join(', ')
|
137
143
|
end
|
138
144
|
end
|
139
145
|
end
|
@@ -26,14 +26,14 @@ module Mongo
|
|
26
26
|
module Topology
|
27
27
|
extend self
|
28
28
|
|
29
|
-
# The
|
29
|
+
# The various topologies for server selection.
|
30
30
|
#
|
31
31
|
# @since 2.0.0
|
32
32
|
OPTIONS = {
|
33
33
|
replica_set: ReplicaSet,
|
34
34
|
sharded: Sharded,
|
35
35
|
direct: Single
|
36
|
-
}
|
36
|
+
}.freeze
|
37
37
|
|
38
38
|
# Get the initial cluster topology for the provided options.
|
39
39
|
#
|
@@ -41,18 +41,19 @@ module Mongo
|
|
41
41
|
# Topology.initial(topology: :replica_set)
|
42
42
|
#
|
43
43
|
# @param [ Array<String> ] seeds The addresses of the configured servers.
|
44
|
+
# @param [ Monitoring ] monitoring The monitoring.
|
44
45
|
# @param [ Hash ] options The cluster options.
|
45
46
|
#
|
46
47
|
# @return [ ReplicaSet, Sharded, Single ] The topology.
|
47
48
|
#
|
48
49
|
# @since 2.0.0
|
49
|
-
def initial(seeds, options)
|
50
|
+
def initial(seeds, monitoring, options)
|
50
51
|
if options.has_key?(:connect)
|
51
|
-
OPTIONS.fetch(options[:connect]).new(options, seeds)
|
52
|
+
OPTIONS.fetch(options[:connect]).new(options, monitoring, seeds)
|
52
53
|
elsif options.has_key?(:replica_set)
|
53
|
-
ReplicaSet.new(options,
|
54
|
+
ReplicaSet.new(options, monitoring, options)
|
54
55
|
else
|
55
|
-
Unknown.new(options, seeds)
|
56
|
+
Unknown.new(options, monitoring, seeds)
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
@@ -21,6 +21,7 @@ module Mongo
|
|
21
21
|
# @since 2.0.0
|
22
22
|
class ReplicaSet
|
23
23
|
include Loggable
|
24
|
+
include Monitoring::Publishable
|
24
25
|
|
25
26
|
# Constant for the replica set name configuration option.
|
26
27
|
#
|
@@ -30,6 +31,9 @@ module Mongo
|
|
30
31
|
# @return [ Hash ] options The options.
|
31
32
|
attr_reader :options
|
32
33
|
|
34
|
+
# @return [ Monitoring ] monitoring The monitoring.
|
35
|
+
attr_reader :monitoring
|
36
|
+
|
33
37
|
# The display name for the topology.
|
34
38
|
#
|
35
39
|
# @since 2.0.0
|
@@ -61,7 +65,6 @@ module Mongo
|
|
61
65
|
def elect_primary(description, servers)
|
62
66
|
if description.replica_set_name == replica_set_name
|
63
67
|
unless detect_stale_primary!(description)
|
64
|
-
log_debug("Server #{description.address.to_s} elected as primary in #{replica_set_name}.")
|
65
68
|
servers.each do |server|
|
66
69
|
if server.primary? && server.address != description.address
|
67
70
|
server.description.unknown!
|
@@ -79,16 +82,51 @@ module Mongo
|
|
79
82
|
self
|
80
83
|
end
|
81
84
|
|
85
|
+
# Determine if the topology would select a readable server for the
|
86
|
+
# provided candidates and read preference.
|
87
|
+
#
|
88
|
+
# @example Is a readable server present?
|
89
|
+
# topology.has_readable_server?(cluster, server_selector)
|
90
|
+
#
|
91
|
+
# @param [ Cluster ] cluster The cluster.
|
92
|
+
# @param [ ServerSelector ] server_selector The server
|
93
|
+
# selector.
|
94
|
+
#
|
95
|
+
# @return [ true, false ] If a readable server is present.
|
96
|
+
#
|
97
|
+
# @since 2.4.0
|
98
|
+
def has_readable_server?(cluster, server_selector = nil)
|
99
|
+
(server_selector || ServerSelector.get(mode: :primary)).candidates(cluster).any?
|
100
|
+
end
|
101
|
+
|
102
|
+
# Determine if the topology would select a writable server for the
|
103
|
+
# provided candidates.
|
104
|
+
#
|
105
|
+
# @example Is a writable server present?
|
106
|
+
# topology.has_writable_server?(servers)
|
107
|
+
#
|
108
|
+
# @param [ Cluster ] cluster The cluster.
|
109
|
+
#
|
110
|
+
# @return [ true, false ] If a writable server is present.
|
111
|
+
#
|
112
|
+
# @since 2.4.0
|
113
|
+
def has_writable_server?(cluster)
|
114
|
+
cluster.servers.any?{ |server| server.primary? }
|
115
|
+
end
|
116
|
+
|
82
117
|
# Initialize the topology with the options.
|
83
118
|
#
|
84
119
|
# @example Initialize the topology.
|
85
120
|
# ReplicaSet.new(options)
|
86
121
|
#
|
87
122
|
# @param [ Hash ] options The options.
|
123
|
+
# @param [ Monitoring ] monitoring The monitoring.
|
124
|
+
# @param [ Array<String> ] seeds The seeds.
|
88
125
|
#
|
89
126
|
# @since 2.0.0
|
90
|
-
def initialize(options, seeds = [])
|
127
|
+
def initialize(options, monitoring, seeds = [])
|
91
128
|
@options = options
|
129
|
+
@monitoring = monitoring
|
92
130
|
@max_election_id = nil
|
93
131
|
@max_set_version = nil
|
94
132
|
end
|
@@ -222,6 +260,14 @@ module Mongo
|
|
222
260
|
# @since 2.0.6
|
223
261
|
def standalone_discovered; self; end
|
224
262
|
|
263
|
+
# Notify the topology that a member was discovered.
|
264
|
+
#
|
265
|
+
# @example Notify the topology that a member was discovered.
|
266
|
+
# topology.member_discovered
|
267
|
+
#
|
268
|
+
# @since 2.4.0
|
269
|
+
def member_discovered; end;
|
270
|
+
|
225
271
|
private
|
226
272
|
|
227
273
|
def update_max_election_id(description)
|
@@ -20,12 +20,19 @@ module Mongo
|
|
20
20
|
#
|
21
21
|
# @since 2.0.0
|
22
22
|
class Sharded
|
23
|
+
include Monitoring::Publishable
|
23
24
|
|
24
25
|
# The display name for the topology.
|
25
26
|
#
|
26
27
|
# @since 2.0.0
|
27
28
|
NAME = 'Sharded'.freeze
|
28
29
|
|
30
|
+
# @return [ Hash ] options The options.
|
31
|
+
attr_reader :options
|
32
|
+
|
33
|
+
# @return [ Monitoring ] monitoring The monitoring.
|
34
|
+
attr_reader :monitoring
|
35
|
+
|
29
36
|
# Get the display name.
|
30
37
|
#
|
31
38
|
# @example Get the display name.
|
@@ -51,16 +58,47 @@ module Mongo
|
|
51
58
|
# @return [ Sharded ] The topology.
|
52
59
|
def elect_primary(description, servers); self; end
|
53
60
|
|
61
|
+
# Determine if the topology would select a readable server for the
|
62
|
+
# provided candidates and read preference.
|
63
|
+
#
|
64
|
+
# @example Is a readable server present?
|
65
|
+
# topology.has_readable_server?(cluster, server_selector)
|
66
|
+
#
|
67
|
+
# @param [ Cluster ] cluster The cluster.
|
68
|
+
# @param [ ServerSelector ] server_selector The server
|
69
|
+
# selector.
|
70
|
+
#
|
71
|
+
# @return [ true ] A Sharded cluster always has a readable server.
|
72
|
+
#
|
73
|
+
# @since 2.4.0
|
74
|
+
def has_readable_server?(cluster, server_selector = nil); true; end
|
75
|
+
|
76
|
+
# Determine if the topology would select a writable server for the
|
77
|
+
# provided candidates.
|
78
|
+
#
|
79
|
+
# @example Is a writable server present?
|
80
|
+
# topology.has_writable_server?(servers)
|
81
|
+
#
|
82
|
+
# @param [ Cluster ] cluster The cluster.
|
83
|
+
#
|
84
|
+
# @return [ true ] A Sharded cluster always has a writable server.
|
85
|
+
#
|
86
|
+
# @since 2.4.0
|
87
|
+
def has_writable_server?(cluster); true; end
|
88
|
+
|
54
89
|
# Initialize the topology with the options.
|
55
90
|
#
|
56
91
|
# @example Initialize the topology.
|
57
92
|
# Sharded.new(options)
|
58
93
|
#
|
59
94
|
# @param [ Hash ] options The options.
|
95
|
+
# @param [ Monitoring ] monitoring The monitoring.
|
96
|
+
# @param [ Array<String> ] seeds The seeds.
|
60
97
|
#
|
61
98
|
# @since 2.0.0
|
62
|
-
def initialize(options, seeds = [])
|
99
|
+
def initialize(options, monitoring, seeds = [])
|
63
100
|
@options = options
|
101
|
+
@monitoring = monitoring
|
64
102
|
end
|
65
103
|
|
66
104
|
# A sharded topology is not a replica set.
|
@@ -181,6 +219,14 @@ module Mongo
|
|
181
219
|
# @since 2.0.6
|
182
220
|
def standalone_discovered; self; end
|
183
221
|
|
222
|
+
# Notify the topology that a member was discovered.
|
223
|
+
#
|
224
|
+
# @example Notify the cluster that a member was discovered.
|
225
|
+
# topology.member_discovered
|
226
|
+
#
|
227
|
+
# @since 2.4.0
|
228
|
+
def member_discovered; end;
|
229
|
+
|
184
230
|
private
|
185
231
|
|
186
232
|
def remove_self?(description, server)
|