Clase: Mongo::clúster
- Hereda:
-
Objeto
- Objeto
- Mongo::Clúster
- Ampliado por:
- Reenviable
- Definido en:
- lib/mongo/clúster.rb,
lib/mongo/clúster/topología.rb,
lib/mongo/clúster/topología.rb,
lib/mongo/clúster/sdam_flow.rb,
lib/mongo/clúster/topología/base.rb,
lib/mongo/clúster/topología/single.rb,
lib/mongo/clúster/topología/particionado.rb,
lib/mongo/clúster/topología/unknown.rb,
lib/mongo/clúster/periodic_executor.rb,
lib/mongo/clúster/reapers/cursor_reaper.rb,
lib/mongo/clúster/reapers/socket_reaper.rb,
lib/mongo/clúster/topología/load_balanced.rb,
lib/mongo/clúster/topología/no_replica_set_options.rb,
lib/mongo/clúster/topología/replica_set_no_primary.rb,
lib/mongo/clúster/topología/replica_set_with_primary.rb
Overview
Derechos de autor (C) 2018-2020 MongoDB Inc.
Licenciado bajo Apache License, Version 2.0 (la “Licencia”); no puede utilizar este archivo excepto en cumplimiento con la Licencia. Puede obtener una copia de la Licencia en
http://www.apache.org/licenses/LICENSE-2.0
A menos que lo exija la legislación aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye "TAL CUAL", SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean Express o implícitas. Consulta la Licencia para obtener los permisos específicos del lenguaje y las limitaciones según la Licencia.
Definido bajo Namespace
Modules: topología clase: CursorReaper, PeriodicExecutor, SdamFlow, SocketReaper
Resumen de constantes colapsar
- MAX_READ_RETRIES =
El número por defecto de reintentos de lectura heredados.
1- MAX_WRITE_RETRIES =
El número por defecto de reintentos de guardado para métodos heredados.
1- READ_RETRY_INTERVAL =
El intervalo de reintento de lectura por defecto, en segundos, al usar reintentos de lectura heredados.
5- IDLE_WRITE_PERIOD_SECONDS =
Con qué frecuencia un nodo primario inactivo escribe una operación nula en el oplog.
10- CLUSTER_TIME =
Obsoleto.
La clave de tiempo de clúster en las respuestas de los servidores mongos.
'clusterTime'
Constantes incluidas desde Loggable
Resumen de atributos de la instancia colapsar
-
#app_metadata ⇒ Mongo::Server::AppMetadata
Solo lectura
Los metadatos de la aplicación, usados para los handshakes de conexión.
- #monitor_app_metadata ⇒ Object Solo lectura privado
-
#monitoring ⇒ Monitoring
Solo lectura
Supervisión La supervisión.
-
#options ⇒ Hash
Solo lectura
El hash de opciones.
- #push_monitor_app_metadata ⇒ Object Solo lectura privado
-
#seeds ⇒ arreglo<String>
Solo lectura
privado
Las direcciones de los servidores semilla.
- #semafóro_selección_servidor ⇒ Objeto Solo lectura privado
- #session_pool ⇒ Objeto Solo lectura
- #srv_monitor ⇒ Object Solo lectura privado
-
#topología ⇒ Integer?
Solo lectura
El valor de tiempo de espera de la sesión lógica en minutos.
- #tracer ⇒ objeto Solo lectura
Atributos incluidos de Mongo::ClusterTime::Consumer
Atributos incluidos de Event::Subscriber
Resumen del método de clase colapsar
-
.create(client, supervisión: nil) ⇒ Clúster
privado
Crea un clúster para el cliente proporcionado, para usarlo cuando no queramos que la instancia original del clúster del cliente sea la misma.
Resumen del método de instancia colapsar
-
#==(otro) ⇒ true, false
Determine si este clúster de servidores es igual a otro objeto.
-
#agregar(host, add_options = nil) ⇒ Servidor
Agregar un servidor al clúster con la dirección proporcionada.
-
#direcciones ⇒ arreglo<Mongo::Address>
Las direcciones en el clúster.
-
#cerrar ⇒ nulo
privado
Cierras el clúster.
-
#¿conectado? ⇒ true|false
privado
Si el objeto clúster está conectado a su clúster.
-
#¿conectando? ⇒ verdadero|falso
privado
Si el objeto del clúster está en proceso de conectarse a su clúster.
- #disconnect_server_if_connected(servidor) ⇒ Objeto privado
-
#has_readable_server?(server_selector = nil) ⇒ verdadero, falso
Determina si el clúster seleccionaría un servidor legible para la preferencia de lectura proporcionada.
-
#has_writable_server? ⇒ verdadero, falso
Determina si el clúster seleccionaría un servidor escribible.
-
#heartbeat_interval ⇒ Float
privado
Obtén el intervalo de actualización del servidor.
-
#initialize(seeds, supervisión, options = Options::Redacted.new) ⇒ clúster
constructor
privado
Cree el nuevo clúster.
-
#inspect ⇒ string
Obtenga la string con formato más agradable para usar en la inspección.
-
#load_balanced? ⇒ true | false
Devuelve si el clúster está configurado para estar en la topología equilibrada de carga.
- #max_read_retries ⇒ Entero Obsoleto Obsoleto.
-
#next_primary(_ping = nil, session = nil, timeout: nil) ⇒ Mongo::Server
Obtén el siguiente servidor principal al que se le puede enviar una operación.
- #pool(servidor) ⇒ Server::ConnectionPool Obsoleto Obsoleto.
- #read_retry_interval ⇒ Flotante Obsoleto Obsoleto.
-
#¡reconectar! ⇒ verdadero
Obsoleto
Obsoleto.
Usa cliente#reconnect para reconectar al clúster en lugar de llamar a este método. Este método no envía eventos SDAM.
-
#remover(host, disconnect: true) ⇒ arreglo<Server> | true | false
Remueva el servidor del clúster para la dirección proporcionada, si existe.
-
#run_sdam_flow(previous_desc, updated_desc, options = {}) ⇒ Object
privado
Ejecuta el flujo SDAM en el clúster.
-
#escanear!(sync = true) ⇒ true
Forzar un análisis de todos los servidores conocidos en el clúster.
-
#servidores ⇒ arreglo<Server>
Obtén una lista de candidatos a servidores del clúster en los que se pueden ejecutar operaciones.
- #servers_list ⇒ Objeto privado
-
#set_server_list(server_address_strs) ⇒ Objecto
privado
Establece la lista de servidores en las direcciones de la lista proporcionada de cadenas de direcciones.
- #resumen ⇒ Objeto
-
#update_cluster_time(result) ⇒ Object
Actualiza el tiempo máximo de clúster observado en una respuesta.
- #update_topology(new_topology) ⇒ Object privado
-
#validate_session_support!(timeout: nil) ⇒ Object
privado
Genera el error Error::SessionsNotAvailable si la implementación al que está conectado el driver no admite sesiones.
Métodos incluidos de Mongo::ClusterTime::Consumer
Métodos incluidos desde Registrable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Métodos incluidos de Event::Subscriber
Métodos incluidos de Monitoring::Publishable
#publish_cmap_event, #publish_event, #publish_sdam_event
Detalles del Constructor
#initialize(seeds, supervisión, options = Options::Redacted.new) ⇒ clúster
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
El clúster nunca debe ser instanciado directamente fuera de un Cliente.
Al conectar a un URI mongodb+srv://, el cliente expande dicho URI en una lista de servidores y pasa esa lista al constructor de Clúster. Al conectarse a un mongod autónomo, el constructor de clúster recibe la dirección correspondiente como un arreglo de una sola string.
Cree el nuevo clúster.
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 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
# Archivo 'lib/mongo/cluster.rb', línea 118 def inicializar(semillas, Monitoring, = opciones::Redactado.Nuevo) propagar ArgumentError, 'Las semillas no pueden ser nulas' si semillas.nil? = .dup [:limpieza] = false si [:monitoring_io] == false && !.key?(:limpieza) @tracer = .borrar(trazador) @options = .freeze # @update_lock cubre @servers, @connecting, @connected, @topology y # @sessions_supported. Por lo general, las variables de instancia que no tienen un # designada para ellos, el bloqueo sólo debe modificarse bajo el bloqueo de actualización. # Ten en cuenta que el cambio de topología está bloqueado por @update_lock y no por # @sdam_flow_lock. @update_lock = Mutex (exclusión mutua).Nuevo @servers = [] @monitoring = Monitoring @event_listeners = Evento::Destinatarios.Nuevo @app_metadata = Server::AppMetadata.Nuevo(@options.fusionar(propósito: aplicación)) @monitor_app_metadata = Server::Supervisar::AppMetadata.Nuevo(@options.fusionar(propósito: supervisar)) @push_monitor_app_metadata = Server::Supervisar::AppMetadata.Nuevo(@options.fusionar(propósito: :push_monitor)) @cluster_time_lock = Mutex (exclusión mutua).Nuevo @cluster_time = nulo @srv_monitor_lock = Mutex (exclusión mutua).Nuevo @srv_monitor = nulo @server_selection_semaphore = Semáforo.Nuevo @topology = topología.inicial(sí mismo, Monitoring, ) # El bloqueo de cambio de estado es similar al bloqueo de flujo de sdam, pero está diseñado # para serializar los cambios de estado iniciados por los consumidores de clúster # (por ejemplo, aplicación que conecta o desconecta el clúster), de modo que # p. ej., una aplicación que llama a desconectar-conectar-desconectar rápidamente # no deja el clúster en un estado inconsistente. # La supervisión de las actualizaciones realizadas internamente por el driver no toma # el bloqueo de cambio de estado. @state_change_lock = Mutex (exclusión mutua).Nuevo # @sdam_flow_lock cubre solo el flujo sdam. Tenga en cuenta que no aplica # a los reemplazos de @topology que se realizan bajo @update_lock. @sdam_flow_lock = Mutex (exclusión mutua).Nuevo @session_pool = sesión::SessionPool.Nuevo(sí mismo) propagar ArgumentError, 'Quedan prohibidos los clústeres con equilibrio de carga sin semillas' si semillas.¿vacío? && balanceo_de_carga? # La topología inicial es siempre desconocida sin servidores. # https://github.com/mongodb/specifications/pull/388 opening_topology = topología::Desconocido.Nuevo(, Monitoring, sí mismo) publish_sdam_event( Monitoring::TOPLOGÍA_APERTURA, Monitoring::Evento::TopologyOpening.Nuevo(opening_topology) ) @seeds = semillas = semillas.uniq servidor = semillas.map hacer |Semilla| # Los eventos de apertura del servidor deben enviarse después de los eventos de cambio de topología. # Por lo tanto, la adición de un servidor por separado, se realiza aquí antes de cambiar la topología # El evento se publica, comenzando a supervisar el servidor que está # hecho más tarde. add(Semilla, supervisar: false) end si semillas.Tamaño >= 1 # Vuelve a crear la topología para obtener la lista actual de servidores en ella recreate_topology(topología, opening_topology) end possibly_warn_about_compatibility! si balanceo_de_carga? # Las especificaciones nos exigen que produzcamos determinados eventos SDAM # cuando en la topología equilibrada por carga. # Estos eventos no tienen mucho sentido desde el punto de vista de la # implementación SDAM del controlador, ni desde la perspectiva del # implementación del balanceador de carga del driver. # Son simplemente un formulario obligatorio. # # Ten en cuenta que esta llamada debe hacerse por encima de la verificación monitoring_io # porque eso interrumpe el resto del constructor. fabricate_lb_sdam_events_and_set_server_type end si [:monitoring_io] == false # Omitir la construcción del ejecutor periódico, porque sin servidores # no se puede enviar ningún comando al clúster y no debería haber # ser cualquier cosa que necesite ser limpiada. # # Omite la supervisión de servidores individuales y la única ronda heredada # de SDAM en el hilo principal, ya que podría estar en conflicto con pruebas que simulan # Respuestas SDAM. conectando = @conectado = false return end # Actualizar las variables de instancia antes de iniciar los hilos de supervisión. conectando = false @conectado = true si [:limpieza] != false @cursor_reaper = CursorReaper.Nuevo(sí mismo) @socket_reaper = SocketReaper.Nuevo(sí mismo) @periodic_executor = PeriodicExecutor.Nuevo([ @cursor_reaper, @socket_reaper, ], ) @periodic_executor.ejecutar! end return si balanceo_de_carga? # Se necesita registrar la hora de inicio antes de comenzar la supervisión start_monotime = Utils.monotonic_time servidor.cada hacer |Server| Server.Comenzar monitoreo end si [:escanear] != false server_selection_timeout = [:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT # El límite de tiempo para la selección del servidor puede ser muy corto, especialmente en # pruebas, cuando el cliente espera por un escaneo síncrono antes de # iniciando la selección del servidor. Limitando el escaneo al tiempo de selección del servidor # luego aborta el escaneo antes de que pueda procesar incluso servidores locales. # Por lo tanto, se debe permitir al menos 3 segundos para que se realice el escaneo aquí. server_selection_timeout = 3 si server_selection_timeout < 3 fecha límite = start_monotime + server_selection_timeout # Espera a que se complete el primer escaneo de cada servidor, para # compatibilidad hacia atrás. # Si se detectan servidores durante esta ronda de SDAM, vamos a # esperar a que estos servidores también sean consultados, y así sucesivamente, hasta el # tiempo de espera de selección del servidor o el mínimo de 3 segundos. bucle hacer # Asegúrese de que no intentamos leer la lista de servidores mientras SDAM se está ejecutando servidor = @sdam_flow_lock.sincronizar hacer servers_list.dup end break si servidor.¿todos? { |Server| Server.last_scan_monotime && Server.last_scan_monotime >= start_monotime } si (time_remaining = fecha límite - Utils.monotonic_time) <= 0 break end log_debug("Esperando hasta #{'%.2f' % tiempo_restante} segundos para que los servidores sean escaneados: #{resumen}") # Dado que el semáforo puede haber sido activado entre la comprobación # la lista de servidores anterior y la llamada de espera a continuación, no deberíamos # espera el tiempo restante completo - espera hasta 0.5 segundos, luego # volver a comprobar el estado. begin server_selection_semaphore.esperar([ time_remaining, 0.5 ].min) rescate ::Tiempo de espera::Error # nada end end end start_stop_srv_monitor end |
Detalles de atributo de instancias
#app_metadata ⇒ Mongo::servidor::AppMetadata (solo lectura)
Devuelve la metadatos de la aplicación, utilizada para los handshakes de conexión.
311 312 313 |
# Archivo 'lib/mongo/cluster.rb', línea 311 def @app_metadata end |
#monitor_app_metadata ⇒ Object (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
314 315 316 |
# Archivo 'lib/mongo/cluster.rb', línea 314 def @monitor_app_metadata end |
#monitoring ⇒ Monitoring (readonly)
Supervisión de devoluciones La supervisión.
300 301 302 |
# Archivo 'lib/mongo/cluster.rb', línea 300 def Monitoring @monitoring end |
#opciones ⇒ Hash (solo lectura)
Devuelve el hash de opciones.
297 298 299 |
# Archivo 'lib/mongo/cluster.rb', línea 297 def @options end |
#push_monitor_app_metadata ⇒ Object (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
317 318 319 |
# Archivo 'lib/mongo/cluster.rb', línea 317 def @push_monitor_app_metadata end |
#seeds ⇒ arreglo<String> (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
DevuelveLas direcciones de los servidores seed. Contiene las direcciones que se dieron al clúster cuando se instanció, no las direcciones actuales que el clúster está usando como resultado de SDAM.
325 326 327 |
# Archivo 'lib/mongo/cluster.rb', línea 325 def semillas @seeds end |
#semaforo_seleccion_servidor ⇒ Objeto (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
482 483 484 |
# Archivo 'lib/mongo/cluster.rb', línea 482 def server_selection_semaphore @server_selection_semaphore end |
#session_pool ⇒ Objeto (solo lectura)
330 331 332 |
# Archivo 'lib/mongo/cluster.rb', línea 330 def session_pool @session_pool end |
#srv_monitor ⇒ Object (solo lectura)
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
352 353 354 |
# Archivo 'lib/mongo/cluster.rb', línea 352 def srv_monitor @srv_monitor end |
#topología ⇒ entero? (solo lectura)
El valor de tiempo de espera de la sesión lógica en minutos.
305 306 307 |
# Archivo 'lib/mongo/cluster.rb', línea 305 def topología @topology end |
#trazador ⇒ Objeto (solo lectura)
302 303 304 |
# Archivo 'lib/mongo/cluster.rb', línea 302 def trazador @tracer end |
Detalles del método de clase
.create(cliente, supervisión: nil) ⇒ clúster
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Crea un clúster para el cliente proporcionado, para usarlo cuando no queramos que la instancia original del clúster del cliente sea la misma.
287 288 289 290 291 292 293 294 |
# Archivo 'lib/mongo/cluster.rb', línea 287 def sí mismo.Cree(Cliente, supervisión: nulo) clúster = clúster.Nuevo( Cliente.clúster.direcciones.map(&to_s), Monitoring || Monitoring.Nuevo, Cliente. ) Cliente.instance_variable_set(:@cluster, clúster) end |
Detalles del método de instancia
#==(otro) ⇒ true, false
Determina si este clúster de servidores es igual a otro objeto. Verifica los servidores que están actualmente en el clúster, y no los que se configuraron.
721 722 723 724 725 |
# Archivo 'lib/mongo/cluster.rb', línea 721 def ==(Otros) return false a menos que Otros.is_a?(clúster) direcciones == Otros.direcciones && == Otros. end |
#add(host, add_options = nil) ⇒ Servidor
Agrega un servidor al clúster con la dirección proporcionada. Útil en el descubrimiento automático de nuevos servidores cuando un servidor existente ejecuta un hola y potencialmente se incluyeron servidores no configurados.
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 |
# Archivo 'lib/mongo/cluster.rb', línea 827 def add(host, = nulo) dirección = Dirección.Nuevo(host, ) return si direcciones.incluir?(dirección) opciones = .fusionar(supervisar: false) # Si no iniciamos los hilos de supervisión, tampoco queremos # iniciar el hilo de poblador del pool. opciones.¡Actualizar!(populator_io: false) a menos que .obtener(:monitoring_io, true) # Tenga en cuenta que en una topología balanceada en cargas, cada servidor debe ser un # balanceador de carga (se especifica load_balancer: true en las opciones) # pero esta opción no se establece aquí porque es requerida por la # especificaciones para simular que el servidor comenzó como uno desconocido # y publicar el evento de cambio de descripción del servidor en el balanceador de carga # uno. Se establecerá la descripción realmente correcta para este servidor # por el método fabricate_lb_sdam_events_and_set_server_type. Server = Server.Nuevo(dirección, sí mismo, @monitoring, event_listeners, opciones) @update_lock.sincronizar hacer # Es necesario volver a comprobar si el servidor está presente en @servers, porque # la comprobación anterior no estaba bajo un bloqueo. # Dado que estamos bajo el bloqueo de actualización aquí, no podemos llamar a servers_list. return si @servers.map(&:address).incluir?(dirección) @servers.push(Server) end Server.Comenzar monitoreo si .nil? || [supervisar] != false Server end |
#direcciones ⇒ arreglo<Mongo::Address>
Las direcciones en el clúster.
445 446 447 |
# Archivo 'lib/mongo/cluster.rb', línea 445 def direcciones servers_list.map(&:address) end |
#cerrar ⇒ nil
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Las aplicaciones deben llamar a Client#close para desconectarse de
Cierras el clúster.
el clúster en lugar de llamar a este método. Este método es sólo para uso interno del controlador.
Desconecta todos los servidores en el clúster, publicando los eventos SDAM apropiados durante el proceso. Detiene la supervisión SRV si está activa. Marca el clúster como desconectado.
Un clúster cerrado ya no es utilizable. Si el cliente se vuelve a conectar, creará una nueva instancia de clúster.
500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 |
# Archivo 'lib/mongo/cluster.rb', línea 500 def Cerrar @state_change_lock.sincronizar hacer return nulo a menos que ¿Conectando? || ¿conectado? si [:limpieza] != false session_pool.end_sessions @periodic_executor.¡detente! end @srv_monitor_lock.sincronizar hacer @srv_monitor.¡detente! si @srv_monitor end @servers.cada hacer |Server| Next a menos que Server.¿conectado? Server.Cerrar publish_sdam_event( Monitoring::SERVIDOR_CERRADO, Monitoring::Evento::ServerClosed.Nuevo(Server.dirección, topología) ) end publish_sdam_event( Monitoring::TOPOLOGY_CLOSED, Monitoring::Evento::T opologíacerrada.Nuevo(topología) ) @update_lock.sincronizar hacer conectando = @conectado = false end end nulo end |
#¿conectado? ⇒ verdadero|falso
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Si el objeto clúster está conectado a su clúster.
418 419 420 421 422 |
# Archivo 'lib/mongo/cluster.rb', línea 418 def ¿conectado? @update_lock.sincronizar hacer !!@conectado end end |
#¿conectando? ⇒ true|false
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Si el objeto del clúster está en proceso de conectarse a su clúster.
406 407 408 409 410 |
# Archivo 'lib/mongo/cluster.rb', línea 406 def ¿Conectando? @update_lock.sincronizar hacer !!conectando end end |
#disconnect_servidor_if_connected(servidor) ⇒ objeto
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
931 932 933 934 935 936 937 938 939 940 |
# Archivo 'lib/mongo/cluster.rb', línea 931 def disconnect_server_if_connected(Server) return a menos que Server.¿conectado? Server.clear_description Server.¡desconectar! publish_sdam_event( Monitoring::SERVIDOR_CERRADO, Monitoring::Evento::ServerClosed.Nuevo(Server.dirección, topología) ) end |
#has_readable_server?(server_selector = nil) ⇒ true, false
Determina si el clúster seleccionaría un servidor legible para la preferencia de lectura proporcionada.
739 740 741 |
# Archivo 'lib/mongo/cluster.rb', línea 739 def has_readable_server?(selector_de_servidor = nulo) topología.has_readable_server?(sí mismo, selector_de_servidor) end |
#has_writable_server? ⇒ verdadero, falso
Determina si el clúster seleccionaría un servidor escribible.
751 752 753 |
# Archivo 'lib/mongo/cluster.rb', línea 751 def ¿tiene_servidor_escribible? topología.¿tiene_servidor_escribible?(sí mismo) end |
#heartbeat_interval ⇒ Float
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Obtén el intervalo de actualización para el servidor. Esto se definirá mediante una opción o tendrá un valor por defecto de 10.
397 398 399 |
# Archivo 'lib/mongo/cluster.rb', línea 397 def intervalo_latido [frecuency_de_los_latidos] || Server::Supervisar::DEFAULT_HEARTBEAT_INTERVAL end |
#inspect ⇒ String
Obtenga la string con formato más agradable para usar en la inspección.
467 468 469 |
# Archivo 'lib/mongo/cluster.rb', línea 467 def inspeccionar "#<Mongo::Clúster:0x#{object_id} servidores=#{servidores} topología=#{topología.resumen}>" end |
#¿balanceado_carga? ⇒ true | false
Devuelve si el clúster está configurado para estar en la topología equilibrada de carga.
339 340 341 |
# Archivo 'lib/mongo/cluster.rb', línea 339 def balanceo_de_carga? topología.is_a?(topología::loadBalanced) end |
#max_read_retries ⇒ Entero
max_read_retries debe recuperarse de la instancia Cliente, no de una instancia Cluster, porque los clústeres pueden compartirse entre clientes con diferentes valores para máx. reintentos de lectura.
Obten el número máximo de veces que el cliente puede reintentar una operación de lectura al utilizar reintentos de lectura heredados.
368 369 370 |
# Archivo 'lib/mongo/cluster.rb', línea 368 def max_read_retries [:max_read_retries] || MAX_READ_RETRIES end |
#next_primary(_ping = nil, session = nil, timeout: nil) ⇒ Mongo::Server
Obtén el siguiente servidor principal al que se le puede enviar una operación.
770 771 772 773 774 775 776 777 |
# Archivo 'lib/mongo/cluster.rb', línea 770 def siguiente_principal(ping = nulo, sesión = nulo, timeout: nulo) ServerSelector.primario.select_server( sí mismo, nulo, sesión, timeout: tiempo de espera ) end |
#pool(servidor) ⇒ Server::ConnectionPool
Obtenga el pool de conexiones para el servidor.
790 791 792 |
# Archivo 'lib/mongo/cluster.rb', línea 790 def group(Server) Server.group end |
#read_retry_interval ⇒ Float
read_retry_interval debe recuperarse desde la instancia Client, no desde una instancia Cluster, porque los clústeres pueden ser compartidos entre clientes con diferentes valores para el intervalo de reintento de lectura.
Obtenga el intervalo, en segundos, en el que se reintenta la lectura al utilizar reintentos de lectura heredados.
386 387 388 |
# Archivo 'lib/mongo/cluster.rb', línea 386 def read_retry_interval [intervalo_de_nueva_lectura] || READ_RETRY_INTERVAL end |
#¡reconectar! ⇒ true
Usa cliente#reconnect para reconectar al clúster en lugar de llamar a este método. Este método no envía eventos SDAM.
Reconecte todos los servidores.
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 |
# Archivo 'lib/mongo/cluster.rb', línea 541 def ¡Reconectar! @state_change_lock.sincronizar hacer @update_lock.sincronizar hacer conectando = true end ¡escanear! servidor.cada hacer |Server| Server.¡Reconectar! end @periodic_executor.¡reiniciar! @srv_monitor_lock.sincronizar hacer @srv_monitor.ejecutar! si @srv_monitor end @update_lock.sincronizar hacer conectando = false @conectado = true end end end |
#remover(host, disconnect: true) ⇒ arreglo<servidor> | true | false
El valor de retorno de este método no forma parte de la API pública del controlador.
Remueva el servidor del clúster para la dirección proporcionada, si existe.
874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 |
# Archivo 'lib/mongo/cluster.rb', línea 874 def Remover(host, desconectar: true) dirección = Dirección.Nuevo(host) removed_servers = [] @update_lock.sincronizar hacer @servers.delete_if hacer |Server| (Server.dirección == dirección).tocar hacer |borrar| removed_servers << Server si borrar end end end si Desconectar != false removed_servers.cada hacer |Server| disconnect_server_if_connected(Server) end end si Desconectar == false removed_servers else removed_servers.any? end end |
#run_sdam_flow(previous_desc, updated_desc, options = {}) ⇒ Objeto
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Ejecuta el flujo SDAM en el clúster.
Este método puede ser invocado para procesar una nueva descripción del servidor devuelta por el servidor en una conexión de supervisión o no de supervisión, y también por el driver cuando marca un servidor como desconocido como resultado de un error (de red).
625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 |
# Archivo 'lib/mongo/cluster.rb', línea 625 def run_sdam_flow(previous_desc, updated_desc, = {}) si balanceo_de_carga? si updated_desc.config.¿vacío? && ![:keep_connection_pool] servers_list.cada hacer |Server| # TODO: ¿deberá el ID del servicio ser eliminado de updated_desc? # También podríamos establecer que # options[:service_id] == updated_desc.service_id err = [Scan error] interrumpir = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError)) Server.clear_connection_pool(service_id: [:service_id], interrupt_in_use_connections: interrumpir) end end return end @sdam_flow_lock.sincronizar hacer flujo = SdamFlow.Nuevo(sí mismo, previous_desc, updated_desc, esperado: [:awaited]) flujo.server_description_changed # El flujo SDAM puede alterar la descripción actualizada: toma la final # una versión para los fines de transmisión si un servidor está disponible updated_desc = flujo.updated_desc si ![:keep_connection_pool] && flujo.se_volvió_desconocido? servers_list.cada hacer |Server| Next a menos que Server.dirección == updated_desc.dirección err = [Scan error] interrumpir = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError)) Server.clear_connection_pool(interrupt_in_use_connections: interrumpir) end end start_stop_srv_monitor end # Algunas descripciones actualizadas, por ejemplo, una mía desajustada, resultan en la # servidor cuya descripción estamos procesamiento siendo retirada de # la topología. Cuando esto ocurre, el hilo de supervisión del servidor obtiene # matado. Como resultado, cualquier código después de la invocación del flujo podría no ejecutarse # una instancia particular del monitor, por lo que generalmente no debería haber # cualquier código en este método después de la invocación del flujo. # # Sin embargo, esta llamada de difusión puede estar aquí porque si la supervisión # el hilo se mató, el servidor debería haberse cerrado y ningún cliente # debería estar esperando actualmente, por lo tanto no debe señalizar el semáforo # no debería causar ningún problema. return si updated_desc.¿desconocido? server_selection_semaphore.transmisión end |
#escaneo!(sincronizar = true) ⇒ true
Tanto en los escaneos sincrónicos como en los asincrónicos, cada hilo de supervisión mantiene un intervalo mínimo entre escaneos, lo que significa que llamar a este método puede que no inicie un escaneo en un servidor particular al instante siguiente.
Forzar un análisis de todos los servidores conocidos en el clúster.
Si el parámetro de sincronización es verdadero, que es el valor por defecto, el escaneo se realiza de manera sincrónica en el hilo que llamó a este método. Cada servidor del clúster se comprueba secuencialmente. Si hay muchos servidores en el clúster o son lentos para responder, esto puede ser una operación de larga duración.
Si el parámetro sync es falso, este método instruye a todos los hilos de monitorización del servidor para que realicen un escaneo inmediato y regresa sin esperar los resultados del escaneo.
584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 |
# Archivo 'lib/mongo/cluster.rb', línea 584 def ¡escanear!(sincronizar = true) si sincronizar servers_list.cada hacer |Server| si Server.Supervisar Server.Supervisar.¡escanear! else log_warn("Escaneo síncrono solicitado en el clúster #{resumen} pero el servidor #{servidor} no tiene monitor") end end else servers_list.cada hacer |Server| Server.scan_semaphore.señal end end true end |
#servers ⇒ Array<Server>
Obtén una lista de candidatos a servidores del clúster en los que se pueden ejecutar operaciones.
433 434 435 |
# Archivo 'lib/mongo/cluster.rb', línea 433 def servidor topología.servidor(servers_list) end |
#servers_list ⇒ objeto
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
924 925 926 927 928 |
# Archivo 'lib/mongo/cluster.rb', línea 924 def servers_list @update_lock.sincronizar hacer @servers.dup end end |
#set_server_list(server_address_strs) ⇒ Object
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Establece la lista de servidores en las direcciones de la lista proporcionada de cadenas de direcciones.
Este método se llama por el monitor SRV después de recibir nuevos registros DNS para el nombre de host monitorizado.
Remueve servidores en el clúster cuyas direcciones no estén en la lista de direcciones de servidor proporcionada y agrega servidores para cualquier dirección en el argumento que aún no esté en el clúster.
692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 |
# Archivo 'lib/mongo/cluster.rb', línea 692 def set_server_list(server_address_strs) @sdam_flow_lock.sincronizar hacer # Si una de las nuevas direcciones no está en la lista actual de servidores, # añadirlo a la lista de servidores. server_address_strs.cada hacer |address_str| add(address_str) a menos que servers_list.any? { |Server| Server.dirección.Semilla == address_str } end # Si una de las direcciones de los servidores no está en la nueva lista de direcciones, # remueva ese servidor de la lista de servidores. servers_list.cada hacer |Server| a menos que server_address_strs.any? { |address_str| Server.dirección.Semilla == address_str } Remover(Server.dirección.Semilla) end end end end |
#resumen ⇒ Objeto
Este método es experimental y está sujeto a cambios.
475 476 477 478 479 |
# Archivo 'lib/mongo/cluster.rb', línea 475 def Resumen '#<Cluster ' + "topología=#{topología.resumen} " + "servidores=[#{servers_list.map(&:summary).join(',')}]>" end |
#update_cluster_time(result) ⇒ Object
Actualiza el tiempo máximo de clúster observado en una respuesta.
804 805 806 807 808 809 810 |
# Archivo 'lib/mongo/cluster.rb', línea 804 def update_cluster_time(Resultado) return a menos que cluster_time_doc = Resultado.cluster_time @cluster_time_lock.sincronizar hacer advance_cluster_time(cluster_time_doc) end end |
#update_topology(new_topology) ⇒ Object
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 |
# Archivo 'lib/mongo/cluster.rb', línea 897 def update_topology(new_topology) old_topology = nulo @update_lock.sincronizar hacer old_topology = topología @topology = new_topology end # Si la nueva topología tiene servidores con datos, sabemos con certeza si # sesiones son compatibles - actualiza nuestro valor almacenado en caché. # Si la nueva topología no tiene servidores portadores de datos, deja el valor anterior # tal cual y sessions_supported? El método realizará la selección de servidores # para intentar determinar con precisión el soporte de la sesión, recurriendo al # último valor conocido. si topología.¿servidores portadores de datos? sesiones admitidas = !!topología.logical_session_timeout @update_lock.sincronizar hacer @sesiones_soportadas = sesiones admitidas end end publish_sdam_event( Monitoring::TOPOLOGY_CHANGED, Monitoring::Evento::TopologyChanged.Nuevo(old_topology, topología) ) end |
#validate_session_support!(timeout: nil) ⇒ objeto
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Genera el error Error::SessionsNotAvailable si la implementación al que está conectado el driver no admite sesiones.
El soporte de sesión puede cambiar con el tiempo, por ejemplo, debido a actualizaciones o retrocesos de servidores en la implementación. Si el cliente no está conectado a ningún servidor y no encuentra ningún servidor durante el tiempo de espera de selección de servidor, este método generará NoServerAvailable. Este método se llama desde el flujo de ejecución de la operación, y si se genera la excepción NoServerAvailable, toda la operación fallará con esa excepción, ya que la ejecución de la operación ha esperado hasta que expire el tiempo de espera de selección del servidor para que cualquier servidor esté disponible (lo cual sería un conjunto que incluye a todos los servidores adecuados para la operación que se está intentando) y ninguno se materializó.
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 |
# Archivo 'lib/mongo/cluster.rb', línea 966 def validate_session_support!(timeout: nulo) return si topología.is_a?(topología::loadBalanced) @state_change_lock.sincronizar hacer @sdam_flow_lock.sincronizar hacer raise_sessions_not_supported si topología.¿servidores portadores de datos? && !topología.logical_session_timeout end end # No se conocen servidores portadores de datos, realice la selección de servidor para intentar # obtén una respuesta de al menos uno de ellos para devolver un resultado preciso # evaluación de si las sesiones están actualmente soportadas. ServerSelector.Obtener(moda: :primary_preferred).select_server(sí mismo, timeout: tiempo de espera) @state_change_lock.sincronizar hacer @sdam_flow_lock.sincronizar hacer raise_sessions_not_supported a menos que topología.logical_session_timeout end end end |