Clase: Mongo::Retryable::WriteWorker Privado
- Hereda:
-
BaseWorker
- Objeto
- BaseWorker
- Mongo::Retryable::WriteWorker
- Definido en:
- lib/mongo/retryable/write_worker.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.
Implementa la lógica relacionada con volver a intentar las operaciones de guardar.
Resumen del atributo de la instancia
Atributos heredados de BaseWorker
Resumen del método de instancia colapsar
-
#nro_write_with_retry(_write_concern, context:) {|connection, txn_num, context| ... } ⇒ Object
privado
Contenedor de escrituras reintentables para operaciones que no admiten escrituras reintentables modernas.
-
#reintento_de_escritura_permitido?(sesión, write_concern) ⇒ verdadero | falso
privado
Consulta si la sesión y el nivel de confirmación de escritura (write concern) admiten reintentos de escritura.
-
#write_with_retry(write_concern, context:, ending_transaction: false, &bloqueo) {|conexión, txn_num, contexto| ... } ⇒ Resultado
privado
Implementa la funcionalidad de reintento de escritura cediendo el bloque pasado una o más veces.
Métodos heredados de BaseWorker
Detalles del Constructor
Esta clase hereda un constructor de Mongo::Retryable::BaseWorker
Detalles del método de instancia
#nro_write_with_retry(_write_concern, context:) {|connection, txn_num, context| ... } ⇒ 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.
Contenedor de escrituras reintentables para operaciones que no admiten escrituras reintentables modernas.
Si el controlador está configurado para utilizar escrituras modernas que se pueden volver a intentar, este método cede al bloque pasado exactamente una vez, por lo tanto, no reintenta ninguna escritura.
Si el driver está configurado para usar escrituras reintentables heredadas, este método delega en legacy_write_with_retry, que realiza reintentos de escritura utilizando la lógica heredada.
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 |
# Archivo 'lib/mongo/retryable/write_worker.rb', línea 105 def nro_write_with_retry(guardar, context:, &bloque) sesión = context.sesión Server = select_server(clúster, ServerSelector.primario, sesión) = sesión&.Cliente&. || {} si [retry_writes] error_count = 0 error_to_raise = nulo begin Server.with_connection(connection_global_id: context.connection_global_id) hacer |Conexión| rendimiento Conexión, nulo, context end rescate Error::TimeoutError propagar rescate *retryable_exceptions, Error::PoolError, Error::OperationFailure::Familia => e si retryable_overload_error?(e) error_count += 1 error_to_raise ||= e a menos que e.respond_to?(Etiqueta:) && e.¿etiqueta?('NoSeRealizaronEscrituras') error_to_raise = e end retrasar = retry_policy.retraso_de_respaldo(error_count) propagar error_to_raise a menos que retry_policy.should_retry_overload?(error_count, retrasar, context: context) reintento_de_registro(e, mensaje: 'Guardar reintento (espera por sobrecarga)') sueño(retrasar) begin Server = select_server( clúster, ServerSelector.primario, sesión, Server, error: e, timeout: context.remaining_timeout_sec ) rescate Error, Error::AuthError => select_err error_to_raise.add_note("el reintento posterior falló: #{select_err.clase}: #{select_err}") propagar error_to_raise end reintentar else e.add_note('reintentos deshabilitados') propagar e end end else legacy_write_with_retry(Server, context: context, &bloque) end end |
#¿retry_write_allowed?(sesión, write_concern) ⇒ true | false
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.
Consulta si la sesión y el nivel de confirmación de escritura (write concern) admiten reintentos de escritura.
159 160 161 162 163 |
# Archivo 'lib/mongo/retryable/write_worker.rb', línea 159 def ¿se_permite_reintentar_escritura?(sesión, write_concern) return false a menos que sesión&.¿retry_writes? write_concern.nil? || Nivel de confirmación de escritura (write concern).Obtener(write_concern).¿entendido? end |
#escribir_con_reintento(write_concern, context:, ending_transaction: false, &block) {|connection, txn_num, context| ... } ⇒ Resultado
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.
Esto solo reintenta operaciones en fallos que no sean de maestro, ya que es el único caso en el que podemos estar seguros de que un guardado parcial no ha ocurrido ya.
Implementa la funcionalidad de reintento de escritura cediendo el bloque pasado una o más veces.
Si se proporciona la sesión (por lo tanto, la implementación admite sesiones) y los reintentos de escritura modernos están habilitados en el cliente, se invoca la lógica de reintento moderna. De lo contrario, se invoca la lógica de reintento heredada.
Si el parámetro ending_transaction es verdadero, lo que indica que se está confirmando o abortando una transacción, la operación se ejecuta exactamente una vez. Ten en cuenta que, dado que las transacciones requieren sesiones, este método generará ArgumentError si ending_transaction es verdadero y session es nil.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# Archivo 'lib/mongo/retryable/write_worker.rb', línea 63 def escribir_con_reintento(write_concern, context:, ending_transaction: false, &bloque) sesión = context.sesión ensure_valid_state!(ending_transaction, sesión) a menos que ending_transaction || ¿se_permite_reintentar_escritura?(sesión, write_concern) return legacy_write_with_retry(nulo, context: context, &bloque) end # Si estamos aquí, la sesión no es nula. Una sesión nula sería # comprobación failed retry_write_allowed? fallida. Server = select_server( clúster, ServerSelector.primario, sesión, timeout: context.remaining_timeout_sec ) a menos que ending_transaction || Server.¿retry_writes? return legacy_write_with_retry(Server, context: context, &bloque) end modern_write_with_retry(sesión, Server, context, &bloque) end |