Class: Mongo::Cluster
- Inherits:
-
Object
- Object
- Mongo::Cluster
- Extended by:
- Forwardable
- Defined in:
- lib/mongo/cluster.rb,
lib/mongo/cluster/topology.rb,
lib/mongo/cluster/topology.rb,
lib/mongo/cluster/sdam_flow.rb,
lib/mongo/cluster/topology/base.rb,
lib/mongo/cluster/topology/single.rb,
lib/mongo/cluster/topology/sharded.rb,
lib/mongo/cluster/topology/unknown.rb,
lib/mongo/cluster/periodic_executor.rb,
lib/mongo/cluster/reapers/cursor_reaper.rb,
lib/mongo/cluster/reapers/socket_reaper.rb,
lib/mongo/cluster/topology/no_replica_set_options.rb,
lib/mongo/cluster/topology/replica_set_no_primary.rb,
lib/mongo/cluster/topology/replica_set_with_primary.rb
Overview
Copyright © 2018-2019 MongoDB, Inc.
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Defined Under Namespace
Modules: Topology Classes: CursorReaper, PeriodicExecutor, SdamFlow, SocketReaper
Constant Summary collapse
- MAX_READ_RETRIES =
The default number of legacy read retries.
1- MAX_WRITE_RETRIES =
The default number of legacy write retries.
1- READ_RETRY_INTERVAL =
The default read retry interval, in seconds, when using legacy read retries.
5- IDLE_WRITE_PERIOD_SECONDS =
How often an idle primary writes a no-op to the oplog.
10- CLUSTER_TIME =
Deprecated.
The cluster time key in responses from mongos servers.
'clusterTime'.freeze
Constants included from Loggable
Instance Attribute Summary collapse
-
#app_metadata ⇒ Mongo::Server::AppMetadata
readonly
The application metadata, used for connection handshakes.
-
#monitoring ⇒ Monitoring
readonly
Monitoring The monitoring.
-
#options ⇒ Hash
readonly
The options hash.
-
#seeds ⇒ Array<String>
readonly
private
The addresses of seed servers.
- #server_selection_semaphore ⇒ Object readonly private
- #session_pool ⇒ Object readonly
- #srv_monitor ⇒ Object readonly private
-
#topology ⇒ Integer?
readonly
The logical session timeout value in minutes.
Attributes included from Mongo::ClusterTime::Consumer
Attributes included from Event::Subscriber
Class Method Summary collapse
-
.create(client) ⇒ Cluster
private
Create a cluster for the provided client, for use when we don’t want the client’s original cluster instance to be the same.
-
.finalize(pools, periodic_executor, session_pool) ⇒ Proc
Finalize the cluster for garbage collection.
Instance Method Summary collapse
-
#==(other) ⇒ true, false
Determine if this cluster of servers is equal to another object.
-
#add(host, add_options = nil) ⇒ Server
Add a server to the cluster with the provided address.
-
#addresses ⇒ Array<Mongo::Address>
The addresses in the cluster.
-
#connected? ⇒ true|false
private
Whether the cluster object is connected to its cluster.
-
#disconnect! ⇒ true
Closes the cluster.
- #disconnect_server_if_connected(server) ⇒ Object private
-
#has_readable_server?(server_selector = nil) ⇒ true, false
Determine if the cluster would select a readable server for the provided read preference.
-
#has_writable_server? ⇒ true, false
Determine if the cluster would select a writable server.
-
#heartbeat_interval ⇒ Float
private
Get the refresh interval for the server.
-
#initialize(seeds, monitoring, options = Options::Redacted.new) ⇒ Cluster
constructor
private
Instantiate the new cluster.
-
#inspect ⇒ String
Get the nicer formatted string for use in inspection.
- #max_read_retries ⇒ Integer deprecated Deprecated.
-
#next_primary(ping = nil, session = nil) ⇒ Mongo::Server
Get the next primary server we can send an operation to.
- #pool(server) ⇒ Server::ConnectionPool deprecated Deprecated.
- #read_retry_interval ⇒ Float deprecated Deprecated.
-
#reconnect! ⇒ true
deprecated
Deprecated.
Use Client#reconnect to reconnect to the cluster instead of calling this method. This method does not send SDAM events.
-
#remove(host, disconnect: true) ⇒ Array<Server> | true | false
Remove the server from the cluster for the provided address, if it exists.
-
#run_sdam_flow(previous_desc, updated_desc, options = {}) ⇒ Object
private
Runs SDAM flow on the cluster.
-
#scan!(sync = true) ⇒ true
Force a scan of all known servers in the cluster.
-
#servers ⇒ Array<Server>
Get a list of server candidates from the cluster that can have operations executed on them.
- #servers_list ⇒ Object private
-
#sessions_supported? ⇒ true | false
private
Returns whether the deployment that the driver is connected to supports sessions.
-
#set_server_list(server_address_strs) ⇒ Object
private
Sets the list of servers to the addresses in the provided list of address strings.
- #summary ⇒ Object
-
#update_cluster_time(result) ⇒ Object
Update the max cluster time seen in a response.
- #update_topology(new_topology) ⇒ Object private
Methods included from Mongo::ClusterTime::Consumer
Methods included from Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Methods included from Event::Subscriber
Methods included from Monitoring::Publishable
#publish_cmap_event, #publish_event, #publish_sdam_event
Constructor Details
#initialize(seeds, monitoring, options = Options::Redacted.new) ⇒ Cluster
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.
Cluster should never be directly instantiated outside of a Client.
When connecting to a mongodb+srv:// URI, the client expands such a URI into a list of servers and passes that list to the Cluster constructor. When connecting to a standalone mongod, the Cluster constructor receives the corresponding address as an array of one string.
Instantiate the new cluster.
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/mongo/cluster.rb', line 102 def initialize(seeds, monitoring, = Options::Redacted.new) if seeds.nil? raise ArgumentError, 'Seeds cannot be nil' end if [:monitoring_io] == false && !.key?(:cleanup) = .dup [:cleanup] = false end seeds = seeds.uniq @servers = [] @monitoring = monitoring @event_listeners = Event::Listeners.new @options = .freeze @app_metadata = Server::AppMetadata.new(@options) @update_lock = Mutex.new @sdam_flow_lock = Mutex.new @cluster_time = nil @cluster_time_lock = Mutex.new @srv_monitor_lock = Mutex.new @server_selection_semaphore = Semaphore.new @topology = Topology.initial(self, monitoring, ) Session::SessionPool.create(self) # The opening topology is always unknown with no servers. # https://github.com/mongodb/specifications/pull/388 opening_topology = Topology::Unknown.new(, monitoring, self) publish_sdam_event( Monitoring::TOPOLOGY_OPENING, Monitoring::Event::TopologyOpening.new(opening_topology) ) @seeds = seeds servers = seeds.map do |seed| # Server opening events must be sent after topology change events. # Therefore separate server addition, done here before topoolgy change # event is published, from starting to monitor the server which is # done later. add(seed, monitor: false) end if seeds.size >= 1 # Recreate the topology to get the current server list into it @topology = topology.class.new(topology., topology.monitoring, self) publish_sdam_event( Monitoring::TOPOLOGY_CHANGED, Monitoring::Event::TopologyChanged.new(opening_topology, @topology) ) end if [:monitoring_io] == false # Omit periodic executor construction, because without servers # no commands can be sent to the cluster and there shouldn't ever # be anything that needs to be cleaned up. # # Omit monitoring individual servers and the legacy single round of # of SDAM on the main thread, as it would race with tests that mock # SDAM responses. @connecting = @connected = false return end # Update instance variables prior to starting monitoring threads. @connecting = false @connected = true if [:cleanup] != false @cursor_reaper = CursorReaper.new @socket_reaper = SocketReaper.new(self) @periodic_executor = PeriodicExecutor.new([ @cursor_reaper, @socket_reaper, ], ) ObjectSpace.define_finalizer(self, self.class.finalize( {}, @periodic_executor, @session_pool)) @periodic_executor.run! end # Need to record start time prior to starting monitoring start_time = Time.now servers.each do |server| server.start_monitoring end if [:scan] != false server_selection_timeout = [:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT # The server selection timeout can be very short especially in # tests, when the client waits for a synchronous scan before # starting server selection. Limiting the scan to server selection time # then aborts the scan before it can process even local servers. # Therefore, allow at least 3 seconds for the scan here. if server_selection_timeout < 3 server_selection_timeout = 3 end deadline = start_time + server_selection_timeout # Wait for the first scan of each server to complete, for # backwards compatibility. # If any servers are discovered during this SDAM round we are going to # wait for these servers to also be queried, and so on, up to the # server selection timeout or the 3 second minimum. loop do # Ensure we do not try to read the servers list while SDAM is running servers = @sdam_flow_lock.synchronize do servers_list.dup end if servers.all? { |server| server.last_scan && server.last_scan >= start_time } break end if (time_remaining = deadline - Time.now) <= 0 break end log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}") # Since the semaphore may have been signaled between us checking # the servers list above and the wait call below, we should not # wait for the full remaining time - wait for up to 1 second, then # recheck the state. server_selection_semaphore.wait([time_remaining, 1].min) end end start_stop_srv_monitor end |
Instance Attribute Details
#app_metadata ⇒ Mongo::Server::AppMetadata (readonly)
Returns The application metadata, used for connection handshakes.
265 266 267 |
# File 'lib/mongo/cluster.rb', line 265 def @app_metadata end |
#monitoring ⇒ Monitoring (readonly)
Returns monitoring The monitoring.
256 257 258 |
# File 'lib/mongo/cluster.rb', line 256 def monitoring @monitoring end |
#options ⇒ Hash (readonly)
Returns The options hash.
253 254 255 |
# File 'lib/mongo/cluster.rb', line 253 def @options end |
#seeds ⇒ Array<String> (readonly)
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 The addresses of seed servers. Contains addresses that were given to Cluster when it was instantiated, not current addresses that the cluster is using as a result of SDAM.
273 274 275 |
# File 'lib/mongo/cluster.rb', line 273 def seeds @seeds end |
#server_selection_semaphore ⇒ Object (readonly)
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.
409 410 411 |
# File 'lib/mongo/cluster.rb', line 409 def server_selection_semaphore @server_selection_semaphore end |
#session_pool ⇒ Object (readonly)
278 279 280 |
# File 'lib/mongo/cluster.rb', line 278 def session_pool @session_pool end |
#srv_monitor ⇒ Object (readonly)
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.
292 293 294 |
# File 'lib/mongo/cluster.rb', line 292 def srv_monitor @srv_monitor end |
#topology ⇒ Integer? (readonly)
The logical session timeout value in minutes.
259 260 261 |
# File 'lib/mongo/cluster.rb', line 259 def topology @topology end |
Class Method Details
.create(client) ⇒ Cluster
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.
Create a cluster for the provided client, for use when we don’t want the client’s original cluster instance to be the same.
243 244 245 246 247 248 249 250 |
# File 'lib/mongo/cluster.rb', line 243 def self.create(client) cluster = Cluster.new( client.cluster.addresses.map(&:to_s), Monitoring.new, client., ) client.instance_variable_set(:@cluster, cluster) end |
.finalize(pools, periodic_executor, session_pool) ⇒ Proc
Finalize the cluster for garbage collection.
423 424 425 426 427 428 |
# File 'lib/mongo/cluster.rb', line 423 def self.finalize(pools, periodic_executor, session_pool) proc do session_pool.end_sessions periodic_executor.stop! end end |
Instance Method Details
#==(other) ⇒ true, false
Determine if this cluster of servers is equal to another object. Checks the servers currently in the cluster, not what was configured.
636 637 638 639 |
# File 'lib/mongo/cluster.rb', line 636 def ==(other) return false unless other.is_a?(Cluster) addresses == other.addresses && == other. end |
#add(host, add_options = nil) ⇒ Server
Add a server to the cluster with the provided address. Useful in auto-discovery of new servers when an existing server executes an ismaster and potentially non-configured servers were included.
734 735 736 737 738 739 740 741 742 743 744 745 |
# File 'lib/mongo/cluster.rb', line 734 def add(host, =nil) address = Address.new(host, ) if !addresses.include?(address) server = Server.new(address, self, @monitoring, event_listeners, .merge( monitor: false)) @update_lock.synchronize { @servers.push(server) } if .nil? || [:monitor] != false server.start_monitoring end server end end |
#addresses ⇒ Array<Mongo::Address>
The addresses in the cluster.
372 373 374 |
# File 'lib/mongo/cluster.rb', line 372 def addresses servers_list.map(&:address).dup end |
#connected? ⇒ true|false
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.
Whether the cluster object is connected to its cluster.
347 348 349 |
# File 'lib/mongo/cluster.rb', line 347 def connected? !!@connected end |
#disconnect! ⇒ true
Applications should call Client#close to disconnect from
Closes the cluster.
the cluster rather than calling this method. This method is for internal driver use only.
Disconnects all servers in the cluster, publishing appropriate SDAM events in the process. Stops SRV monitoring if it is active. Marks the cluster disconnected.
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 |
# File 'lib/mongo/cluster.rb', line 443 def disconnect! unless @connecting || @connected return true end if [:cleanup] != false session_pool.end_sessions @periodic_executor.stop! end @srv_monitor_lock.synchronize do if @srv_monitor @srv_monitor.stop! end end @servers.each do |server| if server.connected? server.disconnect! publish_sdam_event( Monitoring::SERVER_CLOSED, Monitoring::Event::ServerClosed.new(server.address, topology) ) end end publish_sdam_event( Monitoring::TOPOLOGY_CLOSED, Monitoring::Event::TopologyClosed.new(topology) ) @connecting = @connected = false true end |
#disconnect_server_if_connected(server) ⇒ 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.
809 810 811 812 813 814 815 816 817 |
# File 'lib/mongo/cluster.rb', line 809 def disconnect_server_if_connected(server) if server.connected? server.disconnect! publish_sdam_event( Monitoring::SERVER_CLOSED, Monitoring::Event::ServerClosed.new(server.address, topology) ) end end |
#has_readable_server?(server_selector = nil) ⇒ true, false
Determine if the cluster would select a readable server for the provided read preference.
653 654 655 |
# File 'lib/mongo/cluster.rb', line 653 def has_readable_server?(server_selector = nil) topology.has_readable_server?(self, server_selector) end |
#has_writable_server? ⇒ true, false
Determine if the cluster would select a writable server.
665 666 667 |
# File 'lib/mongo/cluster.rb', line 665 def has_writable_server? topology.has_writable_server?(self) end |
#heartbeat_interval ⇒ Float
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.
Get the refresh interval for the server. This will be defined via an option or will default to 10.
337 338 339 |
# File 'lib/mongo/cluster.rb', line 337 def heartbeat_interval [:heartbeat_frequency] || Server::Monitor::HEARTBEAT_FREQUENCY end |
#inspect ⇒ String
Get the nicer formatted string for use in inspection.
394 395 396 |
# File 'lib/mongo/cluster.rb', line 394 def inspect "#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.summary}>" end |
#max_read_retries ⇒ Integer
max_read_retries should be retrieved from the Client instance, not from a Cluster instance, because clusters may be shared between clients with different values for max read retries.
Get the maximum number of times the client can retry a read operation when using legacy read retries.
308 309 310 |
# File 'lib/mongo/cluster.rb', line 308 def max_read_retries [:max_read_retries] || MAX_READ_RETRIES end |
#next_primary(ping = nil, session = nil) ⇒ Mongo::Server
Get the next primary server we can send an operation to.
682 683 684 |
# File 'lib/mongo/cluster.rb', line 682 def next_primary(ping = nil, session = nil) ServerSelector.primary.select_server(self, nil, session) end |
#pool(server) ⇒ Server::ConnectionPool
Get the connection pool for the server.
697 698 699 |
# File 'lib/mongo/cluster.rb', line 697 def pool(server) server.pool end |
#read_retry_interval ⇒ Float
read_retry_interval should be retrieved from the Client instance, not from a Cluster instance, because clusters may be shared between clients with different values for the read retry interval.
Get the interval, in seconds, in which read retries when using legacy read retries.
326 327 328 |
# File 'lib/mongo/cluster.rb', line 326 def read_retry_interval [:read_retry_interval] || READ_RETRY_INTERVAL end |
#reconnect! ⇒ true
Use Client#reconnect to reconnect to the cluster instead of calling this method. This method does not send SDAM events.
Reconnect all servers.
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 |
# File 'lib/mongo/cluster.rb', line 483 def reconnect! @connecting = true scan! servers.each do |server| server.reconnect! end @periodic_executor.restart! @srv_monitor_lock.synchronize do if @srv_monitor @srv_monitor.run! end end @connecting = false @connected = true end |
#remove(host, disconnect: true) ⇒ Array<Server> | true | false
The return value of this method is not part of the driver’s public API.
Remove the server from the cluster for the provided address, if it exists.
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 |
# File 'lib/mongo/cluster.rb', line 766 def remove(host, disconnect: true) address = Address.new(host) removed_servers = @servers.select { |s| s.address == address } @update_lock.synchronize { @servers = @servers - removed_servers } if disconnect != false removed_servers.each do |server| disconnect_server_if_connected(server) end end if disconnect != false removed_servers.any? else removed_servers end end |
#run_sdam_flow(previous_desc, updated_desc, options = {}) ⇒ 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.
Runs SDAM flow on the cluster.
This method can be invoked to process a new server description returned by the server on a monitoring or non-monitoring connection, and also by the driver when it marks a server unknown as a result of a (network) error.
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 |
# File 'lib/mongo/cluster.rb', line 557 def run_sdam_flow(previous_desc, updated_desc, = {}) @sdam_flow_lock.synchronize do flow = SdamFlow.new(self, previous_desc, updated_desc) flow.server_description_changed # SDAM flow may alter the updated description - grab the final # version for the purposes of broadcasting if a server is available updated_desc = flow.updated_desc unless [:keep_connection_pool] if flow.became_unknown? servers_list.each do |server| if server.address == updated_desc.address server.clear_connection_pool end end end end start_stop_srv_monitor end # Some updated descriptions, e.g. a mismatched me one, result in the # server whose description we are processing being removed from # the topology. When this happens, the server's monitoring thread gets # killed. As a result, any code after the flow invocation may not run # a particular monitor instance, hence there should generally not be # any code in this method past the flow invocation. # # However, this broadcast call can be here because if the monitoring # thread got killed the server should have been closed and no client # should be currently waiting for it, thus not signaling the semaphore # shouldn't cause any problems. unless updated_desc.unknown? server_selection_semaphore.broadcast end end |
#scan!(sync = true) ⇒ true
In both synchronous and asynchronous scans, each monitor thread maintains a minimum interval between scans, meaning calling this method may not initiate a scan on a particular server the very next instant.
Force a scan of all known servers in the cluster.
If the sync parameter is true which is the default, the scan is performed synchronously in the thread which called this method. Each server in the cluster is checked sequentially. If there are many servers in the cluster or they are slow to respond, this can be a long running operation.
If the sync parameter is false, this method instructs all server monitor threads to perform an immediate scan and returns without waiting for scan results.
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 |
# File 'lib/mongo/cluster.rb', line 522 def scan!(sync=true) if sync servers_list.each do |server| if server.monitor server.monitor.scan! else log_warn("Synchronous scan requested on cluster #{summary} but server #{server} has no monitor") end end else servers_list.each do |server| server.scan_semaphore.signal end end true end |
#servers ⇒ Array<Server>
Get a list of server candidates from the cluster that can have operations executed on them.
360 361 362 |
# File 'lib/mongo/cluster.rb', line 360 def servers topology.servers(servers_list.compact).compact end |
#servers_list ⇒ 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.
804 805 806 |
# File 'lib/mongo/cluster.rb', line 804 def servers_list @update_lock.synchronize { @servers.dup } end |
#sessions_supported? ⇒ true | false
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 whether the deployment that the driver is connected to supports sessions.
Session support may change over time, for example due to servers in the deployment being upgraded or downgraded. This method returns the current information if the client is connected to at least one data bearing server. If the client is currently not connected to any data bearing servers, this method returns the last known value for whether the deployment supports sessions.
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 |
# File 'lib/mongo/cluster.rb', line 831 def sessions_supported? if topology.data_bearing_servers? return !!topology.logical_session_timeout end # No data bearing servers known - perform server selection to try to # get a response from at least one of them, to return an accurate # assessment of whether sessions are currently supported. begin ServerSelector.get(mode: :primary_preferred).select_server(self) !!topology.logical_session_timeout rescue Error::NoServerAvailable # We haven't been able to contact any servers - use last known # value for esssion support. @sessions_supported || false end end |
#set_server_list(server_address_strs) ⇒ 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.
Sets the list of servers to the addresses in the provided list of address strings.
This method is called by the SRV monitor after receiving new DNS records for the monitored hostname.
Removes servers in the cluster whose addresses are not in the passed list of server addresses, and adds servers for any addresses in the argument which are not already in the cluster.
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 |
# File 'lib/mongo/cluster.rb', line 609 def set_server_list(server_address_strs) @sdam_flow_lock.synchronize do server_address_strs.each do |address_str| unless servers_list.any? { |server| server.address.seed == address_str } add(address_str) end end servers_list.each do |server| unless server_address_strs.any? { |address_str| server.address.seed == address_str } remove(server.address.seed) end end end end |
#summary ⇒ Object
This method is experimental and subject to change.
402 403 404 405 406 |
# File 'lib/mongo/cluster.rb', line 402 def summary "#<Cluster " + "topology=#{topology.summary} "+ "servers=[#{servers_list.map(&:summary).join(',')}]>" end |
#update_cluster_time(result) ⇒ Object
Update the max cluster time seen in a response.
711 712 713 714 715 716 717 |
# File 'lib/mongo/cluster.rb', line 711 def update_cluster_time(result) if cluster_time_doc = result.cluster_time @cluster_time_lock.synchronize do advance_cluster_time(cluster_time_doc) end end end |
#update_topology(new_topology) ⇒ 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.
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 |
# File 'lib/mongo/cluster.rb', line 783 def update_topology(new_topology) old_topology = topology @topology = new_topology # If new topology has data bearing servers, we know for sure whether # sessions are supported - update our cached value. # If new topology has no data bearing servers, leave the old value # as it is and sessions_supported? method will perform server selection # to try to determine session support accurately, falling back to the # last known value. if topology.data_bearing_servers? @sessions_supported = !!topology.logical_session_timeout end publish_sdam_event( Monitoring::TOPOLOGY_CHANGED, Monitoring::Event::TopologyChanged.new(old_topology, topology) ) end |