Classe: Mongo::Server::PushMonitor Private

Herda:
Objeto
  • Objeto
mostrar tudo
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.

Desde:

  • 2.0.0

Definido sob namespace

Classes: Conexão

Resumo constante

Constantes incluídas do Loggable

Loggable::Prefix

Recolhimento do Resumo do atributo de instância

Recolhimento do Resumo do método de instância

Métodos incluídos do BackgroundThread

#run!, #correndo?

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.

Desde:

  • 2.0.0



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, **opções)
  se topology_version.nada?
    aumentar ArgumentError, ' Aversão da topologia deve ser fornecida, mas era nula'
  end
  a menos que opções[:app_metadata]
    aumentar ArgumentError, ' Osmetadados do aplicativo são obrigatórios'
  end
  a menos que opções[:check_document]
    aumentar ArgumentError, ' Odocumento de verificação é necessário'
  end
  @app_metadata = opções[:app_metadata]
  @check_document = opções[:check_document]
  @monitor = monitorar
  @topology_version = topology_version
  @monitoring = Monitoramento
  @opções = opções
  @ bloqueio = Mutex.Novo
end

Detalhes do atributo da instância

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

Retorna:

Desde:

  • 2.0.0



55
56
57
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 55

def monitorar
  @monitor
end

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

Retorna:

Desde:

  • 2.0.0



61
62
63
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 61

def Monitoramento
  @monitoring
end

#opçõesHash (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.

Retorna:

  • (Hash)

    Opções do monitor de push.

Desde:

  • 2.0.0



64
65
66
# File 'build/ruby-driver-v2.19/lib/mongo/server/push_monitor.rb', linha 64

def opções
  @opções
end

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

Retorna:

Desde:

  • 2.0.0



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

#checkObjeto

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.

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
# 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, opções)
      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.

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
# 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: opções[:logger],
    log_prefix: opções[:log_prefix],
    bg_error_backtrace: opções[: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.

Desde:

  • 2.0.0



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 = opções[:connect_timeout]
    se timeout < 0
      aumentar mongo::SocketTimeoutError, "Foi solicitada a leitura com um timeout negativo: #{}"
    elsif timeout > 0
      timeout += opções[: 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.

Desde:

  • 2.0.0



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.

Desde:

  • 2.0.0



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.

Desde:

  • 2.0.0



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.

Desde:

  • 2.0.0



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