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
cluster[R]
last_result[R]
@return [ Srv::Result
] Last known SRV lookup result. Used for
determining intervals between SRV lookups, which depend on SRV DNS records' TTL values.
options[R]
Public Class Methods
new(cluster, **opts)
click to toggle source
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.
# File lib/mongo/srv/monitor.rb, line 45 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
Private Instance Methods
do_work()
click to toggle source
# File lib/mongo/srv/monitor.rb, line 67 def do_work scan! @stop_semaphore.wait(scan_interval) end
scan!()
click to toggle source
# File lib/mongo/srv/monitor.rb, line 72 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
scan_interval()
click to toggle source
# File lib/mongo/srv/monitor.rb, line 98 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
timeout()
click to toggle source
# File lib/mongo/srv/monitor.rb, line 108 def timeout options[:timeout] || DEFAULT_TIMEOUT end