Classe: Mongo::Server::PushMonitor Private
- Herda:
-
Objeto
- Objeto
- Mongo::Servidor::PushMonitor
- Estendido por:
- Encaminhável
- Inclui:
- BackgroundThread
- Definido em:
- build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb,
build/ruby-driver-v2.19/lib/mongo/server/push_monitor/connection.rb
Visão geral
Esta classe faz parte de uma API privada. Evite usar essa classe, se possível, pois ela pode ser removida ou alterada no futuro.
Um monitor utilizando solicitações de hello enviadas pelo servidor.
Quando um Monitor se comunica com um servidor 4.4+, ele cria uma instância do PushMonitor. Posteriormente, o PushMonitor executa o hello enviado pelo servidor (ou seja, olá esperado e esgotado) para receber alterações de topologia do servidor o mais rápido possível. O Monitor ainda monitora o servidor para cálculos de tempo de ida e volta e para realizar verificações imediatas, conforme solicitado pelo aplicativo.
Definido sob namespace
Classes: Conexão
Resumo constante
Constantes incluídas do Loggable
Recolhimento do Resumo do atributo de instância
-
#monitor ⇒ Server
Somente leitura
privado
O servidor que está sendo monitorado.
-
#monitoramento ➤ Monitoramento
Somente leitura
privado
Monitoramento O monitoramento.
-
#opções ➤ Hash
Somente leitura
privado
Opções do monitor de push.
-
#topology_version ⇒ TopologyVersion
Somente leitura
privado
Versão de topologia recebida mais recentemente.
Recolhimento do Resumo do método de instância
- #check ➤ Objeto privado
- #do_work ➤ Objeto privado
-
#initialize(monitor, topology_version, monitoramento, **opções) ➤ PushMonitor
construtor
privado
Uma nova instância do PushMonitor.
- #read_response ➤ Objeto privado
- #start! ➤ Objeto privado
- #pare! ➤ Objeto privado
- #to_s ➤ Objeto privado
- #write_check_command ➤ Objeto privado
Métodos incluídos do BackgroundThread
Métodos incluídos no Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_WARN, #logger
Detalhes do construtor
#initialize(monitor, topology_version, monitoramento, **opções) ➤ PushMonitor
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna uma nova instância do PushMonitor.
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 35 def inicializar(monitorar, topology_version, Monitoramento, **) se topology_version.nada? aumentar ArgumentError, ' Aversão da topologia deve ser fornecida, mas era nula' end a menos que [:app_metadata] aumentar ArgumentError, ' Osmetadados do aplicativo são obrigatórios' end a menos que [:check_document] aumentar ArgumentError, ' Odocumento de verificação é necessário' end @app_metadata = [:app_metadata] @check_document = [:check_document] @monitor = monitorar @topology_version = topology_version @monitoring = Monitoramento @opções = @ bloqueio = Mutex.Novo end |
Detalhes do atributo da instância
#monitor ➤ Servidor (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna o servidor que está sendo monitorado.
55 56 57 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 55 def monitorar @monitor end |
#Monitoring ➤ Monitoramento (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Monitoramento de retornos O monitoramento.
61 62 63 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 61 def Monitoramento @monitoring end |
#opções ➤ Hash (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna as opções do monitor de push.
64 65 66 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 64 def @opções end |
#topology_version ➤ TopologyVersion (somente leitura)
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Retorna a versão de topologia recebida mais recentemente.
58 59 60 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 58 def topology_version @topology_version end |
Detalhes do método de instância
#check ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no 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 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 137 def verificar @ bloqueio.sincronizar fazer se @connection && @connection.PID != Processo.PID log_service("Alteração de PID detectada - o cliente mongo deveria ter sido reconectado (antigo PID #{@connection.PID}, novo PID #{Process.PID}") @connection.desconecte-se! @connection = nada end end @ bloqueio.sincronizar fazer a menos que @connection @server_pushing = false Conexão = PushMonitor::Conexão.Novo(Servidor.endereço, ) Conexão.Conecte-se! @connection = Conexão end end resp_msg = começar a menos que @server_pushing write_check_command end read_response salvar mongo::Erro @ bloqueio.sincronizar fazer @connection.desconecte-se! @connection = nada end aumentar end @server_pushing = resp_msg.flags.incluir?(:more_to_come) Resultado = (operação)::Resultado.Novo(resp_msg) Resultado.validar! Resultado.documentos.primeiro end |
#do_work ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no 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 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 94 def do_work @ bloqueio.sincronizar fazer Método se @stop_requested end Resultado = Monitoramento.publish_ heartbeat(Servidor, esperado: true) fazer verificar end new_description = monitorar.run_sdam_flow(Resultado, esperado: true) # Quando hello falha devido a um ponto de falha, a resposta não # inclui versão de topologia. Neste caso, precisamos manter nosso # versão de topologia para que possamos retomar o monitoramento. # A especificação não parece abordar diretamente este caso, mas # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-monitoring.rst#streaming-ismaster # diz que topologyVersion só deve ser atualizada de # olá respostas. se new_description.topology_version @topology_version = new_description.topology_version end salvar IOError, Erro de soquete, SystemCallError, mongo::Erro => exc stop_requested = @ bloqueio.sincronizar { @stop_requested } se stop_requested # Ignore a exceção, consulte RUBY-2771. Método end mensagem = "Erro ao executar awaited hello no #{servidor.endereço}" Utilidades.write_bg_exceção(mensagem, exc, registrador: [:logger], log_prefix: [:log_prefix], bg_error_backtrace: [:bg_error_backtrace], ) # Se uma solicitação falhar em uma conexão, interrompa o monitoramento por push. # Caso o servidor esteja morto, não queremos ter duas conexões # tentando se conectar sem sucesso ao mesmo tempo. pare! # Solicite uma verificação imediata no monitor para ser reintegrado como # o mais rápido possível, caso o servidor esteja realmente ativo. Servidor.varredura_semafore.sinal end |
#read_response ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 184 def read_response se timeout = [:connect_timeout] se timeout < 0 aumentar mongo::SocketTimeoutError, "Foi solicitada a leitura com um timeout negativo: #{}" elsif timeout > 0 timeout += [: heartbeat_frequency] || Monitorar::DEFAULT_HEARTBEAD_INTERVAL end end # Definimos o tempo limite duas vezes: uma vez passado para read_socket que se aplica # para cada operação de leitura individual e, novamente, para toda a leitura. Tempo-limite.timeout(timeout, Erro::SocketTimeoutError, "Não foi possível ler uma resposta de olá aguardada em #{timeout} segundos") fazer @ bloqueio.sincronizar { @connection }.read_response(socket_timeout: timeout) end end |
#start! ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
69 70 71 72 73 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 69 def comece! @ bloqueio.sincronizar fazer super end end |
#pare! ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 75 def pare! @ bloqueio.sincronizar fazer @stop_requested = true se @connection # Interrompa qualquer leitura de hello esgotada em andamento por # desconectando a conexão. @connection.enviar(:socket).Fechar salvar nada end end super.toque fazer @ bloqueio.sincronizar fazer se @connection @connection.desconecte-se! @connection = nada end end end end |
#to_s ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
199 200 201 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 199 def to_s "#<#{self.classe.name}:#{object_id} #{servidor.endereço}>" end |
#write_check_command ➤ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
173 174 175 176 177 178 179 180 181 182 |
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 173 def write_check_command documento = @check_document.mesclar( topologyVersion: topology_version.to_doc, maxAwaitTimeMS: monitorar.heartbeat_interval * 1000, ) comando = protocolo::Msg.Novo( [:exhaust_allowed], {}, documento.mesclar({'$db' => Database::ADMIN}) ) @ bloqueio.sincronizar { @connection }.write_bytes(comando.serializar.to_s) end |