Clase: Mongo::Server::Monitor Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
Ampliado por:
Reenviable
Incluye:
BackgroundThread, Event::Publisher, Loggable
Definido en:
lib/mongo/server/monitor.rb,
lib/mongo/server/monitor/connection.rb,
lib/mongo/server/monitor/app_metadata.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.

Responsable de realizar consultas periódicas a un servidor a través de comandos hello para mantener actualizado el estado del servidor.

Realiza todo el trabajo en un hilo en segundo plano para no interferir con otras operaciones realizadas por el driver.

Desde:

  • 2.0.0

Definido bajo Namespace

clase: AppMetadata, Connection

Resumen de constantes colapsar

DEFAULT_HEARTBEAT_INTERVAL =

Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.

El intervalo por defecto entre actualizaciones del estado del servidor es de 10 segundos.

Desde:

  • 2.0.0

10
MIN_SCAN_INTERVAL =

Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.

El tiempo mínimo entre escaneos forzados del servidor. minHeartbeatFrequencyMS en la especificación SDAM.

Desde:

  • 2.0.0

0.5
RTT_WEIGHT_FACTOR =

Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.

Obsoleto.

Se eliminará en la versión 3.0.

El factor de ponderación (alfa) para calcular el tiempo promedio de ida y vuelta en movimiento.

Desde:

  • 2.0.0

0.2

Constantes incluidas desde Loggable

Loggable::PREFIX

Resumen de atributos de la instancia colapsar

Atributos incluidos de Event::Publisher

#event_listeners

Resumen del método de instancia colapsar

Métodos incluidos de BackgroundThread (Hilo de fondo)

#¡corre!, #¿corriendo?

Métodos incluidos desde Registrable

#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger

Métodos incluidos de Event::Publisher

#publicar

Detalles del Constructor

#inicializar(servidor, listeners_de_eventos, supervisión, opciones = {}) ⇒ Monitor

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.

Nota:

El monitor nunca debe ser instanciado directamente fuera de un servidor.

Cree el nuevo monitor de servidor.

Ejemplos:

Crear para supervisar el servidor.

Mongo::Server::Monitor.new(address, listeners, monitoring)

Parámetros:

  • Server (servidor)

    El servidor a supervisar.

  • event_listeners (Event::Listeners)

    Los evento listeners.

  • Monitoring (supervisión)

    La supervisión.

  • opciones (encriptada) (por defecto: {})

    Las opciones.

Opciones Hash (options):

  • timeout_conexión (Flotante)

    El tiempo de espera, en segundos, que debe utilizarse al establecer la conexión de supervisión.

  • intervalo de latidos (Flotante)

    El intervalo entre comprobaciones regulares del servidor.

  • :logger (Logger)

    Un registrador personalizado para usar.

  • :monitor_app_metadata (Mongo::servidor::supervisar::AppMetadata)

    Los metadatos que se utilizarán para la conexión de supervisión regular.

  • :push_monitor_app_metadata (Mongo::servidor::supervisar::AppMetadata)

    Los metadatos que se usarán para la conexión del monitor de envío.

  • timeout_del_socket (Flotante)

    El tiempo de espera, en segundos, para ejecutar operaciones en la conexión de supervisión.

Aumenta:

  • (ArgumentError)

Desde:

  • 2.0.0



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Archivo 'lib/mongo/server/monitor.rb', línea 76

def inicializar(Server, event_listeners, Monitoring, opciones = {})
  propagar ArgumentError, "Tipo de supervisión incorrecto: #{supervisión.inspect}" a menos que Monitoring.is_a?(Monitoring)
  propagar ArgumentError, 'Los metadatos de la aplicación son obligatorios' a menos que opciones[:app_metadata]
  propagar ArgumentError, 'Los metadatos de la aplicación de monitor de notificaciones son obligatorios' a menos que opciones[:push_monitor_app_metadata]

  @server = Server
  @event_listeners = event_listeners
  @monitoring = Monitoring
  @options = opciones.freeze
  @mutex = Mutex (exclusión mutua).Nuevo
  @sdam_mutex = Mutex (exclusión mutua).Nuevo
  @next_earliest_scan = @next_wanted_scan = Tiempo.ahora
  @update_mutex = Mutex (exclusión mutua).Nuevo
  # Protege las lecturas y guardar de @connection para que la conexión de sondeo pueda
  # se cancelará desde otro hilo. Según las especificaciones de supervisión del servidor
  # cancelCheck pseudocódigo, el bloqueo solo se mantiene el tiempo suficiente para copiar o
  # asigne la referencia, nunca a través de la comprobación de bloqueo.
  @connection_lock = Mutex (exclusión mutua).Nuevo
end

Detalles de atributo de instancias

#monitoringMonitoring (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.

Devuelve:

Desde:

  • 2.0.0



127
128
129
# Archivo 'lib/mongo/server/monitor.rb', línea 127

def Monitoring
  @monitoring
end

#opcionesHash (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 Opciones del servidor.

Devuelve:

  • (encriptada)

    options Las opciones del servidor.

Desde:

  • 2.0.0



108
109
110
# Archivo 'lib/mongo/server/monitor.rb', línea 108

def opciones
  @options
end

#servidorServidor (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.

Servidor de devoluciones El servidor que este supervisar está supervisando.

Devuelve:

  • (servidor)

    servidor El servidor que este monitor está supervisando.

Desde:

  • 2.0.0



98
99
100
# Archivo 'lib/mongo/server/monitor.rb', línea 98

def Server
  @server
end

Detalles del método de instancia

#cancel_check!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.

Cancele la comprobación en curso y cierre la conexión de supervisión.

Se llama cuando el servidor se marca como Desconocido debido a un error de red, según la especificación de supervisión del servidor ("cancelación de hello o hello heredado"). Detiene el PushMonitor de transmisión (interrumpiendo su lectura de hello esperada) y cierra la conexión de sondeo, por lo que la siguiente comprobación debe establecer una nueva en lugar de volver a validar el servidor a través de un socket posiblemente inactivo.

Desde:

  • 2.0.0



210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# Archivo 'lib/mongo/server/monitor.rb', línea 210

def cancel_check!
  stop_push_monitor!

  # Copie la referencia de conexión debajo del bloqueo, luego interrumpa y cierre
  # fuera del bloqueo. Cerrar el socket interrumpe cualquier proceso en curso
  # leer en el hilo de supervisar; nil-ing la referencia fuerza el siguiente
  # comprobar si se ha vuelto a conectar. El hilo de supervisión es el único escritor de un nuevo
  # conexión, por lo que es seguro que este hilo lo borre.
  Conexión = @connection_lock.sincronizar hacer
    conn = @connection
    @connection = nulo
    conn
  end
  Conexión&.¡desconectar!
end

#connectionMongo::servidor::supervisar::Connection | 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.

Devuelve La conexión que se va a usar, lea en @connection_lock para que las personas que llaman nunca observen una referencia obsoleta después de un cancel_check simultáneo. lo borra.

Devuelve:

  • (Mongo::servidor::supervisar::Connection | nil)

    La conexión que se debe usar, se lee bajo @connection_lock para que los que la llaman nunca observen una referencia obsoleta después de una cancelación_check concurrente. lo borra.

Desde:

  • 2.0.0



103
104
105
# Archivo 'lib/mongo/server/monitor.rb', línea 103

def Conexión
  @connection_lock.sincronizar { @connection }
end

#create_push_monitor!(topology_version, connection) ⇒ 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.

Parámetros:

  • Conexión (Mongo::Servidor::Monitor::Conexion)

    La conexión de supervisión recién establecida. Se pasó explícitamente (en lugar de leerse desde @connection) para que un cancel_check! simultáneo no pueda anularlo entre su establecimiento y la creación del PushMonitor.

Desde:

  • 2.0.0



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# Archivo 'lib/mongo/server/monitor.rb', línea 175

def create_push_monitor!(topology_version, Conexión)
  @update_mutex.sincronizar hacer
    @push_monitor = nulo si @push_monitor && !@push_monitor.¿corriendo?

    @push_monitor ||= PushMonitor.Nuevo(
      sí mismo,
      topology_version,
      Monitoring,
      **Utils.shallow_symbolize_keys(opciones.fusionar(
                                       socket_timeout: intervalo_latido + Conexión.socket_timeout,
                                       app_metadata: opciones[:push_monitor_app_metadata],
                                       check_document: Conexión.check_document
                                     ))
    )
  end
end

#do_workobjeto

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.

Realiza una verificación del servidor.

Desde:

  • 2.0.0



140
141
142
143
144
145
146
147
148
149
150
151
152
# Archivo 'lib/mongo/server/monitor.rb', línea 140

def realizar_trabajo
  ¡escanear!
  # @next_wanted_scan puede ser actualizado por el monitor de push.
  # Sin embargo, debemos comprobar la bandera de terminación para que el monitor
  # El hilo se cierra cuando se solicita.
  bucle hacer
    delta = @next_wanted_scan - Tiempo.ahora
    break a menos que delta > 0

    señalado = Server.scan_semaphore.esperar(delta)
    break si señalado || @solicitud_detencion
  end
end

#heartbeat_intervalFloat

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 intervalo entre comprobaciones regulares del servidor.

Devuelve:

  • (Float)

    El intervalo del latido, en segundos.

Desde:

  • 2.0.0



113
114
115
# Archivo 'lib/mongo/server/monitor.rb', línea 113

def intervalo_latido
  opciones[intervalo de latidos] || DEFAULT_HEARTBEAT_INTERVAL
end

#push_monitorServer::PushMonitor | 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.

Devuelve el monitor push, si se está utilizando uno.

Devuelve:

Desde:

  • 2.0.0



131
132
133
134
135
# Archivo 'lib/mongo/server/monitor.rb', línea 131

def push_monitor
  @update_mutex.sincronizar hacer
    @push_monitor
  end
end

#reinicio!Thread

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.

Reinicia el monitor del servidor a menos que el proceso actual esté todavía en ejecución.

Ejemplos:

Reinicia el monitor.

monitor.restart!

Devuelve:

  • (Thread)

    El hilo en el que se ejecuta el monitor.

Desde:

  • 2.1.0



308
309
310
311
312
313
314
# Archivo 'lib/mongo/server/monitor.rb', línea 308

def ¡reiniciar!
  si @thread && @thread.alive?
    @thread
  else
    ejecutar!
  end
end

#run_sdam_flow(result, awaited: false, scan_error: nil, rtt_only: false) ⇒ 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.

Desde:

  • 2.0.0



268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
# Archivo 'lib/mongo/server/monitor.rb', línea 268

def run_sdam_flow(Resultado, esperado: false, scan_error: nulo, rtt_only: false)
  @sdam_mutex.sincronizar hacer
    old_description = Server.Descripción

    # Una medición solo de RTT (protocolo de transmisión activo) no debe actualizarse
    # la topología o publicar eventos SDAM. El RTT que reunió es
    # incorporado en la siguiente descripción de transmisión-hello a través del
    # calculadora de RTT compartida. El cronograma a continuación sigue ejecutándose, por lo que el
    # supervisar mantiene el ritmo de sus comprobaciones.
    a menos que rtt_only
      new_description = Descripción.Nuevo(
        Server.dirección,
        Resultado,
        average_round_trip_time: Server.calculadora_de_tiempo_de_viaje_redondo.average_round_trip_time,
        minimum_round_trip_time: Server.calculadora_de_tiempo_de_viaje_redondo.minimum_round_trip_time
      )
      Server.clúster.run_sdam_flow(Server.Descripción, new_description, esperado: en espera, scan_error: scan_error)
    end

    Server.Descripción.tocar hacer |new_description|
      a menos que en espera
        si new_description.¿desconocido? && !old_description.¿desconocido?
          @next_earliest_scan = @next_wanted_scan = Tiempo.ahora
        else
          @next_earliest_scan = Tiempo.ahora + MIN_SCAN_INTERVAL
          @next_wanted_scan = Tiempo.ahora + intervalo_latido
        end
      end
    end
  end
end

#scan!Descripción

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.

Nota:

Si el reloj del sistema se atrasa, este método puede dormir durante mucho tiempo.

Nota:

El valor de retorno de este método está obsoleto. En la versión 3.0.0, este método no tendrá un valor de retorno.

Realice una comprobación del servidor con limitación y actualice la descripción del servidor y el tiempo medio de ida y vuelta.

Si se revisó el servidor hace menos de MIN_SCAN_INTERVAL segundos, se debe esperar hasta que hayan pasado MIN_SCAN_INTERVAL segundos desde la última revisión. A continuación, realiza la verificación que implica ejecutar hello en el servidor que se está supervisando y actualizar la descripción del servidor como resultado.

Devuelve:

Desde:

  • 2.0.0



244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
# Archivo 'lib/mongo/server/monitor.rb', línea 244

def ¡escanear!
  # Normalmente, el hilo en segundo plano invocaría este método.
  # Pero también es posible invocar scan! directamente sobre un monitor.
  # Permitir que solo se realice un escaneo a la vez.
  @mutex.sincronizar hacer
    throttle_scan_frequency!

    # Cuando el protocolo de transmisión está activo, el PushMonitor es el
    # fuente SDAM autorizada y este análisis solo mide el RTT en el
    # conexión dedicada. Según la especificación de supervisión del servidor, un RTT
    # el comando NO DEBE publicar eventos ni actualizar la topología. Calcular
    # esto antes de do_scan, que puede (re)conectarse y cambiar el estado.
    rtt_only = ¿solo_medición_rtt?

    begin
      Resultado = do_scan(publish_heartbeat: !rtt_only)
    rescate StandardError => e
      run_sdam_flow({}, scan_error: e, rtt_only: rtt_only)
    else
      run_sdam_flow(Resultado, rtt_only: rtt_only)
    end
  end
end

#¡stop!true | false

Detener el hilo en segundo plano y esperar a que finalice durante un tiempo razonable.

Devuelve:

  • (true | false)

    Si el hilo fue terminado.

Desde:

  • 2.0.0



160
161
162
163
164
165
166
167
168
169
# Archivo 'lib/mongo/server/monitor.rb', línea 160

def ¡detente!
  stop_push_monitor!

  # Reenviar el valor de retorno de super
  super.tocar hacer
    # Importante: la desconexión debería ocurrir después del hilo en segundo plano
    # termina.
    Conexión&.¡desconectar!
  end
end

#stop_push_monitor!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.

Desde:

  • 2.0.0



192
193
194
195
196
197
198
199
# Archivo 'lib/mongo/server/monitor.rb', línea 192

def stop_push_monitor!
  @update_mutex.sincronizar hacer
    si @push_monitor
      @push_monitor.¡detente!
      @push_monitor = nulo
    end
  end
end

#to_sObject

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.

Desde:

  • 2.0.0



316
317
318
# Archivo 'lib/mongo/server/monitor.rb', línea 316

def to_s
  "#<#{self.clase.name}:#{object_id} #{servidor.address}>"
end