Classe: Mongo::Cluster::SdamFlow Privado

Herda:
Objeto
  • Objeto
mostrar tudo
Estendido por:
Encaminhável
Definido em:
build/ruby-driver-v2.19/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.



31
32
33
34
35
36
37
38
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 31

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.



40
41
42
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 40

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.



56
57
58
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 56

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.



54
55
56
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 54

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.



52
53
54
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 52

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.



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

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.



374
375
376
377
378
379
380
381
382
383
384
385
386
387
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 374

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)


58
59
60
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 58

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)


618
619
620
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 618

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.



570
571
572
573
574
575
576
577
578
579
580
581
582
583
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 570

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.name.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
  a menos que Principal
    @topology = topologia::ReplicaSetNoPrimary.Novo(
      topologia.opções, topologia.Monitoramento, auto)
  end
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.



494
495
496
497
498
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
542
543
544
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 494

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
  se topology_changed_event_published
    Método
  end

  se updated_desc.desconhecido? && anterior_desc.desconhecido?
    Método
  end
  se updated_desc.object_id == anterior_desc.object_id
    Método
  end

  a menos que topology_efetivamente_changed?
    Método
  end

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



546
547
548
549
550
551
552
553
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 546

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



421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 421

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
  se server_list.vazio?
    log_service(
      "A topologia agora não tem servidores - provavelmente é uma configuração incorreta do cluster e/ou do aplicação"
    )
  end
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.



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
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 447

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.
  a menos que @server_description_changed || topology_efetivamente_changed?
    Método
  end

  # 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.
  se updated_desc.object_id == anterior_desc.object_id
    Método
  end

  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.



414
415
416
417
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 414

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



392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 392

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|
    a menos que updated_desc_address_strs.incluir?(endereço_str = Servidor.endereço.to_s)
      updated_host = updated_desc.endereço.to_s
      se updated_desc.eu && updated_desc.eu != updated_host
        updated_host += " (auto-identificado como #{updated_desc.me})"
      end
      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
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.



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
190
191
192
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 93

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
      se updated_desc.replica_set_name != topologia.replica_set_name
        log_service(
          "Servidor MongoDB #{updated_desc.endereço.to_s} tem um nome de conjunto de réplica incorreto '#{updated_desc.replica_set_name}'; expected'#{topology.replica_set_name}'"
        )
        @updated_desc = ::mongo::Servidor::Descrição.Novo(updated_desc.endereço,
          {}, average_round_trip_time: updated_desc.average_round_trip_time)
        update_server_descriptions
      end
    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 o servidor #{updated_desc.endereço.to_s} porque é do tipo errado (#{updated_desc.server_type.to_s.upcase}- esperado Sharded"
      )
      remover
    end
  quando topologia::ReplicaSetWithPrimary
    se updated_desc.autônomo? || updated_desc.mongos?
      log_service(
        "Removendo o servidor #{updated_desc.endereço.to_s} porque é do tipo errado (#{updated_desc.server_type.to_s.upcase}) - esperado um membro 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 o servidor #{updated_desc.endereço.to_s} porque é do tipo errado (#{updated_desc.server_type.to_s.upcase}) - esperado um membro 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 Go voltará para RS sem primary
      # 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)


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
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 586

def stale_primary?
  se updated_desc.max_wire_version >= 17
    se updated_desc.election_id.nada? && !topologia.max_election_id.nada?
      Método true
    end
    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
      se updated_desc.set_version.nada? && !topologia.max_set_version.nada?
        Método true
      end
      se updated_desc.set_version && topologia.max_set_version && updated_desc.set_version < topologia.max_set_version
        Método true
      end
    end
  mais
    se 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
  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



557
558
559
560
561
562
563
564
565
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 557

def start_pool_if_data_Bearing
  Método se !updated_desc.data_Bearing?

  server_list.cada fazer |Servidor|
    se Servidor.endereço == @updated_desc.endereço
      Servidor.pool
    end
  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, estão "vivos". Portanto, temos que armazenar a lista completa de descrições de servidores no início do fluxo SDAM e compará-las com as atuais.

Retorna:

  • (Booleano)


631
632
633
634
635
636
637
638
639
640
641
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 631

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

  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.



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
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 217

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 servidor #{updated_desc.endereço.to_s} 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)
    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
    então
      @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|
    se Servidor.endereço != updated_desc.endereço
      se 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))
      end
    end
  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.



291
292
293
294
295
296
297
298
299
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
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 291

def update_rs_with_primary_from_member
  se topologia.replica_set_name != updated_desc.replica_set_name
    log_service(
      "Removendo servidor #{updated_desc.endereço.to_s} 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 servidor #{updated_desc.endereço.to_s} 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

  a menos que has_primary
    @topology = topologia::ReplicaSetNoPrimary.Novo(
      topologia.opções, topologia.Monitoramento, auto)
  end
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.



328
329
330
331
332
333
334
335
336
337
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
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 328

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 servidor #{updated_desc.endereço.to_s} 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

  se updated_desc.me_mismatch?
    log_service(
      "Removendo servidor #{updated_desc.endereço.to_s} porque " +
      "se reportou como #{updated_desc.me}"
    )
    remover
    Método
  end
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.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 66

def update_server_descriptions
  server_list.cada fazer |Servidor|
    se 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.rst#value-is-the-tention-of-topologyversion
      a menos que updated_desc.topology_version_gte?(Servidor.Descrição)
        Método false
      end

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



196
197
198
199
200
201
202
203
204
205
206
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 196

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.to_s} 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.



643
644
645
646
647
648
649
650
651
# File 'build/ruby-driver-v2.19/lib/mongo/cluster/sdam_flow.rb', linha 643

def verify_invariants
  se mongo::Lint.habilitado?
    se cluster.topologia.único?
      se cluster.server_list.Tamanho > 1
        aumentar mongo::Erro::LintError, "Tentando criar uma única topologia com vários servidores: #{cluster.server_list}"
      end
    end
  end
end