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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una nueva instancia de SdamFlow.



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

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

Detalles de los atributos de instancia

#clústerObjeto (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



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

def clúster
  @cluster
end

#orphinal_descobjeto (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



56
57
58
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 56

def original_desc
  @original_desc
end

#previous_descObject (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



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

def previous_desc
  @desc_anterior
end

#topologíaObject (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

La topología almacenada en este atributo puede cambiar varias veces durante un flujo sdam (p. ej., 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 primario en la aplicación.

Devuelve:

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



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

def topología
  @topology
end

#updated_desc => objeto (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



55
56
57
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 55

def updated_desc
  @updated_desc
end

Detalles del método de instancia

#add_servers_from_desc(updated_desc) ⇒ arreglo<Servidor>

Este método forma parte de una API privada. Debe evitarlo 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)

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



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

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, monitor: false)
        added_servers << Server
      end
    end
  end

  verificar_invariantes

  added_servers
end

#¿esperado?Booleano

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve:

  • (booleano)


58
59
60
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 58

def ¿esperado?
  @esperado
end

#became_unknown?Booleana

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve si el servidor cuya descripción ha sido procesada por este flujo no era previamente desconocido, y ahora sí lo es. Se utiliza, en particular, para decidir si se debe limpiar el pool de conexiones del servidor.

Devuelve:

  • (booleano)


631
632
633
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 631

def ¿se convirtió en desconocido?
  updated_desc.¿desconocido? && !original_desc.¿desconocido?
end

#check_if_has_primaryObject

Este método forma parte de una API privada. Debe evitarlo 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.



583
584
585
586
587
588
589
590
591
592
593
594
595
596
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 583

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

  primario = servers_list.detectar hacer |Server|
    # Un conjunto primario con un nombre incorrecto no es un conjunto primario
    Server.primario/a? && Server.Descripción.nombre_del_conjunto_de_réplicas == topología.nombre_del_conjunto_de_réplicas
  end
  a menos que primario
    @topology = topología::Conjunto de réplicas no primario.Nuevo(
      topología.opciones, topología.Monitoring, sí mismo)
  end
end

#commit_changesObjeto

Este método forma parte de una API privada. Debe evitarlo 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.



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
545
546
547
548
549
550
551
552
553
554
555
556
557
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 507

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

  evento_de_topología_cambiada_publicado = 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)
    evento_de_topología_cambiada_publicado = 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
  si evento_de_topología_cambiada_publicado
    return
  end

  si updated_desc.¿desconocido? && previous_desc.¿desconocido?
    return
  end
  si updated_desc.object_id == previous_desc.object_id
    return
  end

  a menos que topology_effectively_changed?
    return
  end

  # Si estamos aquí, ha habido un cambio en las descripciones de los servidores.
  # 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



559
560
561
562
563
564
565
566
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 559

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(dirección_str) ⇒ Objeto

Este método forma parte de una API privada. Debe evitarlo 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



434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 434

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

    # Necesitamos publicar el evento de cierre del servidor aquí, pero no podemos cerrarlo
    # 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 cuando todo el procesamiento se ha completado.
    evento publicar_sdam(
      Mongo::Monitoring::SERVIDOR_CERRADO,
      Mongo::Monitoring::Evento::ServerClosed.Nuevo(Server.dirección, clúster.topología)
    )
  end
  @servers_to_disconnect += servidores
  si servers_list.¿vacío?
    advertencia de registro(
      "La topología ahora no tiene servidores; esto probablemente se deba a una mala configuración del clúster y/o de la aplicación"
    )
  end
end

#publicar_descripción_cambio_eventoObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 460

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 "confirmar cambios"
  # paso, el cambio de descripción del servidor se incorpora en la topología
  # cambio.
  a menos que @server_description_changed || topology_effectively_changed?
    return
  end

  # updated_desc aquí puede que no sea la descripción que recibimos de
  # el servidor - en caso de una primaria obsoleta, 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.
  si updated_desc.object_id == previous_desc.object_id
    return
  end

  evento publicar_sdam(
    ::Mongo::Monitoring::DESCRIPCIÓN DEL SERVIDOR CAMBIADA,
    ::Mongo::Monitoring::Evento::ServerDescriptionChanged.Nuevo(
      updated_desc.dirección,
      topología,
      previous_desc,
      updated_desc,
      esperado: ¿esperado?,
    )
  )
  @desc_anterior = updated_desc
  @need_topology_changed_event = true
end

#eliminarObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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



427
428
429
430
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 427

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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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



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

def remove_servers_not_in_desc(updated_desc)
  direcciones de descripción actualizadas = %w(host pasivos Árbitros).map hacer |m|
    updated_desc.enviar(m)
  end.nivelar
  servers_list.cada hacer |Server|
    a menos que direcciones de descripción actualizadas.incluir?(address_str = Server.dirección.to_s)
      updated_host = updated_desc.dirección.to_s
      si updated_desc.me && updated_desc.me != updated_host
        updated_host += " (autoidentificado como #{updated_desc.me})"
      end
      advertencia de registro(
        "Eliminandoel servidor #{address_str} porque no está entre los hosts informados por el servidor principal" +
        "#{updated_host}. Los hosts reportados son: " +
        updated_desc.host.unirse(', ')
      )
      do_remove(address_str)
    end
  end
end

#server_description_changedObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el 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
193
194
195
196
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 93

def server_description_changed
  @descripciones_del_servidor_anterior = 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_del_conjunto_de_réplicas
      si updated_desc.nombre_del_conjunto_de_réplicas != topología.nombre_del_conjunto_de_réplicas
        advertencia de registro(
          "El servidor #{updated_desc.address.to_s} tiene un nombre incorrecto de set de réplicas '#{updated_desc.replica_set_name}'; se esperaba '#{topología.replica_set_name}'"
        )
        @updated_desc = ::Mongo::Server::Descripción.Nuevo(
          updated_desc.dirección,
          {},
          tiempo promedio de ida y vuelta: updated_desc.average_round_trip_time,
          minimum_round_trip_time: updated_desc.tiempo mínimo de ida y vuelta
        )
        update_server_descriptions
      end
    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_del_conjunto_de_réplicas),
        topología.Monitoring, sí mismo)
      update_rs_from_primary
    elsif updated_desc.secundario? || updated_desc.árbitro? || updated_desc.¿otro?
      @topology = topología::Conjunto de réplicas no primario.Nuevo(
        topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_del_conjunto_de_réplicas),
        topología.Monitoring, sí mismo)
      update_rs_sin_primary
    end
  Cuando topología::particionado
    a menos que updated_desc.¿desconocido? || updated_desc.mongos?
      advertencia de registro(
        "Eliminandoel servidor #{updated_desc.address.to_s} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba SHARDED"
      )
      Remover
    end
  Cuando topología::ReplicaSetWithPrimary
    si updated_desc.autónomo? || updated_desc.mongos?
      advertencia de registro(
        "Removiendo el servidor #{updated_desc.address.to_s} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba un nodo del set 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::Conjunto de réplicas no primario
    si updated_desc.autónomo? || updated_desc.mongos?
      advertencia de registro(
        "Removiendo el servidor #{updated_desc.address.to_s} porque es del tipo incorrecto (#{updated_desc.server_type.to_s.upcase}) - se esperaba un nodo del set de réplicas"
      )
      Remover
    elsif updated_desc.primario/a?
      # Aquí cambiamos el tipo de topología a RS con primario, sin embargo
      # al procesamiento updated_desc podemos encontrar que su nombre de RS
      # no coincide con nuestro nombre RS actual. Por esta razón
      # es imperativo no pasar el nombre de RS de desc_actualizada a
      # Constructor de topología aquí.
      # Durante el procesamiento podemos eliminar el servidor cuyo updated_desc
      # estamos procesando (por ejemplo, el caso de discrepancia de nombre de RS nuevamente),
      # en cuyo caso el tipo de topología volverá a RS sin primaria
      # 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Si updated_desc es para un primario obsoleto.

Devuelve:

  • (booleano)


599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 599

def stale_primary?
  si updated_desc.max_wire_version >= 17
    si updated_desc.id_elección.nil? && !topología.id_máximo_de_elección.nil?
      return true
    end
    si updated_desc.id_elección && topología.id_máximo_de_elección && updated_desc.id_elección < topología.id_máximo_de_elección
      return true
    end
    si updated_desc.id_elección == topología.id_máximo_de_elección
      si updated_desc.set_version.nil? && !topología.max_set_version.nil?
        return true
      end
      si updated_desc.set_version && topología.max_set_version && updated_desc.set_version < topología.max_set_version
        return true
      end
    end
  else
    si updated_desc.id_elección && updated_desc.set_version
      si topología.max_set_version && topología.id_máximo_de_elección &&
          (updated_desc.set_version < topología.max_set_version ||
              (updated_desc.set_version == topología.max_set_version &&
                  updated_desc.id_elección < topología.id_máximo_de_elección))
        return true
      end
    end
  end
  false
end

#start_pool_if_data_bearingobjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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



570
571
572
573
574
575
576
577
578
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 570

def start_pool_if_data_bearing
  return si !updated_desc.¿portador de datos?

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

#¿topología_efectivamente_cambiada?Booleano

Este método forma parte de una API privada. Debe evitarlo 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 mediante la igualdad de los tipos de topología y las descripciones de los servidores en cada topología; esta definición no nos resulta útil porque nuestros objetos de topología no contienen las descripciones de los servidores y en su lugar son “en vivo”. Por lo tanto, tenemos que almacenar la lista completa de descripciones de servidores al principio del flujo SDAM y compararlas con las actuales.

Devuelve:

  • (booleano)


644
645
646
647
648
649
650
651
652
653
654
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 644

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

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

  @descripciones_del_servidor_anterior != server_descriptions
end

#update_rs_from_primaryObject

Este método forma parte de una API privada. Debe evitarlo 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.



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

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

  si topología.nombre_del_conjunto_de_réplicas != updated_desc.nombre_del_conjunto_de_réplicas
    advertencia de registro(
      "Removiendo servidor #{desc_actualizado.dirección.to_s} porque tiene un " +
      "nombre de set de réplicas incorrecto '#{updated_desc.replica_set_name}'; " +
      "se esperaba' #{topology. replica_set_name} ' "
    )
    Remover
    check_if_has_primary
    return
  end

  si stale_primary?
    @updated_desc = ::Mongo::Server::Descripción.Nuevo(
      updated_desc.dirección,
      {},
      tiempo promedio de ida y vuelta: updated_desc.average_round_trip_time,
      minimum_round_trip_time: updated_desc.tiempo mínimo de ida y vuelta
    )
    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.id_elección,
        max_set_version: updated_desc.set_version
      ), topología.Monitoring, sí mismo)
  else
    id_máximo_de_elección = topología.nuevo_max_election_id(updated_desc)
    max_set_version = topología.nueva_versión_máxima_establecida(updated_desc)

    si id_máximo_de_elección != topología.id_máximo_de_elección ||
      max_set_version != topología.max_set_version
    entonces
      @topology = topología::ReplicaSetWithPrimary.Nuevo(
        topología.opciones.fusionar(
          max_election_id: id_máximo_de_elección,
          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|
    si Server.dirección != updated_desc.dirección
      si Server.primario/a?
        Server.update_description(
          ::Mongo::Server::Descripción.Nuevo(
            Server.dirección,
            {},
            tiempo promedio de ida y vuelta: Server.Descripción.average_round_trip_time,
            minimum_round_trip_time: updated_desc.tiempo mínimo de ida y vuelta
          )
        )
      end
    end
  end

  servidores = add_servers_from_desc(updated_desc)
  remove_servers_not_in_desc(updated_desc)

  check_if_has_primary

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

#update_rs_with_primary_from_memberObject

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Actualiza una topología ReplicaSetWithPrimary desde un miembro no principal.



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

def update_rs_with_primary_from_member
  si topología.nombre_del_conjunto_de_réplicas != updated_desc.nombre_del_conjunto_de_réplicas
    advertencia de registro(
      "Removiendo servidor #{desc_actualizado.dirección.to_s} porque tiene un " +
      "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?
    advertencia de registro(
      "Removiendo servidor #{updated_desc.address.to_s} porque " +
      "se reportó como #{updated_desc.me}"
    )
    Remover
    check_if_has_primary
    return
  end

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

  a menos que tener_primario
    @topology = topología::Conjunto de réplicas no primario.Nuevo(
      topología.opciones, topología.Monitoring, sí mismo)
  end
end

#update_rs_without_primaryObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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



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

def update_rs_sin_primary
  si topología.nombre_del_conjunto_de_réplicas.nil?
    @topology = topología::Conjunto de réplicas no primario.Nuevo(
      topología.opciones.fusionar(nombre_replica_set: updated_desc.nombre_del_conjunto_de_réplicas),
      topología.Monitoring, sí mismo)
  end

  si topología.nombre_del_conjunto_de_réplicas != updated_desc.nombre_del_conjunto_de_réplicas
    advertencia de registro(
      "Removiendo servidor #{desc_actualizado.dirección.to_s} porque tiene un " +
      "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

  servidores = add_servers_from_desc(updated_desc)

  commit_changes

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

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

#update_server_descriptionsObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

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

def update_server_descriptions
  servers_list.cada hacer |Server|
    si 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
      a menos que updated_desc.topology_version_gte?(Server.Descripción)
        return false
      end

      @server_description_changed = Server.Descripción != updated_desc

      # Actualiza siempre la descripción del servidor, de modo que los campos que no
      # afectan las comparaciones de igualdad de descripción pero son 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
  end
  false
end

#update_unknown_with_standaloneObjeto

Este método forma parte de una API privada. Debe evitarlo 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.



200
201
202
203
204
205
206
207
208
209
210
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 200

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

#verify_invariantsObject

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.



656
657
658
659
660
661
662
663
664
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 656

def verificar_invariantes
  si Mongo::Lint.¿habilitado?
    si clúster.topología.¿Soltero/a?
      si clúster.servers_list.longitud > 1
        propagar Mongo::Error::LintError, "Intentandocrear una única topología con múltiples servidores: #{cluster.servers_list}"
      end
    end
  end
end