Clase: Mongo::clúster::SdamFlow Privado

Hereda:
Objeto
  • Objeto
Mostrar todo
Ampliado por:
Reenviable
Definido en:
lib/mongo/clúster/sdam_flow.rb

Overview

Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.

Gestiona el flujo SDAM para un evento de cambio de descripción del servidor.

Actualiza las descripciones de los servidores, descripciones de topologías y publica eventos SDAM.

SdamFlow está pensado para ser instanciado una vez por cada evento de cambio de descripción del servidor que deba ser procesado.

Resumen de atributos de la instancia colapsar

Resumen del método de instancia colapsar

Detalles del Constructor

#initialize(clúster, previous_desc, updated_desc, awaited: false) ⇒ SdamFlow

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una nueva instancia de SdamFlow.



30
31
32
33
34
35
36
37
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 30

def inicializar(clúster, previous_desc, updated_desc, esperado: false)
  @cluster = clúster
  @topology = clúster.topología
  @original_desc = @previous_desc = previous_desc
  @updated_desc = updated_desc
  @servers_to_disconnect = []
  @awaited = !!en espera
end

Detalles de atributo de instancias

#clústerObjeto (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



39
40
41
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 39

def clúster
  @cluster
end

#orphinal_descobjeto (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



39
40
41
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 39

def original_desc
  @original_desc
end

#previous_descObject (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



39
40
41
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 39

def previous_desc
  @previous_desc
end

#topologíaObject (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

La topología almacenada en este atributo puede cambiar varias veces a lo largo de un único flujo sdam (por ejemplo, desconocido -> RS sin primario -> RS con primario). Los eventos de cambio de topología se envían al final del procesamiento del flujo, de modo que el ejemplo anterior solo publica un evento desconocido -> RS con evento primario en la aplicación.

Devuelve:

  • Mongo::clúster::topología La topología actual.



51
52
53
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 51

def topología
  @topology
end

#updated_desc => objeto (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



39
40
41
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 39

def updated_desc
  @updated_desc
end

Detalles del método de instancia

#add_servers_from_desc(updated_desc) ⇒ arreglo<Servidor>

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Nota:

Los servidores se agregan sin monitoreo. La supervisión debe iniciarse más tarde

Agrega todos los servidores referenciados en la descripción dada (que se supone que proviene de un buen primario) que aún no están en el clúster, al clúster.

por separado.

Devuelve:

  • (Array<servidor>)

    Servidores realmente añadidos al clúster. Este es el conjunto de servidores en el que debe iniciarse la supervisión.



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

def add_servers_from_desc(updated_desc)
  added_servers = []
  %w[host pasivos Árbitros].cada hacer |m|
    updated_desc.enviar(m).cada hacer |address_str|
      si Server = clúster.add(address_str, supervisar: false)
        added_servers << Server
      end
    end
  end

  verificar_invariantes

  added_servers
end

#¿esperado?Booleano

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve:

  • (booleano)


53
54
55
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 53

def ¿esperado?
  @awaited
end

#became_unknown?Booleana

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve si el servidor cuya descripción procesó este flujo no era previamente desconocido, y ahora lo es. Se utiliza para decidir, en particular, si se debe borrar el pool de conexiones del servidor.

Devuelve:

  • (booleano)


611
612
613
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 611

def se_volvió_desconocido?
  updated_desc.¿desconocido? && !original_desc.¿desconocido?
end

#check_if_has_primaryObject

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Comprueba si el clúster tiene un primario y, de lo contrario, transiciona la topología a ReplicaSetNoPrimary. La topología debe ser ReplicaSetWithPrimary al invocar este método.



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

def check_if_has_primary
  a menos que topología.replica_set?
    propagar ArgumentError,
          "'check_if_has_primary' sólo debe llamarse cuando la topología sea un set de réplicas, pero es #{topology.class.name.sub(/.*::/,
                                                                                                                        '')}"
  end

  primario = servers_list.detectar hacer |Server|
    # Un principal con el nombre de conjunto incorrecto no es un principal
    Server.primario/a? && Server.Descripción.nombre_conjunto_replicación == topología.nombre_conjunto_replicación
  end
  return si primario

  @topology = topología::ReplicaSetSinPrincipal.Nuevo(
    topología.opciones, topología.Monitoring, sí mismo
  )
end

#commit_changesobjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Publica eventos de cambio de descripción del servidor, actualiza la topología en el clúster y publica el evento de cambio de topología, según sea necesario, basándose en las operaciones realizadas durante el procesamiento del flujo 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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 499

def commit_changes
  # La secuencia de eventos visible para la aplicación debe ser la siguiente:
  #
  # 1. Cambio de descripción para el servidor que estamos procesando;
  # 2. Cambio de topología, si lo hubiera;
  # 3. Cambios en la descripción para otros servidores, si los hay.
  #
  # La parte complicada aquí es que los cambios en la descripción del servidor son
  # no todos se procesan juntos.

  publish_description_change_event
  start_pool_if_data_bearing

  topology_changed_event_published = false
  si !topología.¿igual?(clúster.topología) || @need_topology_changed_event
    # Estamos a punto de publicar el evento de cambio de topología.
    # Recrea la instancia de topología para obtener las descripciones de sus servidores
    # actualizado.
    @topology = topología.clase.Nuevo(topología.opciones, topología.Monitoring, clúster)
    # Esto envía el evento SDAM
    clúster.update_topology(topología)
    topology_changed_event_published = true
    @need_topology_changed_event = false
  end

  # Si cambió la descripción de un servidor, evento de cambio de descripción de topología
  # debe publicarse con las topologías anteriores y siguientes siendo de
  # el mismo tipo, a menos que ya hayamos publicado el evento de cambio de topología
  return si topology_changed_event_published

  return si updated_desc.¿desconocido? && previous_desc.¿desconocido?
  return si updated_desc.¿igual?(previous_desc)

  return a menos que topology_effectively_changed?

  # Si estamos aquí, ha habido un cambio en las descripciones del servidor
  # en nuestra topología, pero la clase de topología no ha cambiado.
  # Publica el evento de cambio de topología y recrea la topología para
  # obtenga la nueva lista de descripciones del servidor en ella.
  @topology = topología.clase.Nuevo(topología.opciones, topología.Monitoring, clúster)
  # Esto envía el evento SDAM
  clúster.update_topology(topología)
end

#disconnect_serversobjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



543
544
545
546
547
548
549
550
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 543

def disconnect_servers
  mientras Server = @servers_to_disconnect.turno
    si Server.¿conectado?
      # No publiques el evento de cierre del servidor, ya que esto ya se realizó.
      Server.¡desconectar!
    end
  end
end

#do_remove(address_str) ⇒ Objeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Remueve el servidor especificado de la topología y advierte si la topología termina con una lista vacía de servidores 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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 430

def do_remove(address_str)
  servidor = clúster.Remover(address_str, desconectar: false)
  servidor.cada hacer |Server|
    # Borrar la descripción para que el servidor se marque como desconocido.
    Server.clear_description

    # Aquí necesitamos publicar el evento de Servidor cerrado, pero no podemos cerrar
    # el servidor porque podría ser que el servidor fuera el dueño del monitor en
    # cuyo hilo está ejecutando actualmente este flujo, en cuyo caso el cierre
    # el servidor puede terminar el hilo y dejar el procesamiento SDAM
    # incompleto. Por lo tanto, tenemos que remover el servidor del clúster,
    # publicar el evento, pero no se debe llamar a desconectar en el servidor hasta
    # el final mismo cuando todo el procesamiento haya finalizado.
    publish_sdam_event(
      mongo::Monitoring::SERVIDOR_CERRADO,
      mongo::Monitoring::Evento::ServerClosed.Nuevo(Server.dirección, clúster.topología)
    )
  end
  @servers_to_disconnect += servidor
  return a menos que servers_list.¿vacío?

  log_warn(
    'La topología ahora no tiene servidores; es probable que se trate de una desconfiguración del clúster y/o de la aplicación'
  )
end

#publish_description_change_eventObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el 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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 456

def publish_description_change_event
  # Este método puede invocarse cuando la descripción del servidor definitivamente cambió
  # pero antes de que se actualice la topología. Por lo tanto, comprobamos ambos
  # cambios en la descripción del servidor y cambios generales en la topología. Cuando esto
  # El método se llama al final del flujo SDAM como parte de "commit changes"
  # paso, el cambio de descripción del servidor se incorpora en la topología
  # cambio.
  return a menos que @server_description_changed || topology_effectively_changed?

  # updated_desc aquí puede que no sea la descripción que recibimos de
  # el servidor - en caso de un primario obsoleto, el servidor se reportó a sí mismo
  # como una primaria, pero updated_desc aquí será desconocido.

  # Solíamos no notificar sobre cambios de servidor Desconocido -> Desconocido.
  # Técnicamente, estos son cambios de estado válidos (o al menos tan válidos como
  # otros cambios en la descripción del servidor cuando la descripción no ha
  # cambió significativamente pero los eventos aún se publican).
  # La versión actual del driver notifica sobre Desconocido -> Desconocido
  # transiciones.

  # Evite enviar eventos cuando la descripción actualizada sea la misma que
  # descripción anterior. Esto permite que este método sea llamado múltiples veces
  # de veces en el flujo cuando los eventos deben publicarse, sin
  # preocuparse por si hay cambios no publicados.
  return si updated_desc.¿igual?(previous_desc)

  publish_sdam_event(
    ::mongo::Monitoring::DESCRIPTION_CHANGE,
    ::mongo::Monitoring::Evento::ServerDescriptionChanged.Nuevo(
      updated_desc.dirección,
      topología,
      previous_desc,
      updated_desc,
      esperado: ¿esperado?
    )
  )
  @previous_desc = updated_desc
  @need_topology_changed_event = true
end

#removerObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Elimina del topología el servidor cuya descripción estamos procesando.



423
424
425
426
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 423

def Remover
  publish_description_change_event
  do_remove(updated_desc.dirección.to_s)
end

#remove_servers_not_in_desc(updated_desc) ⇒ Object

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Remueve servidores de la topología que no están presentes en la descripción del servidor dada (que se supone que proviene de un primario válido).



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

def remove_servers_not_in_desc(updated_desc)
  actualizado_desc_address_strs = %w[host pasivos Árbitros].map hacer |m|
    updated_desc.enviar(m)
  end.nivelar
  servers_list.cada hacer |Server|
    Next si actualizado_desc_address_strs.incluir?(address_str = Server.dirección.to_s)

    updated_host = updated_desc.dirección.to_s
    updated_host += " (autoidentificado como #{updated_desc.me})" si updated_desc.me && updated_desc.me != updated_host
    log_warn(
      "Removiendo el servidor #{address_str} porque no está en los hosts reportados por el primario " +
      "#{updated_host}. Los hosts reportados son: " +
      updated_desc.host.unirse(', ')
    )
    do_remove(address_str)
  end
end

#server_description_changedObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el 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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 85

def server_description_changed
  @previous_server_descriptions = servers_list.map hacer |Server|
    [ Server.dirección.to_s, Server.Descripción ]
  end

  a menos que update_server_descriptions
    # Todas las transiciones requieren que el servidor cuya updated_desc estamos
    # el procesamiento sigue en el clúster (es decir, no se eliminó como resultado
    # de procesamiento de otra respuesta, potencialmente de manera concurrente).
    # Si update_server_descriptions devolvió false, no tenemos servidores.
    # en la topología de la descripción que estamos procesando, detener.
    return
  end

  caso topología
  cuando topología::loadBalanced
    @updated_desc = ::mongo::Server::Descripción::Balanceador de carga.Nuevo(
      updated_desc.dirección
    )
    update_server_descriptions
  cuando topología::Single
    si topología.nombre_conjunto_replicación && (updated_desc.nombre_conjunto_replicación != topología.nombre_conjunto_replicación)
      log_warn(
        "Servidor #{updated_desc.address} tiene un nombre de set de réplicas incorrecto '#{updated_desc.replica_set_name}'; se esperaba '#{topology.replica_set_name}'"
      )
      @updated_desc = ::mongo::Server::Descripción.Nuevo(
        updated_desc.dirección,
        {},
        average_round_trip_time: updated_desc.average_round_trip_time,
        minimum_round_trip_time: updated_desc.minimum_round_trip_time
      )
      update_server_descriptions
    end
  cuando topología::Desconocido
    si updated_desc.autónomo?
      update_unknown_with_standalone
    elsif updated_desc.mongos?
      @topology = topología::particionado.Nuevo(topología.opciones, topología.Monitoring, sí mismo)
    elsif updated_desc.primario/a?
      @topology = topología::ReplicaSetWithPrimary.Nuevo(
        topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_conjunto_replicación),
        topología.Monitoring, sí mismo
      )
      update_rs_from_primary
    elsif updated_desc.secundario? || updated_desc.árbitro? || updated_desc.¿otro?
      @topology = topología::ReplicaSetSinPrincipal.Nuevo(
        topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_conjunto_replicación),
        topología.Monitoring, sí mismo
      )
      update_rs_sin_primary
    end
  cuando topología::particionado
    a menos que updated_desc.¿desconocido? || updated_desc.mongos?
      log_warn(
        "Removiendo servidor #{updated_desc.address} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba PARTICIONADO"
      )
      Remover
    end
  cuando topología::ReplicaSetWithPrimary
    si updated_desc.autónomo? || updated_desc.mongos?
      log_warn(
        "Eliminando el servidor #{updated_desc.address} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba un nodo del conjunto de réplicas"
      )
      Remover
      check_if_has_primary
    elsif updated_desc.primario/a?
      update_rs_from_primary
    elsif updated_desc.secundario? || updated_desc.árbitro? || updated_desc.¿otro?
      update_rs_with_primary_from_member
    else
      check_if_has_primary
    end
  cuando topología::ReplicaSetSinPrincipal
    si updated_desc.autónomo? || updated_desc.mongos?
      log_warn(
        "Eliminando el servidor #{updated_desc.address} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba un nodo del conjunto de réplicas"
      )
      Remover
    elsif updated_desc.primario/a?
      # Aquí cambiamos el tipo de topología a RS con principal, sin embargo
      # al procesamiento updated_desc podemos encontrar que su nombre de RS
      # no coincide con nuestro nombre RS existente. Por esta razón
      # es imperativo no pasar el nombre de RS de desc_actualizada a
      # constructor de topología aquí.
      # Durante el procesamiento, podríamos remover el servidor cuyo updated_desc
      # estamos procesando (por ejemplo, el caso de la discrepancia en el nombre de RS nuevamente),
      # en cuyo caso el tipo de topología volverá a RS sin primario
      # en el paso check_if_has_primary.
      @topology = topología::ReplicaSetWithPrimary.Nuevo(
        # No pases aquí el nombre de RS de updated_desc
        topología.opciones,
        topología.Monitoring, sí mismo
      )
      update_rs_from_primary
    elsif updated_desc.secundario? || updated_desc.árbitro? || updated_desc.¿otro?
      update_rs_sin_primary
    end
  else
    propagar ArgumentError, "Topología desconocida #{topología.clase}"
  end

  verificar_invariantes
  commit_changes
  disconnect_servers
end

#está_desactualizado_principal?booleano

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Si updated_desc es para un primario obsoleto.

Devuelve:

  • (booleano)


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

def stale_primary?
  si updated_desc.max_wire_version >= 17
    return true si updated_desc.election_id.nil? && !topología.id_max_election.nil?
    si updated_desc.election_id && topología.id_max_election && updated_desc.election_id < topología.id_max_election
      return true
    end

    si updated_desc.election_id == topología.id_max_election
      return true si updated_desc.set_version.nil? && !topología.max_set_version.nil?
      si updated_desc.set_version && topología.max_set_version && updated_desc.set_version < topología.max_set_version
        return true
      end
    end
  elsif updated_desc.election_id && updated_desc.set_version
    si topología.max_set_version && topología.id_max_election &&
       (updated_desc.set_version < topología.max_set_version ||
           (updated_desc.set_version == topología.max_set_version &&
               updated_desc.election_id < topología.id_max_election))
      return true
    end
  end
  false
end

#start_pool_if_data_bearingobjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Si se identifica que el servidor que se está procesando contiene datos, se crea el pool de conexiones del servidor para que pueda comenzar a llenarse



554
555
556
557
558
559
560
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 554

def start_pool_if_data_bearing
  return a menos que updated_desc.¿portador de datos?

  servers_list.cada hacer |Server|
    Server.group si Server.dirección == @updated_desc.dirección
  end
end

#topology_effectively_changed?Booleano

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve si la topología cambió significativamente como resultado de la ejecución del flujo SDAM.

La especificación define la igualdad de topologías a través de la igualdad de tipos de topología y descripciones de servidores en cada topología; esta definición no es utilizable por nosotros porque nuestros objetos de topología no contienen descripciones de servidores y, en cambio, son "dinámicos". Por lo tanto, tenemos que almacenar la lista completa de descripciones del servidor al principio del flujo de SDAM y compararlas con las actuales.

Devuelve:

  • (booleano)


624
625
626
627
628
629
630
631
632
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 624

def topology_effectively_changed?
  return true a menos que topología.¿igual?(clúster.topología)

  server_descriptions = servers_list.map hacer |Server|
    [ Server.dirección.to_s, Server.Descripción ]
  end

  @previous_server_descriptions != server_descriptions
end

#update_rs_from_primaryObject

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Actualiza la topología, que debe ser un ReplicaSetWithPrimary, con información de la descripción del servidor principal.

Este método no cambia el tipo de topología a ReplicaSetWithPrimary; esto debe haberse hecho antes de llamar a este método.

Si se determina que el primario cuya descripción se está procesando está desactualizado, este método cambiará la descripción del servidor y el tipo de topología a desconocido.



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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 215

def update_rs_from_primary
  si topología.nombre_conjunto_replicación.nil?
    @topology = topología::ReplicaSetWithPrimary.Nuevo(
      topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_conjunto_replicación),
      topología.Monitoring, sí mismo
    )
  end

  si topología.nombre_conjunto_replicación != updated_desc.nombre_conjunto_replicación
    log_warn(
      "Remover el servidor #{updated_desc.address} porque tiene " +
      "nombre de set de réplicas incorrecto '#{updated_desc.replica_set_name}'; " +
      "se esperaba '#{topología.replica_set_name}'"
    )
    Remover
    check_if_has_primary
    return
  end

  si stale_primary?
    @updated_desc = ::mongo::Server::Descripción.Nuevo(
      updated_desc.dirección,
      {},
      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
    return
  end

  si updated_desc.max_wire_version >= 17
    @topology = topología::ReplicaSetWithPrimary.Nuevo(
      topología.opciones.fusionar(
        max_election_id: updated_desc.election_id,
        max_set_version: updated_desc.set_version
      ), topología.Monitoring, sí mismo
    )
  else
    id_max_election = topología.nuevo_max_election_id(updated_desc)
    max_set_version = topología.nueva_versión_máxima_establecida(updated_desc)

    si id_max_election != topología.id_max_election ||
       max_set_version != topología.max_set_version
      @topology = topología::ReplicaSetWithPrimary.Nuevo(
        topología.opciones.fusionar(
          max_election_id: id_max_election,
          max_set_version: max_set_version
        ), topología.Monitoring, sí mismo
      )
    end
  end

  # En este momento hemos aceptado la descripción actualizada del servidor
  y la topología (ambos son primarios). Confirma estas modificaciones para que
  # Sus eventos SDAM respectivos se publican antes que los eventos SDAM para
  # adiciones/eliminaciones de servidores siguientes
  publish_description_change_event

  servers_list.cada hacer |Server|
    Next a menos que Server.dirección != updated_desc.dirección

    Next a menos que Server.primario/a?

    Server.update_description(
      ::mongo::Server::Descripción.Nuevo(
        Server.dirección,
        {},
        average_round_trip_time: Server.Descripción.average_round_trip_time,
        minimum_round_trip_time: updated_desc.minimum_round_trip_time
      )
    )
  end

  servidor = add_servers_from_desc(updated_desc)
  remove_servers_not_in_desc(updated_desc)

  check_if_has_primary

  servidor.cada hacer |Server|
    Server.Comenzar monitoreo
  end
end

#update_rs_with_primary_from_memberObject

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Actualiza una topología de ReplicaSetWithPrimary desde un miembro que no es primario.



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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 300

def update_rs_with_primary_from_member
  si topología.nombre_conjunto_replicación != updated_desc.nombre_conjunto_replicación
    log_warn(
      "Remover el servidor #{updated_desc.address} porque tiene " +
      "nombre de set de réplicas incorrecto (#{updated_desc.replica_set_name}); " +
      "el nombre actual del conjunto es #{topología.replica_set_name}"
    )
    Remover
    check_if_has_primary
    return
  end

  si updated_desc.me_mismatch?
    log_warn(
      "Removiendo servidor #{updated_desc.address} porque " +
      "se reportó como #{updated_desc.me}"
    )
    Remover
    check_if_has_primary
    return
  end

  tener_principal = false
  servers_list.cada hacer |Server|
    si Server.primario/a?
      tener_principal = true
      break
    end
  end

  return si tener_principal

  @topology = topología::ReplicaSetSinPrincipal.Nuevo(
    topología.opciones, topología.Monitoring, sí mismo
  )
end

#update_rs_without_primaryObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Actualiza una topología ReplicaSetNoPrimary desde un miembro no primario.



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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 338

def update_rs_sin_primary
  si topología.nombre_conjunto_replicación.nil?
    @topology = topología::ReplicaSetSinPrincipal.Nuevo(
      topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_conjunto_replicación),
      topología.Monitoring, sí mismo
    )
  end

  si topología.nombre_conjunto_replicación != updated_desc.nombre_conjunto_replicación
    log_warn(
      "Remover el servidor #{updated_desc.address} porque tiene " +
      "nombre de set de réplicas incorrecto (#{updated_desc.replica_set_name}); " +
      "el nombre actual del conjunto es #{topología.replica_set_name}"
    )
    Remover
    return
  end

  publish_description_change_event

  servidor = add_servers_from_desc(updated_desc)

  commit_changes

  servidor.cada hacer |Server|
    Server.Comenzar monitoreo
  end

  return a menos que updated_desc.me_mismatch?

  log_warn(
    "Removiendo servidor #{updated_desc.address} porque " +
    "se reportó como #{updated_desc.me}"
  )
  Remover
  nulo
end

#update_server_descriptionsObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Actualiza las descripciones en todos los servidores cuya dirección coincida con la dirección de 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
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 61

def update_server_descriptions
  servers_list.cada hacer |Server|
    Next a menos que Server.dirección == updated_desc.dirección
    # El flujo SDAM debe ejecutarse cuando la versión de topología en la nueva descripción
    # es igual a la versión de topología actual, según el ejemplo en
    # https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md#what-is-the-purpose-of-topologyversion
    return false a menos que updated_desc.topology_version_gte?(Server.Descripción)

    @server_description_changed = Server.Descripción != updated_desc

    # Actualiza siempre la descripción del servidor, de modo que los campos que no
    # afecta las comparaciones de igualdad de descripciones pero forman parte de la
    # descripción se actualizan.
    Server.update_description(updated_desc)
    Server.update_last_scan

    # Si no había diferencia de contenido entre las descripciones, nosotros
    # todavía es necesario ejecutar el flujo de sdam, pero si el flujo no produce cambios
    # en topología omitiremos el envío de eventos.
    return true
  end
  false
end

#update_unknown_with_standaloneObjeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Transiciones de desconocido a un único tipo de topología, cuando se descubre un servidor autónomo.



193
194
195
196
197
198
199
200
201
202
203
204
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 193

def update_unknown_with_standalone
  si semillas.longitud == 1
    @topology = topología::Single.Nuevo(
      topología.opciones, topología.Monitoring, sí mismo
    )
  else
    log_warn(
      "Se está removiendo el servidor #{updated_desc.address} porque es autónomo y tenemos múltiples semillas (#{seeds.length})"
    )
    Remover
  end
end

#verify_invariantsObject

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.



634
635
636
637
638
639
640
641
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 634

def verificar_invariantes
  return a menos que mongo::Lint.¿habilitado?
  return a menos que clúster.topología.¿Soltero/a?
  return a menos que clúster.servers_list.longitud > 1

  propagar mongo::Error::LintError,
        "Intentando crear una sola topología con varios servidores: #{clúster.servidores_lista}"
end