Clase: Mongo::Server::PushMonitor Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
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.

Desde:

  • 2.0.0

Definido bajo Namespace

clase: Conexión

Resumen constante

Constantes incluidas desde Loggable

Loggable::PREFIX

Resumen de atributos de la instancia colapsar

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

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.

Aumenta:

  • (ArgumentError)

Desde:

  • 2.0.0



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, **opciones)
  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 opciones[:app_metadata]
  propagar ArgumentError, 'Se requiere revisión de documentos' a menos que opciones[verificar_documento]

  @app_metadata = opciones[:app_metadata]
  @check_document = opciones[verificar_documento]
  @monitor = Supervisar
  @topology_version = topology_version
  @monitoring = Monitoring
  @options = opciones
  @lock = Mutex (exclusión mutua).Nuevo
end

Detalles de atributo de instancias

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

Devuelve:

  • (servidor)

    El servidor que está siendo supervisado.

Desde:

  • 2.0.0



48
49
50
# Archivo 'lib/mongo/server/push_monitor.rb', línea 48

def Supervisar
  @monitor
end

#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



54
55
56
# Archivo 'lib/mongo/server/push_monitor.rb', línea 54

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 del monitor Push.

Devuelve:

  • (encriptada)

    Opciones de supervisar de inserción.

Desde:

  • 2.0.0



57
58
59
# Archivo 'lib/mongo/server/push_monitor.rb', línea 57

def opciones
  @options
end

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

Devuelve:

Desde:

  • 2.0.0



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

#chequeobjeto

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



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, opciones)
      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_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.

Desde:

  • 2.0.0



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: opciones[:logger],
                          log_prefix: opciones[log_prefix],
                          bg_error_backtrace: opciones[: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_responseObjeto

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



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 = opciones[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 += opciones[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.

Desde:

  • 2.0.0



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.

Desde:

  • 2.0.0



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_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



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_commandObject

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



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