Class: Mongo::ServerSelector::Base
- Inherits:
-
Object
- Object
- Mongo::ServerSelector::Base
- Defined in:
- lib/mongo/server_selector/base.rb
Overview
Direct Known Subclasses
Nearest, Primary, PrimaryPreferred, Secondary, SecondaryPreferred
Instance Attribute Summary collapse
-
#hedge ⇒ Hash | nil
readonly
Hedge The document specifying whether to enable hedged reads.
-
#max_staleness ⇒ Integer
readonly
Max_staleness The maximum replication lag, in seconds, that a secondary can suffer and still be eligible for a read.
-
#options ⇒ Hash
readonly
Options The options.
-
#tag_sets ⇒ Array
readonly
Tag_sets The tag sets used to select servers.
Instance Method Summary collapse
-
#==(other) ⇒ true, false
Check equality of two server selectors.
-
#candidates(cluster) ⇒ Array<Server>
private
Returns servers of acceptable types from the cluster.
-
#initialize(options = nil) ⇒ Base
constructor
private
Initialize the server selector.
-
#inspect ⇒ String
Inspect the server selector.
-
#local_threshold ⇒ Float
deprecated
Deprecated.
This setting is now taken from the cluster options when a server is selected. Will be removed in version 3.0.
- #local_threshold_with_cluster(cluster) ⇒ Object private
-
#select_server(cluster, ping = nil, session = nil, write_aggregation: false, deprioritized: [], timeout: nil) ⇒ Mongo::Server
Select a server from the specified cluster, taking into account mongos pinning for the specified session.
-
#server_selection_timeout ⇒ Float
deprecated
Deprecated.
This setting is now taken from the cluster options when a server is selected. Will be removed in version 3.0.
-
#suitable_servers(cluster) ⇒ Array<Server>
private
Returns servers satisfying the server selector from the cluster.
-
#try_select_server(cluster, write_aggregation: false, deprioritized: []) ⇒ Server | nil
private
Tries to find a suitable server, returns the server if one is available or nil if there isn’t a suitable server.
Constructor Details
#initialize(options = nil) ⇒ Base
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Initialize the server selector.
49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/mongo/server_selector/base.rb', line 49 def initialize( = nil) = ? .dup : {} if [:max_staleness] == -1 .delete(:max_staleness) end @options = @tag_sets = [:tag_sets] || [] @max_staleness = [:max_staleness] @hedge = [:hedge] validate! end |
Instance Attribute Details
#hedge ⇒ Hash | nil (readonly)
Returns hedge The document specifying whether to enable hedged reads.
76 77 78 |
# File 'lib/mongo/server_selector/base.rb', line 76 def hedge @hedge end |
#max_staleness ⇒ Integer (readonly)
Returns max_staleness The maximum replication lag, in seconds, that a secondary can suffer and still be eligible for a read.
72 73 74 |
# File 'lib/mongo/server_selector/base.rb', line 72 def max_staleness @max_staleness end |
#options ⇒ Hash (readonly)
Returns options The options.
63 64 65 |
# File 'lib/mongo/server_selector/base.rb', line 63 def @options end |
#tag_sets ⇒ Array (readonly)
Returns tag_sets The tag sets used to select servers.
66 67 68 |
# File 'lib/mongo/server_selector/base.rb', line 66 def tag_sets @tag_sets end |
Instance Method Details
#==(other) ⇒ true, false
Check equality of two server selectors.
136 137 138 139 |
# File 'lib/mongo/server_selector/base.rb', line 136 def ==(other) name == other.name && hedge == other.hedge && max_staleness == other.max_staleness && tag_sets == other.tag_sets end |
#candidates(cluster) ⇒ Array<Server>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns servers of acceptable types from the cluster.
Does not perform staleness validation, staleness filtering or latency filtering.
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 |
# File 'lib/mongo/server_selector/base.rb', line 403 def candidates(cluster) servers = cluster.servers servers.each do |server| validate_max_staleness_support!(server) end if cluster.single? servers elsif cluster.sharded? servers elsif cluster.replica_set? select_in_replica_set(servers) else # Unknown cluster - no servers [] end end |
#inspect ⇒ String
Inspect the server selector.
122 123 124 |
# File 'lib/mongo/server_selector/base.rb', line 122 def inspect "#<#{self.class.name}:0x#{object_id} tag_sets=#{tag_sets.inspect} max_staleness=#{max_staleness.inspect} hedge=#{hedge}>" end |
#local_threshold ⇒ Float
This setting is now taken from the cluster options when a server is selected. Will be removed in version 3.0.
Get the local threshold boundary for nearest selection in seconds.
105 106 107 |
# File 'lib/mongo/server_selector/base.rb', line 105 def local_threshold @local_threshold ||= ([:local_threshold] || ServerSelector::LOCAL_THRESHOLD) end |
#local_threshold_with_cluster(cluster) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
110 111 112 |
# File 'lib/mongo/server_selector/base.rb', line 110 def local_threshold_with_cluster(cluster) [:local_threshold] || cluster.[:local_threshold] || LOCAL_THRESHOLD end |
#select_server(cluster, ping = nil, session = nil, write_aggregation: false, deprioritized: [], timeout: nil) ⇒ Mongo::Server
Select a server from the specified cluster, taking into account mongos pinning for the specified session.
If the session is given and has a pinned server, this server is the only server considered for selection. If the server is of type mongos, it is returned immediately; otherwise monitoring checks on this server are initiated to update its status, and if the server becomes a mongos within the server selection timeout, it is returned.
If no session is given or the session does not have a pinned server, normal server selection process is performed among all servers in the specified cluster matching the preference of this server selector object. Monitoring checks are initiated on servers in the cluster until a suitable server is found, up to the server selection timeout.
If a suitable server is not found within the server selection timeout, this method raises Error::NoServerAvailable.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/mongo/server_selector/base.rb', line 183 def select_server( cluster, ping = nil, session = nil, write_aggregation: false, deprioritized: [], timeout: nil ) select_server_impl(cluster, ping, session, write_aggregation, deprioritized, timeout).tap do |server| if Lint.enabled? && !server.pool.ready? raise Error::LintError, 'Server selector returning a server with a pool which is not ready' end end end |
#server_selection_timeout ⇒ Float
This setting is now taken from the cluster options when a server is selected. Will be removed in version 3.0.
Get the timeout for server selection.
89 90 91 92 |
# File 'lib/mongo/server_selector/base.rb', line 89 def server_selection_timeout @server_selection_timeout ||= ([:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT) end |
#suitable_servers(cluster) ⇒ Array<Server>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns servers satisfying the server selector from the cluster.
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 |
# File 'lib/mongo/server_selector/base.rb', line 427 def suitable_servers(cluster) if cluster.single? candidates(cluster) elsif cluster.sharded? local_threshold = local_threshold_with_cluster(cluster) servers = candidates(cluster) near_servers(servers, local_threshold) elsif cluster.replica_set? validate_max_staleness_value!(cluster) candidates(cluster) else # Unknown cluster - no servers [] end end |
#try_select_server(cluster, write_aggregation: false, deprioritized: []) ⇒ Server | nil
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tries to find a suitable server, returns the server if one is available or nil if there isn’t a suitable server.
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 |
# File 'lib/mongo/server_selector/base.rb', line 352 def try_select_server(cluster, write_aggregation: false, deprioritized: []) servers = if write_aggregation && cluster.replica_set? # 1. Check if ALL servers in cluster support secondary writes. is_write_supported = cluster.servers.reduce(true) do |res, server| res && server.features.merge_out_on_secondary_enabled? end if is_write_supported # 2. If all servers support secondary writes, we respect read preference. suitable_servers(cluster) else # 3. Otherwise we fallback to primary for replica set. [cluster.servers.detect(&:primary?)] end else suitable_servers(cluster) end # This list of servers may be ordered in a specific way # by the selector (e.g. for secondary preferred, the first # server may be a secondary and the second server may be primary) # and we should take the first server here respecting the order server = suitable_server(servers, deprioritized) if server if Lint.enabled? # It is possible for a server to have a nil average RTT here # because the ARTT comes from description which may be updated # by a background thread while server selection is running. # Currently lint mode is not a public feature, if/when this # changes (https://jira.mongodb.org/browse/RUBY-1576) the # requirement for ARTT to be not nil would need to be removed. if server.average_round_trip_time.nil? raise Error::LintError, "Server #{server.address} has nil average rtt" end end end server end |