Clase: Mongo::clúster::SdamFlow Privado
- Hereda:
-
Objeto
- Objeto
- Mongo::clúster::SdamFlow
- 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
- #cluster ⇒ Object Solo lectura privado
- #original_desc ⇒ Objeto Solo lectura privado
- #previous_desc ⇒ objeto Solo lectura privado
-
#topología ⇒ Objeto
Solo lectura
privado
La topología almacenada en este atributo puede cambiar varias veces a lo largo de un solo flujo sdam (por ejemplo, desconocido -> RS sin primario -> RS con primario).
- #updated_desc ⇒ Object Solo lectura privado
Resumen del método de instancia colapsar
-
#add_servers_from_desc(updated_desc) ⇒ Array<Server>
privado
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.
- #¿esperado? ⇒ booleano privado
-
#se_volvió_desconocido? ⇒ Booleano
privado
Devuelve si el servidor cuya descripción procesó este flujo no era desconocido anteriormente y lo es ahora.
-
#check_if_has_primary ⇒ Objeto
privado
Comprueba si el clúster tiene un servidor principal y, si no lo tiene, cambia la topología a ReplicaSetNoPrimary.
-
#commit_changes ⇒ Object
privado
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.
- #disconnect_servers ⇒ Objeto privado
-
#do_remove(address_str) ⇒ Objeto
privado
Elimina el servidor especificado de la topología y advierte si la topología termina con una lista de servidores vacía como resultado.
-
#initialize(clúster, previous_desc, updated_desc, awaited: false) ⇒ SdamFlow
constructor
privado
Una nueva instancia de SdamFlow.
- #publish_description_change_event ⇒ Object privado
-
#remover ⇒ objeto
privado
Elimina del topología el servidor cuya descripción estamos procesando.
-
#remove_servers_not_in_desc(updated_desc) ⇒ Object
privado
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).
- #server_description_changed ⇒ Objeto privado
-
#está_desactualizado_principal? ⇒ booleano
privado
Si updated_desc es para un primario obsoleto.
-
#start_pool_if_data_bearing ⇒ objeto
privado
Si el servidor que se está procesando se identifica como portador de datos, se crea el pool de conexiones del servidor para que pueda comenzar a poblarse.
-
#¿topología_efectivamente_cambiada? ⇒ Booleano
privado
Devuelve si la topología cambió significativamente como resultado de la ejecución del flujo SDAM.
-
#update_rs_from_primary ⇒ Object
privado
Actualiza la topología que debe ser un ReplicaSetWithPrimary con información de la descripción del servidor principal.
-
#update_rs_with_primary_from_member ⇒ Object
privado
Actualiza una topología ReplicaSetWithPrimary desde un miembro no principal.
-
#update_rs_without_primary ⇒ Objeto
privado
Actualiza una topología ReplicaSetNoPrimary desde un miembro no primario.
-
#update_server_descriptions ⇒ Objeto
privado
Actualiza las descripciones de todos los servidores cuya dirección coincide con la dirección de updated_desc.
-
#update_unknown_with_standalone ⇒ objeto
privado
Transiciones de desconocido a un único tipo de topología, cuando se descubre un servidor autónomo.
- #verifica_invariantes ⇒ Objeto privado
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úster ⇒ 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.
40 41 42 |
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 40 def clúster @cluster end |
#orphinal_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.
56 57 58 |
# Archivo 'lib/mongo/cluster/sdam_flow.rb', línea 56 def original_desc @original_desc end |
#previous_desc ⇒ Object (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ía ⇒ Object (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.
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.
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.
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.
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.
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_primary ⇒ 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.
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., topología.Monitoring, sí mismo) end end |
#commit_changes ⇒ 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.
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., 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., topología.Monitoring, clúster) # Esto envía el evento SDAM clúster.update_topology(topología) end |
#disconnect_servers ⇒ 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.
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_evento ⇒ 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.
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 |
#eliminar ⇒ 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.
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_changed ⇒ 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.
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., topología.Monitoring, sí mismo) elsif updated_desc.primario/a? @topology = topología::ReplicaSetWithPrimary.Nuevo( topología..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..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., 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.
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_bearing ⇒ 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.
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.
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_primary ⇒ 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.
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..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..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..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_member ⇒ 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.
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., topología.Monitoring, sí mismo) end end |
#update_rs_without_primary ⇒ 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.
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..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_descriptions ⇒ 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.
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_standalone ⇒ 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.
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., 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_invariants ⇒ 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.
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 |