Clase: Mongo::Server::PushMonitor Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
Ampliado por:
Reenviable
Incluye:
Hilo de fondo
Definido en:
lib/mongo/server/push_monitor.rb,
lib/mongo/server/push_monitor/connection.rb

Overview

Esta clase forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse 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.

Desde:

  • 2.0.0

Definido en el espacio de nombres

Clases: Conexión

Resumen constante

Constantes incluidas desde Loggable

Registrable::PREFIX

Colapso delresumen de atributos de instancia

Colapso del resumen del método de instancia

Métodos incluidos desde BackgroundThread

#corre!, #corriendo?

Métodos incluidos en Loggable

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

Detalles del constructor

#inicializar(monitor, topología_versión, monitoreo, **opciones) ⇒ 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.

Desde:

  • 2.0.0



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, versión_de_topología, vigilancia, **opciones)
  Si versión_de_topología.nil?
    propagar ArgumentError, 'Sedebe proporcionar la versión de topología pero fue nula'
  end
  a no ser que opciones[:app_metadata]
    propagar ArgumentError, 'Los metadatos de la aplicación son obligatorios'
  end
  a no ser que opciones[:verificar_documento]
    propagar ArgumentError, 'Serequiere comprobar documento'
  end
  @app_metadata = opciones[:app_metadata]
  @check_document = opciones[:verificar_documento]
  @monitor = Supervisar
  @topology_version = versión_de_topología
  @monitoring = vigilancia
  @opciones = opciones
  @cerrar = Mutex.Nuevo
end

Detalles de los atributos de instancia

#monitorServidor (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 el servidor que está siendo monitoreado.

Devuelve:

  • (Servidor)

    El servidor que está siendo monitoreado.

Desde:

  • 2.0.0



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

def Supervisar
  @monitor
end

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

Monitoreo de devoluciones El monitoreo.

Devuelve:

Desde:

  • 2.0.0



61
62
63
# Archivo 'lib/mongo/server/push_monitor.rb', línea 61

def vigilancia
  @monitoring
end

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

Devuelve:

  • (Hash)

    Opciones del monitor de empuje.

Desde:

  • 2.0.0



64
65
66
# Archivo 'lib/mongo/server/push_monitor.rb', línea 64

def opciones
  @opciones
end

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

Devuelve:

  • (TopologyVersion)

    Versión de topología recibida más recientemente.

Desde:

  • 2.0.0



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

def versión_de_topología
  @topology_version
end

Detalles del método de instancia

#comprobarObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



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
  @cerrar.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

  @cerrar.sincronizar hacer
    a no ser que @conexión
      @server_pushing = false
      conexión = Monitor de empuje::Conexión.Nuevo(Server.dirección, opciones)
      conexión.¡conectar!
      @conexión = conexión
    end
  end

  resp_msg = begin
    a no ser que @server_pushing
      comando de comprobación de escritura
    end
    read_response
  rescate Mongo::Error
    @cerrar.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.primera
end

#do_workobjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



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 hacer_trabajo
  @cerrar.sincronizar hacer
    return Si @stop_requested
  end

  resultado = vigilancia.publicar_latido(Server, esperado: true) hacer
    check
  end
  new_description = Supervisar.ejecutar_sdam_flow(resultado, esperado: true)
  # Cuando falla el saludo debido a un punto de falla, 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
  # dice que topologyVersion solo debe actualizarse si es exitoso
  # hola respuestas.
  Si new_description.versión_de_topología
    @topology_version = new_description.versión_de_topología
  end
rescate IOError, Error de socket, SystemCallError, Mongo::Error => Excª
  parada solicitada = @cerrar.sincronizar { @stop_requested }
  Si parada solicitada
    # Ignore la excepción, consulte RUBY-2771.
    return
  end

  msg = "Erroral ejecutar el saludo esperado en #{server. address}"
  Utils.advertencia_bg_excepción(msg, Excª,
    logger: opciones[:logger],
    prefijo_de_registro: opciones[:prefijo_de_registro],
    bg_error_backtrace: opciones[:bg_error_backtrace],
  )

  # Si una solicitud falla en una conexión, detenga la monitorización de push.
  # En caso de que el servidor esté muerto no queremos tener dos conexiones
  # intentando conectarse sin éxito al mismo tiempo.
  ¡detener!

  # Solicitar una verificación inmediata del monitor para ser reinstalado como
  # lo antes posible en caso de que el servidor esté realmente activo.
  Server.semáforo de escaneo.señal
end

#read_responseObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



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 = opciones[:tiempo de espera de conexión]
    Si tiempo de espera < 0
      propagar Mongo::Error de tiempo de espera del socket, "Sesolicitó lectura con un tiempo de espera negativo: #{ }"
    elsif tiempo de espera > 0
      tiempo de espera += opciones[:frecuencia_del_latido] || Supervisar::INTERVALO DE LATIDO PREDETERMINADO
    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::Error de tiempo de espera del socket, "Nose pudo leer una respuesta de saludo esperada en #{timeout} segundos") hacer
    @cerrar.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.

Desde:

  • 2.0.0



69
70
71
72
73
# Archivo 'lib/mongo/server/push_monitor.rb', línea 69

def ¡comenzar!
  @cerrar.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.

Desde:

  • 2.0.0



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!
  @cerrar.sincronizar hacer
    @stop_requested = 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.grifo hacer
    @cerrar.sincronizar hacer
      Si @conexión
        @conexión.¡desconectar!
        @conexión = nulo
      end
    end
  end
end

#to_sObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



199
200
201
# Archivo 'lib/mongo/server/push_monitor.rb', línea 199

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

#comando_de_comprobación_de_escrituraObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



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.unir(
    topologyVersion: versión_de_topología.to_doc,
    Tiempo de espera máximo MS: Supervisar.intervalo de latidos * 1000,
  )
  Comando = Protocolo::Msg.Nuevo(
    [:escape_permitido], {}, Documento.unir({'$db' => Database::ADMINISTRACIÓN})
  )
  @cerrar.sincronizar { @conexión }.escritura_bytes(Comando.fabricar en serie.a_s)
end