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 fue procesada por este flujo no era previamente desconocido, y ahora lo es.
-
#check_if_has_primary ⇒ Objeto
privado
Verifica si el clúster tiene un primario, y de no ser así, 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
Remueve 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
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).
- #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 en proceso se identifica como portador de datos, crea el pool de conexiones del servidor para que pueda empezar a llenarse.
-
#topology_effectively_changed? ⇒ 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 de ReplicaSetWithPrimary desde un miembro que no es primario.
-
#update_rs_without_primary ⇒ Objeto
privado
Actualiza una topología ReplicaSetNoPrimary desde un miembro no primario.
-
#update_server_descriptions ⇒ Object
privado
Actualiza las descripciones en todos los servidores cuya dirección coincida 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 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úster ⇒ 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 clúster @cluster end |
#orphinal_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 original_desc @original_desc end |
#previous_desc ⇒ Object (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ía ⇒ Object (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.
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.
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.
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.
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.
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_primary ⇒ 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.
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., topología.Monitoring, sí mismo ) end |
#commit_changes ⇒ 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.
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., 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., topología.Monitoring, clúster) # Esto envía el evento SDAM clúster.update_topology(topología) end |
#disconnect_servers ⇒ 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.
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_event ⇒ 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.
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 |
#remover ⇒ 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.
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_changed ⇒ 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.
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., topología.Monitoring, sí mismo) elsif updated_desc.primario/a? @topology = topología::ReplicaSetWithPrimary.Nuevo( topología..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..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., 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.
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_bearing ⇒ 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.
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.
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_primary ⇒ 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.
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..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..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..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_member ⇒ 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.
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., topología.Monitoring, sí mismo ) end |
#update_rs_without_primary ⇒ 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.
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..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_descriptions ⇒ 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.
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_standalone ⇒ 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.
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., 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_invariants ⇒ 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.
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 |