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 enviadas por el servidor.
Cuando un Monitor se conecta con un servidor 4.4+, crea una instancia de PushMonitor. PushMonitor ejecuta posteriormente un saludo enviado por el servidor (es decir, un saludo esperado y agotado) 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 para realizar comprobaciones inmediatas según lo solicite la aplicación.
Definido bajo Namespace
Clases: 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
- #comprobar ⇒ 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
- #¡Alto! ⇒ Objeto privado
- #to_s ⇒ Objeto privado
- #comando_de_comprobación_de_escritura ⇒ Objeto privado
Métodos incluidos desde BackgroundThread
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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Devuelve una nueva instancia de PushMonitor.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 35 def inicializar(Supervisar, topology_version, Monitoring, **) si topology_version.nil? propagar ArgumentError, 'Se debe proporcionar la versión de topología, pero fue nula' end a menos que [:app_metadata] propagar ArgumentError, 'Los metadatos de la aplicación son obligatorios' end a menos que [verificar_documento] propagar ArgumentError, 'Se requiere revisión de documentos' end @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 los atributos de instancia
#monitor ⇒ Servidor (sólo lectura)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Devuelve el servidor que se está supervisando.
55 56 57 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 55 def Supervisar @monitor end |
#monitoring ⇒ Monitoring (readonly)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Supervisión de devoluciones La supervisión.
61 62 63 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 61 def Monitoring @monitoring end |
#opciones ⇒ Hash (solo lectura)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Devuelve las opciones del monitor Push.
64 65 66 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 64 def @options end |
#topology_version ⇒ TopologyVersion (solo lectura)
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Devuelve la versión de topología recibida más recientemente.
58 59 60 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 58 def topology_version @topology_version end |
Detalles del método de instancia
#cheque ⇒ objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
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 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 137 def check @lock.sincronizar hacer si @conexión && @conexión.pid != Proceso.pid advertencia de registro("Sedetectó un cambio de PID: el cliente Mongo debería haberse reconectado (pid antiguo n.° {@connection.pid}, pid nuevo n.° {Process.pid}") @conexión.¡desconectar! @conexión = nulo end end @lock.sincronizar hacer a menos que @conexión @server_pushing = false Conexión = Monitor de empuje::Conexión.Nuevo(Server.dirección, ) Conexión.¡conectar! @conexión = Conexión end end resp_msg = begin a menos que @server_pushing comando de comprobación de escritura end read_response rescate Mongo::Error @lock.sincronizar hacer @conexión.¡desconectar! @conexión = nulo end propagar end @server_pushing = resp_msg.flags.incluir?(:más por venir) Resultado = Operación::Resultado.Nuevo(resp_msg) Resultado.validate! Resultado.Documentos.primero end |
#do_work ⇒ objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
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 130 131 132 133 134 135 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 94 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 topología. En este caso, necesitamos mantener nuestra versión existente. # versión de topología para que podamos reanudar el monitoreo. # 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. si new_description.topology_version @topology_version = new_description.topology_version end rescate IOError, Error de socket, SystemCallError, Mongo::Error => Excª parada solicitada = @lock.sincronizar { @solicitud_detencion } si parada solicitada # Ignora la excepción, consulta RUBY-2771. return end msg = "Error al ejecutar awaited hello en #{servidor.address}" Utils.warn_bg_exception(msg, Excª, logger: [:logger], prefijo_de_registro: [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. ¡detener! # Solicitar una revisión inmediata en el monitor para reincorporarse como # lo antes posible en caso de que el servidor esté realmente activo. Server.semáforo de escaneo.señal end |
#read_response ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 184 def read_response si tiempo de espera = [:tiempo de espera de 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 += [:frecuencia_del_latido] || Supervisar::DEFAULT_HEARTBEAT_INTERVAL end end # Establecemos el tiempo de espera dos veces: una vez pasado a read_socket que se aplica # a cada operación de lectura individual, y nuevamente en toda la lectura. Se acabó el tiempo.tiempo de espera(tiempo de espera, Error::SocketTimeoutError, "Nose pudo leer una respuesta de saludo esperada en #{timeout} segundos") hacer @lock.sincronizar { @conexión }.read_response(socket_timeout: tiempo de espera) end end |
#¡comienza! ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
69 70 71 72 73 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 69 def ¡empezar! @lock.sincronizar hacer super end end |
#¡Alto! ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 75 def ¡detener! @lock.sincronizar hacer @solicitud_detencion = true si @conexión # Interrumpe cualquier lectura "hello" agotada en progreso por # desconectando la conexión. @conexión.enviar(:enchufe).Cerrar rescate nulo end end super.tocar hacer @lock.sincronizar hacer si @conexión @conexión.¡desconectar! @conexión = nulo end end end end |
#to_s ⇒ Object
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
199 200 201 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 199 def to_s "#<#{self.clase.name}:#{object_id} #{servidor.address}>" end |
#comando_de_comprobación_de_escritura ⇒ Objeto
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
173 174 175 176 177 178 179 180 181 182 |
# Archivo 'lib/mongo/server/push_monitor.rb', línea 173 def comando de comprobación de escritura 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 { @conexión }.escritura_bytes(Comando.serializar.to_s) end |