Classe: Mongo::Cluster::SdamFlow Privado

Herda:
Objeto
  • Objeto
mostrar tudo
Estendido por:
Encaminhável
Definido em:
lib/mongo/cluster/sdam_flow.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.

Lida com o fluxo SDAM para um evento alterado de descrição do servidor .

Atualiza descrições de servidor , descrições de topologia e publica eventos SDAM.

O SdamFlow deve ser instanciado uma vez para cada evento de alteração de descrição de servidor que precisa ser processado.

Recolhimento do Resumo do atributo de instância

Recolhimento do Resumo do método de instância

Detalhes do construtor

#initialize(cluster, anterior_desc, updated_desc, awaited: false) ➤ SdamFlow

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



30
31
32
33
34
35
36
37
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 30

def inicializar(cluster, anterior_desc, updated_desc, esperado: false)
  @cluster = cluster
  @topology = cluster.topologia
  @Original_desc = @previous_desc = anterior_desc
  @updated_desc = updated_desc
  @servers_to_disconnect = []
  @waited = !!esperado
end

Detalhes do atributo da instância

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



39
40
41
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 39

def cluster
  @cluster
end

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



39
40
41
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 39

def original_desc
  @Original_desc
end

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



39
40
41
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 39

def anterior_desc
  @previous_desc
end

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

A topologia armazenada neste atributo pode mudar várias vezes ao longo de um único fluxo de sdam (por exemplo desconhecido -> RS sem primário -> RS com primário). Os eventos para alteração de topologia são enviados no final do processamento de fluxo, de modo que o exemplo acima publica apenas um desconhecido -> RS com evento primário no aplicativo.

Retorna:

  • Mongo::Cluster::Topologia A topologia atual.



51
52
53
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 51

def topologia
  @topology
end

#updated_desc ➤ 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.



39
40
41
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 39

def updated_desc
  @updated_desc
end

Detalhes do método de instância

_

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.

Observação:

Os servidores são adicionados sem monitoramento. O monitoramento deve ser iniciado mais tarde

Adiciona todos os servidores referenciados na descrição fornecida (que deve ter origem em um bom primário) que ainda não estão no cluster, ao cluster.

separadamente.

Retorna:

  • (Array <Servidor MongoDB>)

    Servidores realmente adicionados ao cluster. Este é o conjunto de servidores no qual o monitoramento deve ser iniciado.



385
386
387
388
389
390
391
392
393
394
395
396
397
398
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 385

def add_servers_from_desc(updated_desc)
  adicionado_servidores = []
  %w[hosts Passivos Árbitros].cada fazer |m|
    updated_desc.enviar(m).cada fazer |endereço_str|
      se Servidor = cluster.adicionar(endereço_str, monitorar: false)
        adicionado_servidores << Servidor
      end
    end
  end

  verify_invariants

  adicionado_servidores
end

#esperado?Booleano

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:

  • (Booleano)


53
54
55
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 53

def esperado?
  @waited
end

#torne-se_unknown?Booleano

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 se o servidor cuja descrição esse fluxo processou não era desconhecido anteriormente e agora é. Usado para decidir, em particular, se deseja limpar o pool de conexões do servidor.

Retorna:

  • (Booleano)


611
612
613
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 611

def tornou-se_unknown?
  updated_desc.desconhecido? && !original_desc.desconhecido?
end

#check_if_has_primary ➤ 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.

Verifica se o cluster tem um primary e, caso contrário, transita a topologia para ReplicaSetNoPrimary. A topologia deve ser ReplicaSetWithPrimary ao invocar este método.



565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 565

def check_if_has_primary
  a menos que topologia.replica_set?
    aumentar ArgumentError,
          "check_if_has_primary só deve ser chamado quando a topologia é conjunto de réplicas, mas é #{topologia.classe.nome.sub(/.*::/,
                                                                                                                        '')}"
  end

  Principal = server_list.detectar fazer |Servidor|
    # Um primário com o nome de conjunto errado não é um primário
    Servidor.primário? && Servidor.Descrição.replica_set_name == topologia.replica_set_name
  end
  Método se Principal

  @topology = topologia::ReplicaSetNoPrimary.Novo(
    topologia.opções, topologia.Monitoramento, auto
  )
end

#commit_changes ➤ 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.

Publica eventos alterados de descrição do servidor , atualiza a topologia no cluster e publica evento alterados de topologia , conforme necessário com base nas operações executadas durante o processamento de fluxo SDAM.



499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 499

def commit_changes
  # A sequência de eventos visível ao aplicativo deve ser a seguinte:
  #
  # 1. alteração de descrição do servidor que estamos processando;
  # 2. Alteração de topologia, se houver;
  # 3. Alterações de descrição para outros servidores, se houver.
  #
  # A parte difícil aqui é que as alterações na descrição do servidor são
  # nem todos processados juntos.

  publish_description_change_event
  start_pool_if_data_Bearing

  topology_changed_event_published = false
  se !topologia.igual?(cluster.topologia) || @need_topology_changed_event
    # Estamos prestes a publicar um evento de topologia alterada.
    # Recrie a instância de topologia para obter suas descrições de servidor
    # atualizado.
    @topology = topologia.classe.Novo(topologia.opções, topologia.Monitoramento, cluster)
    # Isso envia o evento SDAM
    cluster.update_topology(topologia)
    topology_changed_event_published = true
    @need_topology_changed_event = false
  end

  # Se a descrição de um servidor for alterada, o evento de alteração da descrição de topologia
  # deve ser publicado com as topologias anterior e seguinte sendo de
  # o mesmo tipo, a menos que já tenhamos publicado o evento de alteração de topologia
  Método se topology_changed_event_published

  Método se updated_desc.desconhecido? && anterior_desc.desconhecido?
  Método se updated_desc.igual?(anterior_desc)

  Método a menos que topology_efetivamente_changed?

  # Se estamos aqui, houve uma alteração nas descrições do servidor
  # em nossa topologia, mas a classe de topologia não mudou.
  # Publicar o evento de topologia alterada e recriar a topologia para
  # obtenha a nova lista de descrições de servidores nela.
  @topology = topologia.classe.Novo(topologia.opções, topologia.Monitoramento, cluster)
  # Isso envia o evento SDAM
  cluster.update_topology(topologia)
end

#connect_serverObjeto

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.



543
544
545
546
547
548
549
550
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 543

def connect_servers
  enquanto Servidor = @servers_to_disconnect.mudança
    se Servidor.conectado?
      # Não publique evento fechado de servidor, pois isso já foi feito
      Servidor.desconecte-se!
    end
  end
end

#do_remove(address_str) ➤ 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.

Remove o servidor especificado da topologia e avisa se a topologia terminar com uma lista de servidores vazia como resultado



430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 430

def do_remove(endereço_str)
  Servidores = cluster.remover(endereço_str, desconectar: false)
  Servidores.cada fazer |Servidor|
    # Limpe a descrição para que o servidor seja marcado como desconhecido.
    Servidor.clear_description

    # Precisamos publicar o evento fechado do servidor aqui, mas não podemos fechar
    # o servidor porque pode ser o servidor que possui o monitor em
    # cujo thread esse fluxo está executando atualmente, caso em que o fechamento
    # o servidor pode encerrar o thread e deixar o processamento SDAM
    # incompleto. Portanto, temos que remover o servidor do cluster,
    # publicar o evento, mas não chamar a desconexão no servidor até
    # no final quando todo o processamento tiver sido concluído.
    publish_sdam_event(
      mongo::Monitoramento::SERVER_Closed,
      mongo::Monitoramento::Evento::Servidor fechado.Novo(Servidor.endereço, cluster.topologia)
    )
  end
  @servers_to_disconnect += Servidores
  Método a menos que server_list.vazio?

  log_service(
    'A topologia agora não tem servidores - essa é provavelmente uma configuração incorreta do cluster e/ou do aplicativo'
  )
end

#publish_description_change_event ➤ 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.



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
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 456

def publish_description_change_event
  # Este método pode ser invocado quando a descrição do servidor for definitivamente alterada
  # mas antes da atualização da topologia. Portanto, verificamos ambos
  # alterações na descrição do servidor e alterações gerais na topologia. Quando isso
  método # é chamado no final do fluxo SDAM como parte de "alterações de confirmação"
  # etapa, a alteração da descrição do servidor é incorporada na topologia
  # change.
  Método a menos que @server_description_changed || topology_efetivamente_changed?

  # updated_desc aqui pode não ser a descrição que passamos
  # o servidor - no caso de um primário obsoleto, o servidor se autodeclarou
  # como sendo primary, mas updated_desc aqui será desconhecido.

  # Costumvamos não notificar sobre alterações de servidor Desconhecidas -> Desconhecidas.
  # Técnicamente, estas são mudanças de estado válidas (ou pelo menos tão válidas quanto
  # outras descrições de servidor mudam quando a descrição não
  # mudou significativamente, mas os eventos ainda são publicados).
  # A versão atual do driver notifica em Desconhecido -> Desconhecido
  # transições.

  # Evite enviar eventos quando a descrição atualizada for a mesma de
  # descrição anterior. Isso permite que esse método seja chamado de múltiplo
  # horários no fluxo em que os eventos devem ser publicados, sem
  # se preocupar se há alguma alteração não publicada.
  Método se updated_desc.igual?(anterior_desc)

  publish_sdam_event(
    ::mongo::Monitoramento::SERVER_DESCRIPTION_CHANGED,
    ::mongo::Monitoramento::Evento::ServerDescriptionChanged.Novo(
      updated_desc.endereço,
      topologia,
      anterior_desc,
      updated_desc,
      esperado: esperado?
    )
  )
  @previous_desc = updated_desc
  @need_topology_changed_event = true
end

#removerObjeto

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.

Remove o servidor cuja descrição estamos processando da topologia.



423
424
425
426
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 423

def remover
  publish_description_change_event
  do_remove(updated_desc.endereço.to_s)
end

#remove_servers_not_in_desc(updated_desc) ➤ Object

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.

Remove servidores da topologia que não estão presentes na descrição do servidor fornecido (que deve ter origem de um bom primário).



403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 403

def remove_servers_not_in_desc(updated_desc)
  updated_desc_address_strs = %w[hosts Passivos Árbitros].map fazer |m|
    updated_desc.enviar(m)
  end.achatar
  server_list.cada fazer |Servidor|
    próximo se updated_desc_address_strs.incluir?(endereço_str = Servidor.endereço.to_s)

    updated_host = updated_desc.endereço.to_s
    updated_host += " (auto-identificado como #{updated_desc.me})" se updated_desc.eu && updated_desc.eu != updated_host
    log_service(
      "Removendo servidor #{endereço_str} porque não está em hosts relatados pelo primário " +
      "#{updated_host}. Os hosts relatados são: " +
      updated_desc.hosts.juntar(', ')
    )
    do_remove(endereço_str)
  end
end

#server_description_changed ➤ 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.



85
86
87
88
89
90
91
92
93
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
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
185
186
187
188
189
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 85

def server_description_changed
  @previous_server_descriptions = server_list.map fazer |Servidor|
    [ Servidor.endereço.to_s, Servidor.Descrição ]
  end

  a menos que update_server_descriptions
    # Todas as transições exigem que o servidor cujo updated_desc estamos
    # o processamento ainda está no cluster (ou seja, não foi removido como resultado
    # de processamento de outra resposta, potencialmente simultaneamente).
    # Se update_server_descriptions retornou falso, não temos servidores
    # na topologia da descrição que estamos processando, pare.
    Método
  end

  caso topologia
  quando topologia::loadBalanced
    @updated_desc = ::mongo::Servidor::Descrição::balanceador de carga.Novo(
      updated_desc.endereço
    )
    update_server_descriptions
  quando topologia::Single
    se topologia.replica_set_name && (updated_desc.replica_set_name != topologia.replica_set_name)
      log_service(
        "O servidor #{updated_desc. endereço} tem um nome do conjunto de réplica incorreto' #{updated_desc.replica_set_name} '; esperado '#{topologia.replica_set_name} '"
      )
      @updated_desc = ::mongo::Servidor::Descrição.Novo(
        updated_desc.endereço,
        {},
        average_round_trip_time: updated_desc.average_round_trip_time,
        minimum_round_trip_time: updated_desc.minimum_round_trip_time
      )
      update_server_descriptions
    end
  quando topologia::Desconhecido
    se updated_desc.autônomo?
      update_unknown_with_standalone
    elsif updated_desc.mongos?
      @topology = topologia::Fragmentado.Novo(topologia.opções, topologia.Monitoramento, auto)
    elsif updated_desc.primário?
      @topology = topologia::ReplicaSetWithPrimary.Novo(
        topologia.opções.mesclar(replica_set_name: updated_desc.replica_set_name),
        topologia.Monitoramento, auto
      )
      update_rs_from_primary
    elsif updated_desc.secundário? || updated_desc.árbitro? || updated_desc.outro?
      @topology = topologia::ReplicaSetNoPrimary.Novo(
        topologia.opções.mesclar(replica_set_name: updated_desc.replica_set_name),
        topologia.Monitoramento, auto
      )
      update_rs_without_primary
    end
  quando topologia::Fragmentado
    a menos que updated_desc.desconhecido? || updated_desc.mongos?
      log_service(
        "Removendo servidor #{updated_desc. endereço} porque é do tipo errado (#{updated_desc.server_type. to_s.upcase}) - esperado fragmentado"
      )
      remover
    end
  quando topologia::ReplicaSetWithPrimary
    se updated_desc.autônomo? || updated_desc.mongos?
      log_service(
        "Removendo servidor #{updated_desc.address} porque é do tipo errado (#{updated_desc.server_type.to_s.upcase}) - espera-se um nó do conjunto de réplicas"
      )
      remover
      check_if_has_primary
    elsif updated_desc.primário?
      update_rs_from_primary
    elsif updated_desc.secundário? || updated_desc.árbitro? || updated_desc.outro?
      update_rs_with_primary_from_member
    mais
      check_if_has_primary
    end
  quando topologia::ReplicaSetNoPrimary
    se updated_desc.autônomo? || updated_desc.mongos?
      log_service(
        "Removendo servidor #{updated_desc.address} porque é do tipo errado (#{updated_desc.server_type.to_s.upcase}) - espera-se um nó do conjunto de réplicas"
      )
      remover
    elsif updated_desc.primário?
      # Aqui, mudamos o tipo de topologia para RS com primário, no entanto
      # durante o processamento updated_desc podemos descobrir que seu nome RS
      #não corresponde ao nosso nome RS existente. Por esta razão
      # é obrigatório NÃO passar o nome RS de updated_desc para
      # construtor de topologia aqui.
      # Durante o processamento, podemos remover o servidor cuja updated_desc
      # que estamos processando (por exemplo, o caso de incompatibilidade do nome RS de novo),
      # Nesse caso, o tipo de topologia voltará para RS sem primário
      # na etapa check_if_has_primary.
      @topology = topologia::ReplicaSetWithPrimary.Novo(
        # Não passe o nome RS de updated_desc aqui
        topologia.opções,
        topologia.Monitoramento, auto
      )
      update_rs_from_primary
    elsif updated_desc.secundário? || updated_desc.árbitro? || updated_desc.outro?
      update_rs_without_primary
    end
  mais
    aumentar ArgumentError, "Topologia desconhecida #{topologia.classe}"
  end

  verify_invariants
  commit_changes
  connect_servers
end

#stale_primary?Booleano

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.

Se updated_desc é para um primary obsoleto.

Retorna:

  • (Booleano)


584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 584

def stale_primary?
  se updated_desc.max_wire_version >= 17
    Método true se updated_desc.election_id.nada? && !topologia.max_election_id.nada?
    se updated_desc.election_id && topologia.max_election_id && updated_desc.election_id < topologia.max_election_id
      Método true
    end

    se updated_desc.election_id == topologia.max_election_id
      Método true se updated_desc.set_version.nada? && !topologia.max_set_version.nada?
      se updated_desc.set_version && topologia.max_set_version && updated_desc.set_version < topologia.max_set_version
        Método true
      end
    end
  elsif updated_desc.election_id && updated_desc.set_version
    se topologia.max_set_version && topologia.max_election_id &&
       (updated_desc.set_version < topologia.max_set_version ||
           (updated_desc.set_version == topologia.max_set_version &&
               updated_desc.election_id < topologia.max_election_id))
      Método true
    end
  end
  false
end

#start_pool_if_data_support

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.

Se o servidor que está sendo processado for identificado como portador de dados, cria o pool de conexões do servidor para que ele possa começar a preencher



554
555
556
557
558
559
560
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 554

def start_pool_if_data_Bearing
  Método a menos que updated_desc.data_Bearing?

  server_list.cada fazer |Servidor|
    Servidor.pool se Servidor.endereço == @updated_desc.endereço
  end
end

#topology_efetivamente_changed?Booleano

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 se a topologia foi alterada significativamente como resultado da execução do fluxo de SDAM.

A especificação define a igualdade de topologia por meio da igualdade de tipos de topologia e descrições de servidor em cada topologia; essa definição não pode ser usada por nós porque nossos objetos de topologia não contêm descrições de servidor e, em vez disso, são "vivos". Portanto, temos que armazenar a lista completa de descrições de servidor no início do fluxo SDAM e compará-las com as atuais.

Retorna:

  • (Booleano)


624
625
626
627
628
629
630
631
632
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 624

def topology_efetivamente_changed?
  Método true a menos que topologia.igual?(cluster.topologia)

  server_descriptions = server_list.map fazer |Servidor|
    [ Servidor.endereço.to_s, Servidor.Descrição ]
  end

  @previous_server_descriptions != server_descriptions
end

#update_rs_from_primary ➤ 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.

Atualiza a topologia , que deve ser um ReplicaSetWithPrimary, com informações da descrição do servidor principal.

Este método não altera o tipo de topologia para ReplicaSetWithPrimary - isso precisa ter sido feito antes de chamar esse método.

Se o primário cuja descrição está sendo processada for determinado como obsoleto, esse método alterará a descrição do servidor e o tipo de topologia para desconhecido.



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 215

def update_rs_from_primary
  se topologia.replica_set_name.nada?
    @topology = topologia::ReplicaSetWithPrimary.Novo(
      topologia.opções.mesclar(replica_set_name: updated_desc.replica_set_name),
      topologia.Monitoramento, auto
    )
  end

  se topologia.replica_set_name != updated_desc.replica_set_name
    log_service(
      "Removendo o servidor #{updated_desc.endereço} porque tem um " +
      "nome incorreto do conjunto de réplicas '#{updated_desc.replica_set_name}'; " +
      "expected '#{topology.replica_set_name}'"
    )
    remover
    check_if_has_primary
    Método
  end

  se stale_primary?
    @updated_desc = ::mongo::Servidor::Descrição.Novo(
      updated_desc.endereço,
      {},
      average_round_trip_time: updated_desc.average_round_trip_time,
      minimum_round_trip_time: updated_desc.minimum_round_trip_time
    )
    update_server_descriptions
    check_if_has_primary
    Método
  end

  se updated_desc.max_wire_version >= 17
    @topology = topologia::ReplicaSetWithPrimary.Novo(
      topologia.opções.mesclar(
        max_election_id: updated_desc.election_id,
        max_set_version: updated_desc.set_version
      ), topologia.Monitoramento, auto
    )
  mais
    max_election_id = topologia.new_max_election_id(updated_desc)
    max_set_version = topologia.new_max_set_version(updated_desc)

    se max_election_id != topologia.max_election_id ||
       max_set_version != topologia.max_set_version
      @topology = topologia::ReplicaSetWithPrimary.Novo(
        topologia.opções.mesclar(
          max_election_id: max_election_id,
          max_set_version: max_set_version
        ), topologia.Monitoramento, auto
      )
    end
  end

  # Neste ponto, aceitamos a descrição atualizada do servidor
  # e a topologia (ambos são primary). Comprometa essas alterações para que
  # seus respectivos eventos SDAM são publicados antes dos eventos SDAM para
  # adições/remoções de servidores que seguem
  publish_description_change_event

  server_list.cada fazer |Servidor|
    próximo a menos que Servidor.endereço != updated_desc.endereço

    próximo a menos que Servidor.primário?

    Servidor.update_description(
      ::mongo::Servidor::Descrição.Novo(
        Servidor.endereço,
        {},
        average_round_trip_time: Servidor.Descrição.average_round_trip_time,
        minimum_round_trip_time: updated_desc.minimum_round_trip_time
      )
    )
  end

  Servidores = add_servers_from_desc(updated_desc)
  remove_servers_not_in_desc(updated_desc)

  check_if_has_primary

  Servidores.cada fazer |Servidor|
    Servidor.start_monitoring
  end
end

#update_rs_with_primary_from_memberObject

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.

Atualiza uma topologia ReplicaSetWithPrimary de um membro não primário.



300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 300

def update_rs_with_primary_from_member
  se topologia.replica_set_name != updated_desc.replica_set_name
    log_service(
      "Removendo o servidor #{updated_desc.endereço} porque tem um " +
      "nome do conjunto de réplicas incorreto (#{updated_desc.replica_set_name}); " +
      "o nome do conjunto atual é #{topology.replica_set_name}"
    )
    remover
    check_if_has_primary
    Método
  end

  se updated_desc.me_mismatch?
    log_service(
      "Removendo o servidor #{updated_desc. endereço} porque " +
      "se reportou como #{updated_desc.me}"
    )
    remover
    check_if_has_primary
    Método
  end

  has_primary = false
  server_list.cada fazer |Servidor|
    se Servidor.primário?
      has_primary = true
      intervalo
    end
  end

  Método se has_primary

  @topology = topologia::ReplicaSetNoPrimary.Novo(
    topologia.opções, topologia.Monitoramento, auto
  )
end

#update_rs_without_primary ➤ 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.

Atualiza uma topologia ReplicaSetNoPrimary de um membro não primário.



338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 338

def update_rs_without_primary
  se topologia.replica_set_name.nada?
    @topology = topologia::ReplicaSetNoPrimary.Novo(
      topologia.opções.mesclar(replica_set_name: updated_desc.replica_set_name),
      topologia.Monitoramento, auto
    )
  end

  se topologia.replica_set_name != updated_desc.replica_set_name
    log_service(
      "Removendo o servidor #{updated_desc.endereço} porque tem um " +
      "nome do conjunto de réplicas incorreto (#{updated_desc.replica_set_name}); " +
      "o nome do conjunto atual é #{topology.replica_set_name}"
    )
    remover
    Método
  end

  publish_description_change_event

  Servidores = add_servers_from_desc(updated_desc)

  commit_changes

  Servidores.cada fazer |Servidor|
    Servidor.start_monitoring
  end

  Método a menos que updated_desc.me_mismatch?

  log_service(
    "Removendo o servidor #{updated_desc. endereço} porque " +
    "se reportou como #{updated_desc.me}"
  )
  remover
  nada
end

#update_server_descriptionsObjeto

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.

Atualiza descrições em todos os servidores cujo endereço corresponde ao endereço updated_desc.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 61

def update_server_descriptions
  server_list.cada fazer |Servidor|
    próximo a menos que Servidor.endereço == updated_desc.endereço
    # O fluxo SDAM deve ser executado quando a versão de topologia na nova descrição
    # é igual à versão de topologia atual, de acordo com o exemplo em
    # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md#what-is-the-purpose-of-topologyversion
    Método false a menos que updated_desc.topology_version_gte?(Servidor.Descrição)

    @server_description_changed = Servidor.Descrição != updated_desc

    # Sempre atualize a descrição do servidor , para que os campos que não
    # afetam comparações de igualdade de descrição, mas fazem parte do
    # descrição está atualizada.
    Servidor.update_description(updated_desc)
    Servidor.update_last_scan

    # Se não houver diferença de conteúdo entre as descrições,
    # ainda precisa executar o fluxo sdam, mas se o fluxo não produzir alterações
    # na topologia , omitiremos o envio de eventos.
    Método true
  end
  false
end

#update_unknown_with_standalone ➤ 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.

Transições de desconhecido para tipo de topologia único, quando um servidor independente é descoberto.



193
194
195
196
197
198
199
200
201
202
203
204
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 193

def update_unknown_with_standalone
  se sementes.Tamanho == 1
    @topology = topologia::Single.Novo(
      topologia.opções, topologia.Monitoramento, auto
    )
  mais
    log_service(
      "Removendo o servidor #{updated_desc. endereço} porque é autônomo e temos várias sementes (#{seeds.comprimento})"
    )
    remover
  end
end

#verify_invariants ➤ 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.



634
635
636
637
638
639
640
641
# Arquivo 'lib/mongo/cluster/sdam_flow.rb', linha 634

def verify_invariants
  Método a menos que mongo::Lint.habilitado?
  Método a menos que cluster.topologia.único?
  Método a menos que cluster.server_list.Tamanho > 1

  aumentar mongo::Erro::LintError,
        "Tentando criar uma única topologia com vários servidores: #{cluster.server_list}"
end