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 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 bajo Namespace

Clases: Conexión

Resumen constante

Constantes incluidas desde Loggable

Registrable::PREFIX

Resumen de atributos de la instancia colapsar

Resumen del método de instancia colapsar

Métodos incluidos desde BackgroundThread

#¡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 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, topology_version, Monitoring, **opciones)
  si topology_version.nil?
    propagar ArgumentError, 'Se debe proporcionar la versión de topología, pero fue nula'
  end
  a menos que opciones[:app_metadata]
    propagar ArgumentError, 'Los metadatos de la aplicación son obligatorios'
  end
  a menos que opciones[verificar_documento]
    propagar ArgumentError, 'Se requiere revisión de documentos'
  end
  @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 los atributos de instancia

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

Devuelve:

  • (Servidor)

    El servidor que está siendo supervisado.

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.

Supervisión de devoluciones La supervisión.

Devuelve:

Desde:

  • 2.0.0



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

def Monitoring
  @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:

  • (encriptada)

    Opciones de supervisar de inserción.

Desde:

  • 2.0.0



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

def opciones
  @options
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:

Desde:

  • 2.0.0



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

#chequeobjeto

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
  @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, opciones)
      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_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 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: opciones[:logger],
    prefijo_de_registro: 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.
  ¡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_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::SocketTimeoutError, "Se solicitó leer con un tiempo de espera negativo: #{}"
    elsif tiempo de espera > 0
      tiempo de espera += opciones[: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.

Desde:

  • 2.0.0



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.

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!
  @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_sObject

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 to_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.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