class Mongo::Srv::Monitor
Periodically retrieves SRV records for the cluster’s SRV URI, and sets the cluster’s server list to the SRV lookup result.
If an error is encountered during SRV lookup or an SRV record is invalid or disallowed for security reasons, a warning is logged and monitoring continues.
@api private
Constants
- DEFAULT_TIMEOUT
- MIN_SCAN_INTERVAL
Attributes
@return [ Srv::Result ] Last known SRV lookup result. Used for
determining intervals between SRV lookups, which depend on SRV DNS records' TTL values.
Public Class Methods
Source
# File lib/mongo/srv/monitor.rb, line 100 def self.finalize(thread) Proc.new do thread.kill end end
Source
# File lib/mongo/srv/monitor.rb, line 42 def initialize(cluster, **opts) @cluster = cluster unless @srv_uri = opts.delete(:srv_uri) raise ArgumentError, 'SRV URI is required' end @options = opts.freeze @resolver = Srv::Resolver.new(**opts) @last_result = @srv_uri.srv_result @stop_semaphore = Semaphore.new end
Creates the SRV monitor.
@param [ Cluster ] cluster The cluster.
@option opts [ Float ] :timeout The timeout to use for DNS lookups. @option opts [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor. @option opts [ Hash ] :resolv_options For internal driver use only.
Options to pass through to Resolv::DNS constructor for SRV lookups.
Public Instance Methods
Source
# File lib/mongo/srv/monitor.rb, line 62 def start! super ObjectSpace.define_finalizer(self, self.class.finalize(@thread)) end
Calls superclass method
Mongo::BackgroundThread#start!
Private Instance Methods
Source
# File lib/mongo/srv/monitor.rb, line 69 def do_work scan! @stop_semaphore.wait(scan_interval) end
Source
# File lib/mongo/srv/monitor.rb, line 74 def scan! old_hosts = last_result.address_strs begin last_result = Timeout.timeout(timeout) do @resolver.get_records(@srv_uri.query_hostname) end rescue Resolv::ResolvTimeout => e log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}") return rescue ::Timeout::Error log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname} (timeout=#{timeout})") return rescue Resolv::ResolvError => e log_warn("SRV monitor: unable to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}") return end if last_result.empty? log_warn("SRV monitor: hostname #{@srv_uri.query_hostname} resolved to zero records") return end @cluster.set_server_list(last_result.address_strs) end
Source
# File lib/mongo/srv/monitor.rb, line 106 def scan_interval if last_result.empty? [cluster.heartbeat_interval, MIN_SCAN_INTERVAL].min elsif last_result.min_ttl.nil? MIN_SCAN_INTERVAL else [last_result.min_ttl, MIN_SCAN_INTERVAL].max end end
Source
# File lib/mongo/srv/monitor.rb, line 116 def timeout options[:timeout] || DEFAULT_TIMEOUT end