Classe: Mongo::Server::ConnectionPool
- Herda:
-
Objeto
- Objeto
- Mongo::Server::ConnectionPool
- Estendido por:
- Encaminhável
- Inclui:
- Loggable, Monitoramento::publicável
- Definido em:
- lib/mongo/ servidor/connection_pool.rb,
lib/mongo/ servidor/connection_pool/populator.rb,
lib/mongo/ servidor/connection_pool/generation_manager.rb
Visão geral
Representa um pool de conexões para conexões de servidor.
Definido sob namespace
Classes: GeraçãoManager, Populator
Colapsode resumo constante
- DEFAULT_MAX_SIZE =
O tamanho máximo padrão para o pool de conexões.
20- DEFAULT_MIN_SIZE =
O tamanho mínimo padrão para o pool de conexões.
0- DEFAULT_MAX_CONNECTING =
O número máximo padrão de conexões que podem estar se conectando a qualquer momento.
2- DEFAULT_WAIT_TIMEOUT =
O tempo limite padrão, em segundos, para aguardar uma conexão.
Esse tempo limite se aplica enquanto os threads de fluxo aguardam que os threads de background estabeleçam conexões (e, portanto, eles devem se conectar, fazer handshake e autenticar no tempo alocado).
No momento, está definido para 10 segundos. O tempo limite de conexão padrão é 10 segundos por si só, mas definir tempos limite grandes pode colocar problemas nos aplicativos se suas solicitações atingirem o tempo limite pelo proxy reverso, portanto, qualquer coisa acima 15 segundos é potencialmente perigoso.
10
Constantes incluídas do Loggable
Recolhimento do Resumo do atributo de instância
-
#seguintes
Somente leitura
privado
Geração Geração de conexões atualmente sendo usadas pela fila.
- #max_connecting ➤ Objeto Somente leitura privado
-
#opções ➤ Hash
Somente leitura
Opções As opções do pool.
-
#preencher_semafore ➤ Objeto
Somente leitura
Variável de condição transmitida quando o tamanho do pool muda para ativar o populator.
- #preenchidor ➤ Objeto Somente leitura privado
- #servidor ➤ Objeto Somente leitura privado
Atributos incluídos no Monitoramento::publicável
Recolhimento do Resumo do método de classe
-
.finalizar(available_connections, pending_connections, _populator) ➤ Proc
Finalize o pool de conexões para a coleta de lixo.
Recolhimento do Resumo do método de instância
-
#available_count ➤ Inteiro
Número de conexões disponíveis no pool.
-
#check_in(connection) ➤ Object
Verifique uma conexão de volta ao pool.
-
#check_out(connection_global_id: nil, context: nil) ➤ Mongo::Server::Connection
Verifica uma conexão fora do pool.
-
#check_out_pinned_connection(connection_global_id) ➤ Conexão | nada
privado
Retorna uma conexão fixada que já foi verificada, se houver com o ID global fornecido.
-
#clear(options = nil) ➤ true
Fecha todas as conexões ociosas no pool e agenda as conexões atualmente verificadas para serem fechadas quando forem verificadas novamente no pool.
-
#close(options = nil) ➤ true
Marca o pool como fechado, fecha todas as conexões ociosas no pool e agenda as conexões atualmente verificadas para serem fechadas quando forem verificadas novamente no pool.
-
#close_idle_sockets ➤ Objeto
Feche os soquetes que estiverem abertos por mais tempo do que o tempo ocioso máximo, se a opção estiver definida.
-
#fechado? ➤ verdadeiro | false
Se o pool foi fechado.
-
#desconectar!(options = nil) ➤ Objeto
privado
Desconecta o pool.
-
#do_check_in(connection) ➤ Object
Executa o check-in depois de já ter adquirido a trava.
- #do_clear(options = nil) ➤ Objeto
-
#do_pause ➤ Objeto
privado
Marque o pool de conexões como pausado sem adquirir a trava.
-
#initialize(server, options = {}) ➤ ConnectionPool
construtor
Crie o novo pool de conexões.
-
#inspecionar ➤ string
Obtenha uma inspeção de string bem impressa para a pool.
-
#max_idle_time ➤ Flutuante | nada
O máximo de segundos que um soquete pode permanecer inativo desde que fez check-in no pool, se definido.
-
#max_size ➤ Inteiro
Obtenha o tamanho máximo do pool de conexões.
-
#min_size ➤ Inteiro
Obtenha o tamanho mínimo do pool de conexões.
-
#pausa ➤ Objeto
Marque o pool de conexões como pausado.
-
#pausado? ➤ verdadeiro | false
Um pool de conexões será pausado se não estiver fechado e não estiver pronto.
-
#preencher ➤ verdadeiro | false
privado
Este método faz três coisas: 1.
-
#pronto ➤ Objeto
Instrui o pool a criar e retornar conexões.
-
#pronto? ➤ verdadeiro | false
Se o pool está pronto.
-
#size ⇒ Integer
Tamanho do pool de conexões.
-
#estado ⇒ Hash
privado
Retorna estatísticas sobre o estado interno do pool de conexões, principalmente para fins de teste e depuração.
-
#stop_populator ➤ Objeto
privado
Pare o thread do preenchedor em segundo plano e limpe todas as conexões criadas que ainda não foram conectadas.
- #resumo ➤ Objeto
-
#unavailable_connections ➤ Inteiro
privado
O número de conexões indisponíveis no pool.
-
#wait_timeout(context = nil) ⇒ Float
O tempo de espera, em segundos, para que uma conexão fique disponível.
-
#with_connection(connection_global_id: nil, context: nil) ➤ Objeto
Entregue o bloco a uma conexão enquanto lida com a lógica de check-in/check-out.
Métodos incluídos do monitoramento::publicável
#publish_cmap_event, #publish_event, #publish_sdam_event
Métodos incluídos no Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_WARN, #logger
Detalhes do construtor
#initialize(servidor, options = {}) ➤ ConnectionPool
Crie o novo pool de conexões.
Observação: Além disso, as opções para conexões criadas por esse pool devem ser incluídas nas opções passadas aqui e serão encaminhadas para todas as conexões criadas pelo pool.
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 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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 100 def inicializar(Servidor, = {}) aumentar ArgumentError, ' Oprimeiro argumento deve ser uma instância do servidor' a menos que Servidor.is_a?(Servidor) = .dup se [:min_size] && [:min_pool_size] && [:min_size] != [:min_pool_size] aumentar ArgumentError, "Otamanho mínimo de opções#{[:min_size]} não é idêntico ao tamanho mínimo do pool #{[:min_pool_size]}" end se [:max_size] && [:max_pool_size] && [:max_size] != [:max_pool_size] aumentar ArgumentError, "O tamanho máximo do conjunto#{[:max_size]} não é idêntico ao tamanho máximo do conjunto #{[:max_pool_size]}" end se [:wait_timeout] && [:wait_queue_timeout] && [:wait_timeout] != [:wait_queue_timeout] aumentar ArgumentError, "O tempo limite deespera #{[:wait_timeout]} não é idêntico ao tempo limite da fila de espera #{[:wait_queue_timeout]}" end [:min_size] ||= [:min_pool_size] .excluir(:min_pool_size) [:max_size] ||= [:max_pool_size] .excluir(:max_pool_size) se [:min_size] && [:max_size] && [:max_size] != 0 && [:min_size] > [:max_size] aumentar ArgumentError, "Não é possível fazer com que o tamanho mínimo #{[:min_size]} exceda o tamanho máximo #{[:max_size]}" end [:wait_timeout] ||= [:wait_queue_timeout] se [:wait_queue_timeout] .excluir(:wait_queue_timeout) @server = Servidor @opções = .congelar @generation_manager = GeraçãoManager.Novo(servidor: Servidor) @ready = false @closed = false # Uma conexão pertencente a esse pool deve estar na # array de conexões disponível (que é usada como uma pilha) # ou no conjunto de conexões verificadas. @available_connections = [] @checked_out_connections = definir.Novo @pending_connections = definir.Novo @interrupt_connections = [] # RUBY-3364: contar threads atualmente bloqueadas em size_cv / # max_connecting_cv. Quando não for zero, um thread recém-chegado deve # entrar na fila de espera mesmo que o predicado do portão esteja atualmente # satisfeito, para evitar barging além dos garçons existentes. @size_waiters = 0 @max_connecting_waiters = 0 # Mutex usado para sincronizar o acesso a @available_connections e # @checked_out_connections. O objeto de pool é seguro para thread, portanto # todos os métodos que recuperam ou modificam variáveis de instância em geral # deve fazer isso sob esta trava. @ bloqueio = Mutex.Novo # Thread em segundo plano responsável por manter o tamanho de # o pool para pelo menos min_size @populator = Populator.Novo(auto, ) @populate_semafore = Semáforo.Novo # Variável de condição para impor o primeiro check-in check_out: max_pool_size. # Esta variável de condição deve ser sinalizada quando o número de O número de conexões indisponíveis diminui (pending + pending_connections + # check_out_connections). @size_cv = mongo::CondiçãoVariável.Novo(@ bloqueio) # Isso representa o número de threads que ultrapassaram o size_cv # gate , mas não adquiriram uma conexão para adicionar às pending_connections #set. @connection_requests = 0 # Variável de condição para impor o segundo check-in check_out: max_connecting. # Essa variável de condição deve ser sinalizada quando o número de pendentes # conexões diminui. @max_connecting_cv = mongo::CondiçãoVariável.Novo(@ bloqueio) @max_connecting = .buscar(:max_connecting, DEFAULT_MAX_CONNECTING) ObjectSpace.define_finalizer(auto, auto.classe.finalizar(@available_connections, @pending_connections, @populator)) publish_cmap_event( Monitoramento::Evento::Cmap::PoolCreated.Novo(@server.endereço, , auto) ) end |
Detalhes do atributo da instância
#geration_manager ➤ inteiro (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 geração de conexões atualmente em uso pela fila.
240 241 242 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 240 def geration_manager @generation_manager end |
#max_connecting ➤ Objeto (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.
349 350 351 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 349 def max_connecting @max_connecting end |
#opções ➤ Hash (somente leitura)
Retorna opções As opções do pool.
187 188 189 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 187 def @opções end |
#populate_semafore ➤ Object (somente leitura)
Variável de condição transmitida quando o tamanho do grupo muda para ativar o preenchedor
57 58 59 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 57 def preenchimento_semafore @populate_semafore end |
#populator ➤ Objeto (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.
346 347 348 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 346 def populator @populator end |
#server ➤ Object (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.
190 191 192 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 190 def Servidor @server end |
Detalhes do método de classe
.finalizar(available_connections, pending_connections, _populator) ➤ Proc
Finalize o pool de conexões para a coleta de lixo.
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 854 def auto.finalizar(available_connections, pending_connections, _populator) proc fazer available_connections.cada fazer |Conexão| Conexão.desconecte-se!(razão: :pool_closed) end available_connections.Limpar pending_connections.cada fazer |Conexão| Conexão.desconecte-se!(razão: :pool_closed) end pending_connections.Limpar # O finalizador não fecha as conexões com check-out. # Esses teriam que ser coletados por conta própria # e isso deve fechá-los. end end |
Detalhes do método de instância
#available_count ➤ Inteiro
Número de conexões disponíveis no pool.
298 299 300 301 302 303 304 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 298 def available_count create_if_closed! @ bloqueio.sincronizar fazer @available_connections.Tamanho end end |
#check_in(connection) ➤ Object
Verifique uma conexão de volta ao pool.
A conexão deve ter sido criada anteriormente por esse pool.
425 426 427 428 429 430 431 432 433 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 425 def check_in(Conexão) check_invariants @ bloqueio.sincronizar fazer do_check_in(Conexão) end garantir check_invariants end |
#check_out(connection_global_id: nil, context: nil) ➤ Mongo::Server::Connection
Verifica uma conexão fora do pool.
Se houver conexões ativas no pool, a conexão usada mais recentemente será retornada. Caso contrário, se o tamanho do pool de conexões for menor que o tamanho máximo, crie uma nova conexão e a retorne. Caso contrário, aguarda até o tempo limite de espera e aumenta o Tempo limite::Error se ainda não houver conexões ativas e o pool estiver no tamanho máximo.
A conexão retornada conta para o tamanho máximo do pool. Quando o chamador terminar de usar a conexão, a conexão deve ser verificada novamente por meio do método check_in.
373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 373 def check_out(connection_global_id: nada, contexto: nada) check_invariants publish_cmap_event( Monitoramento::Evento::Cmap::connectionCheckOutStarted.Novo(@server.endereço) ) create_if_pool_closed! create_if_pool_paused_locked! Conexão = retrieve_and_connect_connection( connection_global_id, Contexto ) publish_cmap_event( Monitoramento::Evento::Cmap::connectionCheckedOut.Novo(@server.endereço, Conexão.id, auto) ) se Lint.habilitado? && !Conexão.conectado? aumentar Erro::LintError, "O pool de conexões para #{endereço} verificou uma conexão desconectada #{conexão.geração}:#{conexão.ID}" end Conexão garantir check_invariants end |
#check_out_pinned_connection(connection_global_id) ⇒ Conexão | nada
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 conexão fixada que já foi verificada, se houver com o ID global fornecido. Caso contrário, retorna zero.
410 411 412 413 414 415 416 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 410 def check_out_pinned_connection(connection_global_id) @ bloqueio.sincronizar fazer @checked_out_connections.detectar fazer |conn| conn.global_id == connection_global_id && conn.fixado? end end end |
#clear(options = nil) ➤ true
Fecha todas as conexões ociosas no pool e agenda as conexões atualmente verificadas para serem fechadas quando forem verificadas novamente no pool. O pool está pausado, ele não criará novas conexões em segundo plano e falhará nas solicitações de checkout até ser marcado como pronto.
545 546 547 548 549 550 551 552 553 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 545 def Limpar( = nada) create_if_closed! se Lint.habilitado? && !@server.desconhecido? aumentar Erro::LintError, "Tentando limpar o pool do servidor #{@ servidor.resume} que é conhecido" end do_clear() end |
#close(options = nil) ➤ true
Marca o pool como fechado, fecha todas as conexões ociosas no pool e agenda as conexões atualmente verificadas para serem fechadas quando forem verificadas novamente no pool. Se a opção force for verdadeira, as conexões verificadas também serão fechadas. As tentativas de usar o pool depois que ele for fechado aumentarão o Error::PoolClosedError.
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 667 def Fechar( = nada) Método se fechado? ||= {} stop_populator @ bloqueio.sincronizar fazer até que @available_connections.vazio? Conexão = @available_connections.Pop Conexão.desconecte-se!(razão: :pool_closed) end se [:force] até que @checked_out_connections.vazio? Conexão = @checked_out_connections.levar(1).primeiro Conexão.desconecte-se!(razão: :pool_closed) @checked_out_connections.excluir(Conexão) end end a menos que && [:stay_ready] # marcar o pool como fechado antes de liberar a bloqueio então # nenhuma conexão pode ser criada, fazer check-in ou check-out @closed = true @ready = false end @max_connecting_cv.transmissão @size_cv.transmissão @generation_manager.close_all_pipes end publish_cmap_event( Monitoramento::Evento::Cmap::PoolClosed.Novo(@server.endereço, auto) ) true end |
#close_idle_sockets ➤ Objeto
Feche os soquetes que estiverem abertos por mais tempo do que o tempo ocioso máximo, se a opção estiver definida.
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 777 def close_idle_sockets Método se fechado? Método a menos que max_idle_time @ bloqueio.sincronizar fazer i = 0 enquanto i < @available_connections.Tamanho Conexão = @available_connections[i] se (last_checkin = Conexão.last_checkin) && ((Hora.agora - last_checkin) > max_idle_time) Conexão.desconecte-se!(razão: :idle) @available_connections.delete_at(i) @populate_semafore.sinal próximo end i += 1 end end end |
#fechado? ➤ verdadeiro | false
Se o pool foi fechado.
311 312 313 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 311 def fechado? !!@closed end |
#desconectar!(options = nil) ➤ 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.
Desconecta o pool.
Faz tudo o que clear faz, exceto se o pool estiver fechado que esse método não faça nada além clear aumentaria PoolClosedError.
562 563 564 565 566 567 568 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 562 def desconecte-se!( = nada) do_clear() salvar Erro::PoolClosedError # O estado "desconectado" está entre fechado e pausado. # Quando estivermos tentando desconectar o pool, permita que o pool seja # já fechado. end |
#do_check_in(connection) ➤ Object
Executa o check-in depois de já ter adquirido a trava.
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 438 def do_check_in(Conexão) # Quando uma conexão é interrompida, ela é verificada novamente no pool # e fechado. A operação que estava usando a conexão antes de ser # interrompido tentará verificá-lo novamente no pool e nós # deve ignorá-lo, pois ele já foi fechado e removido do pool. Método se Conexão.fechado? && Conexão.interrompido? a menos que Conexão.connection_pool == auto aumentar ArgumentError, "Tentando fazer check-in de uma conexão que não foi verificada por este pool: #{connection} fez check-out do pool #{connection.connection_pool} (para #{self})" end a menos que @checked_out_connections.incluir?(Conexão) aumentar ArgumentError, "Tentando fazer check-in de uma conexão que não está atualmente em check-out por este pool: #{connection} (for #{self})" end # Observação: se um manipulador de evento gerar um alerta, o recurso não será sinalizado. # Isso significa que threads esperando uma conexão para liberar quando # o pool está no tamanho máximo pode atingir o tempo limite. # Threads que começam a esperar após a conclusão deste método (com # a exceção) deve funcionar bem. @checked_out_connections.excluir(Conexão) @size_cv.sinal publish_cmap_event( Monitoramento::Evento::Cmap::connectionCheckedIn.Novo(@server.endereço, Conexão.id, auto) ) se Conexão.interrompido? Conexão.desconecte-se!(razão: :stale) Método end se Conexão.erro? Conexão.desconecte-se!(razão: :error) Método end se fechado? Conexão.desconecte-se!(razão: :pool_closed) Método end se Conexão.fechado? # A conexão foi fechada , por exemplo, porque sofria # um erro de rede. Nada mais precisa ser feito aqui. @populate_semafore.sinal elsif Conexão.geração != geração(service_id: Conexão.service_id) && !Conexão.fixado? # Se a conexão estiver marcada como fixada, ela será usada por uma transação # ou uma série de operações do cursor em uma configuração de carga balanceada. # Nesse caso, a conexão não deve ser desconectada até # desafixado. Conexão.desconecte-se!(razão: :stale) @populate_semafore.sinal mais Conexão.record_checkin! @available_connections << Conexão @max_connecting_cv.sinal end end |
#do_clear(options = nil) ➤ Objeto
570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 570 def do_clear( = nada) check_invariants service_id = && [:service_id] @ bloqueio.sincronizar fazer # A geração deve ser aumentada antes de emitir um evento de limpeza do pool. @generation_manager.bump(service_id: service_id) close_available_connections(service_id) a menos que && [:lazy] se && [:interrupt_in_use_connections] agendamento_for_interruption(@checked_out_connections, service_id) agendamento_for_interruption(@pending_connections, service_id) end se @ready publish_cmap_event( Monitoramento::Evento::Cmap::PoolLimpo.Novo( @server.endereço, service_id: service_id, interrupt_in_use_connections: &.[](:interrupt_in_use_connections) ) ) # Pause o pool de conexões apenas se o servidor estiver marcado como desconhecido, # caso contrário, permitir que a nova tentativa seja tentada com um pool pronto. do_pause se !@server.load_balancer? && @server.desconhecido? end # Transmitir aqui para fazer com que todos os threads que aguardam no máximo # conectando para sair do loop de espera e erro. @max_connecting_cv.transmissão # Transmitir aqui para fazer com que todos os threads que aguardam o tamanho do pool # para sair do loop de espera e erro. @size_cv.transmissão end # "Agende o thread em segundo plano" após a limpeza. Isto é responsável # para limpar threads obsoletos e interromper conexões em uso. @populate_semafore.sinal true garantir check_invariants end |
#do_pause ➤ 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.
Marque o pool de conexões como pausado sem adquirir a trava.
518 519 520 521 522 523 524 525 526 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 518 def do_pause se Lint.habilitado? && !@server.desconhecido? aumentar Erro::LintError, "Tentando pausar o pool do servidor #{@server.resume} que é conhecido" end Método a menos que @ready @ready = false end |
#inspecionar ➤ string
Obtenha uma inspeção de string bem impressa para a pool.
715 716 717 718 719 720 721 722 723 724 725 726 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 715 def inspecionar se fechado? "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} fechado>" elsif !pronto? "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} pausado>" mais "#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " + "wait_timeout=#{wait_timeout} current_size=#{tamanho} disponível=#{available_count}>" end end |
#max_idle_time ➤ Flutuante | nada
O máximo de segundos que um soquete pode permanecer inativo desde que fez check-in no pool, se definido.
235 236 237 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 235 def max_idle_time @max_idle_time ||= [:max_idle_time] end |
#max_size ⇒ Integer
Obtenha o tamanho máximo do pool de conexões.
200 201 202 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 200 def max_size @max_size ||= [:max_size] || [ DEFAULT_MAX_SIZE, min_size ].max end |
#min_size ⇒ Integer
Obtenha o tamanho mínimo do pool de conexões.
209 210 211 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 209 def min_size @min_size ||= [:min_size] || DEFAULT_MIN_SIZE end |
#pausa ➤ Objeto
Marque o pool de conexões como pausado.
503 504 505 506 507 508 509 510 511 512 513 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 503 def pausa create_if_closed! check_invariants @ bloqueio.sincronizar fazer do_pause end garantir check_invariants end |
#pausado? ➤ verdadeiro | false
Um pool de conexões será pausado se não estiver fechado e não estiver pronto.
253 254 255 256 257 258 259 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 253 def pausado? create_if_closed! @ bloqueio.sincronizar fazer !@ready end end |
#preencher ➤ verdadeiro | false
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.
Este método faz três coisas:
- Cria e adiciona uma conexão ao pool, se o tamanho do pool estiver abaixo de min_size. Tenta novamente uma vez se um erro relacionado ao soquete for encontrado durante esse processo e aumenta se ocorrer um segundo erro ou se ocorrer um erro não relacionado ao soquete.
- Remove conexões obsoletas do pool de conexões.
- Interrompe conexões marcadas para interrupção.
Usado pelo thread de background do pool populator.
ocorreu, ou o erro não relacionado ao soquete
833 834 835 836 837 838 839 840 841 842 843 844 845 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 833 def preencher Método false se fechado? começar Método create_and_add_connection salvar Erro::Erro de soquete, Erro::SocketTimeoutError => e # foi encontrado um erro ao conectar a conexão, # ignore este primeiro erro e tente novamente. log_service("O preenchimento falhou ao conectar uma conexão para #{endereço}: #{e.classe}: #{e}. Ele tentará novamente.") end create_and_add_connection end |
#pronto ➤ Objeto
Instrui o pool a criar e retornar conexões.
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 616 def pronto create_if_closed! # TODO: Adicione isto de volta no RUBY-3174. # se Lint.enabled? # a menos que o servidor.connected? # create Error::LintError, "Tentando preparar um pool para o servidor #{@ servidor.summary} que está desconectado" # end # end @ bloqueio.sincronizar fazer Método se @ready @ready = true end # Observe que a especificação do CMAP exige serialização de eventos do CMAP para um # pool. Para implementar isso, a publicação de eventos deve ser feita em # uma fila que é sincronizada, em vez de assinantes serem invocados # do método de trigger como este aqui in-line. Na MRI, assumindo # os threads rendem a outros quando param de ter trabalho a fazer, é # provável que os eventos, na prática, sempre sejam publicados no # pedido necessário. JRuby, sendo realmente simultâneo com threads do sistema operacional, # não ofereceria essa garantia. publish_cmap_event( Monitoramento::Evento::Cmap::PoolReady.Novo(@server.endereço, , auto) ) Método a menos que .buscar(:populator_io, true) se @populator.executando? @populate_semafore.sinal mais @populator.corra! end end |
#pronto? ➤ verdadeiro | false
Se o pool está pronto.
318 319 320 321 322 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 318 def pronto? @ bloqueio.sincronizar fazer @ready end end |
#tamanho ➤ Inteiro
Tamanho do pool de conexões.
Inclui conexões disponíveis e verificadas.
268 269 270 271 272 273 274 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 268 def Tamanho create_if_closed! @ bloqueio.sincronizar fazer unsynchronized_size end end |
#estado ⇒ Hash
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 estatísticas sobre o estado interno do pool de conexões, principalmente para fins de teste e depuração.
878 879 880 881 882 883 884 885 886 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 878 def state @ bloqueio.sincronizar fazer { available_connections: @available_connections.Tamanho, checked_out_connections: @checked_out_connections.Tamanho, pending_connections: @pending_connections.Tamanho, interrupt_connections: @interrupt_connections.Tamanho, connection_requests: @connection_requests } end end |
#stop_populator ➤ 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.
Pare o thread do preenchedor em segundo plano e limpe todas as conexões criadas que ainda não foram conectadas.
Usado ao fechar o pool ou ao encerrar o thread bg para fins de teste. No último caso, este método deve ser chamado antes do pool ser usado, para garantir que nenhuma conexão em pending_connections tenha sido criada em fluxo pelo método check_out.
805 806 807 808 809 810 811 812 813 814 815 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 805 def stop_populator @populator.pare! @ bloqueio.sincronizar fazer # Se stop_populator for chamado enquanto o preenchimento estiver em execução, pode haver # conexões esperando para serem conectadas, conexões que ainda não foram # foi movido para available_connections ou conexões movidas para available_connections # mas não excluído de pending_connections. Estes devem ser limpos. clear_pending_connections end end |
#resumo ➤ Objeto
Este método é experimental e sujeito a alterações.
328 329 330 331 332 333 334 335 336 337 338 339 340 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 328 def Resumo @ bloqueio.sincronizar fazer state = se fechado? 'fechado' elsif !@ready 'pausa' mais 'pronto' end "#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " + "usado=#{@checked_out_connections.comprimento} aproveitar=#{@available_connections.comprimento} pending=#{@pending_connections.comprimento} #{estado}>" end end |
#unavailable_connections ➤ Inteiro
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 número de conexões indisponíveis no pool. Usado para calcular se atingimos max_pool_size.
289 290 291 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 289 def unavailable_connections @checked_out_connections.Tamanho + @pending_connections.Tamanho + @connection_requests end |
#wait_timeout(context = nil) ⇒ Float
O tempo de espera, em segundos, para que uma conexão fique disponível.
221 222 223 224 225 226 227 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 221 def wait_timeout(Contexto = nada) se Contexto&.remaining_timeout_sec.nada? [:wait_timeout] || DEFAULT_WAIT_TIMEOUT mais Contexto&.remaining_timeout_sec end end |
#with_connection(connection_global_id: nil, context: nil) ➤ Objeto
Entregue o bloco a uma conexão enquanto lida com a lógica de check-in/check-out.
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 |
# Arquivo 'lib/mongo/ servidor/connection_pool.rb', linha 738 def with_connection(connection_global_id: nada, contexto: nada) create_if_closed! # Se uma conexão específica for solicitada e já estiver verificada # e fixado (por exemplo, para uma transação ou cursor no modo de balanceamento de carga), # reutilize-o diretamente sem passar pelo ciclo check_out/check_in. se connection_global_id Conexão = @ bloqueio.sincronizar fazer @checked_out_connections.detectar fazer |conn| conn.global_id == connection_global_id && conn.fixado? end end end Conexão ||= check_out( connection_global_id: connection_global_id, contexto: Contexto ) rendimento(Conexão) salvar Erro::Erro de soquete, Erro::SocketTimeoutError, Erro::ConnectionPerished => e talvez_raise_pool_cleared!(Conexão, e) garantir se Conexão && !Conexão.fixado? # Não faça check-in se a conexão estiver fixada (a sessão ou o cursor # é o proprietário e fará o check-in mais tarde ao desafixar). Ignorar também # check-in se a conexão já tiver sido verificada durante o bloqueio # (por exemplo, por Session#unpin após um erro na primeira operação). check_out = @ bloqueio.sincronizar fazer @checked_out_connections.incluir?(Conexão) end check_in(Conexão) se check_out end end |