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 privado
- #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 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
-
#trigger_periodic_executor! ⇒ objeto
privado
Fuerza al ejecutor periódico del clúster a ejecutarse inmediatamente.
-
#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.
287 288 289 |
# Archivo 'lib/mongo/cluster.rb', línea 287 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.
290 291 292 |
# Archivo 'lib/mongo/cluster.rb', línea 290 def @monitor_app_metadata end |
#monitoring ⇒ Monitoring (readonly)
Supervisión de devoluciones La supervisión.
276 277 278 |
# Archivo 'lib/mongo/cluster.rb', línea 276 def Monitoring @monitoring end |
#opciones ⇒ Hash (solo lectura)
Devuelve el hash de opciones.
273 274 275 |
# Archivo 'lib/mongo/cluster.rb', línea 273 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.
293 294 295 |
# Archivo 'lib/mongo/cluster.rb', línea 293 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.
301 302 303 |
# Archivo 'lib/mongo/cluster.rb', línea 301 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.
456 457 458 |
# Archivo 'lib/mongo/cluster.rb', línea 456 def server_selection_semaphore @server_selection_semaphore end |
#session_pool ⇒ 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.
304 305 306 |
# Archivo 'lib/mongo/cluster.rb', línea 304 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.
326 327 328 |
# Archivo 'lib/mongo/cluster.rb', línea 326 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.
281 282 283 |
# Archivo 'lib/mongo/cluster.rb', línea 281 def topología @topology end |
#trazador ⇒ Objeto (solo lectura)
278 279 280 |
# Archivo 'lib/mongo/cluster.rb', línea 278 def trazador @tracer 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.
695 696 697 698 699 |
# Archivo 'lib/mongo/cluster.rb', línea 695 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.
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 |
# Archivo 'lib/mongo/cluster.rb', línea 801 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.
419 420 421 |
# Archivo 'lib/mongo/cluster.rb', línea 419 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.
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# Archivo 'lib/mongo/cluster.rb', línea 474 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.
392 393 394 395 396 |
# Archivo 'lib/mongo/cluster.rb', línea 392 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.
380 381 382 383 384 |
# Archivo 'lib/mongo/cluster.rb', línea 380 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.
905 906 907 908 909 910 911 912 913 914 |
# Archivo 'lib/mongo/cluster.rb', línea 905 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.
713 714 715 |
# Archivo 'lib/mongo/cluster.rb', línea 713 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.
725 726 727 |
# Archivo 'lib/mongo/cluster.rb', línea 725 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.
371 372 373 |
# Archivo 'lib/mongo/cluster.rb', línea 371 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.
441 442 443 |
# Archivo 'lib/mongo/cluster.rb', línea 441 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.
313 314 315 |
# Archivo 'lib/mongo/cluster.rb', línea 313 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.
342 343 344 |
# Archivo 'lib/mongo/cluster.rb', línea 342 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.
744 745 746 747 748 749 750 751 |
# Archivo 'lib/mongo/cluster.rb', línea 744 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.
764 765 766 |
# Archivo 'lib/mongo/cluster.rb', línea 764 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.
360 361 362 |
# Archivo 'lib/mongo/cluster.rb', línea 360 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.
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 |
# Archivo 'lib/mongo/cluster.rb', línea 515 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.
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 |
# Archivo 'lib/mongo/cluster.rb', línea 848 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).
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 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 |
# Archivo 'lib/mongo/cluster.rb', línea 599 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.
558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 |
# Archivo 'lib/mongo/cluster.rb', línea 558 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.
407 408 409 |
# Archivo 'lib/mongo/cluster.rb', línea 407 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.
898 899 900 901 902 |
# Archivo 'lib/mongo/cluster.rb', línea 898 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.
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 |
# Archivo 'lib/mongo/cluster.rb', línea 666 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.
449 450 451 452 453 |
# Archivo 'lib/mongo/cluster.rb', línea 449 def Resumen '#<Cluster ' + "topología=#{topología.resumen} " + "servidores=[#{servers_list.map(&:summary).join(',')}]>" end |
#trigger_periodic_executor! ⇒ 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.
Fuerza al ejecutor periódico del clúster a ejecutarse inmediatamente. Si el clúster no tiene un ejecutor periódico, este método no hace nada.
964 965 966 967 968 |
# Archivo 'lib/mongo/cluster.rb', línea 964 def trigger_periodic_executor! return a menos que @periodic_executor @periodic_executor.ejecutar end |
#update_cluster_time(result) ⇒ Object
Actualiza el tiempo máximo de clúster observado en una respuesta.
778 779 780 781 782 783 784 |
# Archivo 'lib/mongo/cluster.rb', línea 778 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.
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 |
# Archivo 'lib/mongo/cluster.rb', línea 871 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ó.
940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 |
# Archivo 'lib/mongo/cluster.rb', línea 940 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 |