Clase: Mongo::Server::PushMonitor Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::Servidor::PushMonitor
- Ampliado por:
- Reenviable
- Incluye:
- BackgroundThread
- Definido en:
- lib/mongo/server/push_monitor.rb,
lib/mongo/server/push_monitor/connection.rb
Overview
Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.
Un monitor que utiliza solicitudes de saludo activadas desde el servidor.
Cuando un Monitor realiza un apretón de manos con un servidor 4.4+, crea una instancia de PushMonitor. A continuación, PushMonitor ejecuta el saludo enviado por el servidor (es decir, awaited & exhausted hello) para recibir los cambios de topología del servidor lo más rápido posible. El Monitor sigue supervisando el servidor para calcular el tiempo de ida y vuelta y realizar comprobaciones inmediatas según lo solicitado por la aplicación.
Definido bajo Namespace
clase: Conexión
Resumen constante
Constantes incluidas desde Loggable
Resumen de atributos de la instancia colapsar
-
#monitor ⇒ Server
Solo lectura
privado
El servidor que está siendo supervisado.
-
#monitoring ⇒ Monitoring
Solo lectura
privado
Supervisión La supervisión.
-
#options ⇒ Hash
Solo lectura
privado
Opciones de supervisar de inserción.
-
#topology_version ⇒ TopologyVersion
Solo lectura
privado
Versión más reciente de la topología recibida.
Resumen del método de instancia colapsar
- #verificar ⇒ Objeto privado
- #do_work ⇒ Objeto privado
-
#initialize(monitor, topology_version, supervisión, **options) ⇒ PushMonitor
constructor
privado
Una nueva instancia de PushMonitor.
- #read_response ⇒ objeto privado
- #start! ⇒ Objeto privado
- #¡deténgase! ⇒ Objeto privado
- #to_s ⇒ Objeto privado
- #write_check_command ⇒ Objecto privado
Métodos incluidos de BackgroundThread (Hilo de fondo)
Métodos incluidos desde Registrable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Detalles del Constructor
#initialize(supervisar, topology_version, supervisión, **options) ⇒ PushMonitor
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.
Devuelve una nueva instancia de PushMonitor.
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 33 def inicializar(Supervisar, topology_version, Monitoring, **) propagar ArgumentError, 'Se debe proporcionar la versión de topología, pero fue nula' si topology_version.nil? propagar ArgumentError, 'Los metadatos de la aplicación son obligatorios' a menos que [:app_metadata] propagar ArgumentError, 'Se requiere revisión de documentos' a menos que [verificar_documento] @app_metadata = [:app_metadata] @check_document = [verificar_documento] @monitor = Supervisar @topology_version = topology_version @monitoring = Monitoring @options = @lock = Mutex (exclusión mutua).Nuevo end |
Detalles de atributo de instancias
#monitor ⇒ Servidor (sólo 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.
Devuelve el servidor que se está supervisando.
48 49 50 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 48 def Supervisar @monitor end |
#monitoring ⇒ Monitoring (readonly)
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.
Supervisión de devoluciones La supervisión.
54 55 56 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 54 def Monitoring @monitoring end |
#opciones ⇒ Hash (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.
Devuelve las opciones del monitor Push.
57 58 59 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 57 def @options end |
#topology_version ⇒ TopologyVersion (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.
Devuelve la versión de topología recibida más recientemente.
51 52 53 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 51 def topology_version @topology_version end |
Detalles del método de instancia
#cheque ⇒ 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.
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 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 131 def check @lock.sincronizar hacer si @connection && @connection.pid != Proceso.pid log_warn("Cambio de PID detectado: el cliente de Mongo debería haberse reconectado (PID antiguo #{@connection.pid}, nuevo PID #{Process.pid}") @connection.¡desconectar! @connection = nulo end end @lock.sincronizar hacer a menos que @connection @server_pushing = false Conexión = PushMonitor::Conexión.Nuevo(Server.dirección, ) Conexión.¡conectar! @connection = Conexión end end resp_msg = begin escribir_comando_de_verificación a menos que @server_pushing read_response rescate mongo::Error @lock.sincronizar hacer @connection.¡desconectar! @connection = nulo end propagar end @server_pushing = resp_msg.flags.incluir?(…y más por venir) Resultado = Operación::Resultado.Nuevo(resp_msg) Resultado.validate! Resultado.Documentos.primero end |
#do_work ⇒ 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.
91 92 93 94 95 96 97 98 99 100 101 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 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 91 def realizar_trabajo @lock.sincronizar hacer return si @solicitud_detencion end Resultado = Monitoring.publish_heartbeat(Server, esperado: true) hacer check end new_description = Supervisar.run_sdam_flow(Resultado, esperado: true) # Cuando el saludo falla debido a un punto de error, la respuesta no # incluir la versión de la topología. En este caso, necesitamos mantener nuestro # versión de topología para que podamos reanudar la supervisión. # La especificación no parece abordar este caso directamente, pero # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-monitoring.md#streamable-hello-or-legacy-hello-command # indica que topologyVersion solo debe actualizarse a partir de exitosas # respuestas de saludo. @topology_version = new_description.topology_version si new_description.topology_version rescate IOError, SocketError, SystemCallError, mongo::Error => e stop_requested = @lock.sincronizar { @solicitud_detencion } si stop_requested # Ignora la excepción, consulta RUBY-2771. return end msg = "Error al ejecutar awaited hello en #{servidor.address}" Utils.warn_bg_exception(msg, e, logger: [:logger], log_prefix: [log_prefix], bg_error_backtrace: [:bg_error_backtrace]) # Si una solicitud falla en una conexión, detén la supervisión. # En caso de que el servidor esté caído, no queremos tener dos conexiones # tratando de conectarse sin éxito al mismo tiempo. ¡detente! # Solicitar una revisión inmediata en el monitor para reincorporarse como # rápidamente en caso de que el servidor esté realmente activo. Server.scan_semaphore.señal end |
#read_response ⇒ 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.
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 176 def read_response si tiempo de espera = [timeout_conexión] si tiempo de espera < 0 propagar mongo::SocketTimeoutError, 'Se solicitó leer con un tiempo de espera negativo: ' elsif tiempo de espera > 0 tiempo de espera += [frecuency_de_los_latidos] || Supervisar::DEFAULT_HEARTBEAT_INTERVAL end end # Se establece el tiempo de espera dos veces: una vez se pasa a read_socket que se aplica # a cada operación de lectura individual, y nuevamente en toda la lectura. Tiempo de espera.tiempo de espera(tiempo de espera, Error::SocketTimeoutError, "No se ha podido leer una respuesta esperada de saludo en #{timeout} segundos") hacer @lock.sincronizar { @connection }.read_response(socket_timeout: tiempo de espera) end end |
#¡empezar! ⇒ 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.
62 63 64 65 66 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 62 def ¡empezar! @lock.sincronizar hacer super end end |
#¡detenerse! ⇒ 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.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 68 def ¡detente! @lock.sincronizar hacer @solicitud_detencion = true si @connection # Interrumpe cualquier lectura "hello" agotada en progreso por # desconectando la conexión. begin @connection.enviar(socket).Cerrar rescate StandardError nulo end end end super.tocar hacer @lock.sincronizar hacer si @connection @connection.¡desconectar! @connection = nulo end end end end |
#to_s ⇒ 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.
192 193 194 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 192 def to_s "#<#{self.clase.name}:#{object_id} #{servidor.address}>" end |
#write_check_command ⇒ 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.
165 166 167 168 169 170 171 172 173 174 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 165 def escribir_comando_de_verificación Documento = @check_document.fusionar( topologyVersion: topology_version.to_doc, maxAwaitTimeMS: Supervisar.intervalo_latido * 1000 ) Comando = protocolo::Msg.Nuevo( [ exhaust_allowed ], {}, Documento.fusionar({ '$db' => Database::ADMIN }) ) @lock.sincronizar { @connection }.write_bytes(Comando.serializar.to_s) end |