クラス: Mongo::Retryable::WriteWorker Private
- 継承:
-
base Worker
- オブジェクト
- base Worker
- Mongo::Retryable::Writeworker
- 定義:
- lib/mongo/retryable/write_worker.rb
Overview
このクラスは、プライベート API の一部です。 このクラスは将来削除または変更される可能性があるため、可能な限り使用しないでください。
書込み (write) 操作の再試行に関するロジックを実装します。
インスタンス属性の概要
baseworkerから継承される属性
インスタンス メソッドの概要を折りたたむ
-
#nro_write_with_retry(_write_concern, context:){{| connection, txn_num, context|... } ⇒ Object
private
最新の再試行可能な書込みをサポートしていない操作用の再試行可能な書込みラッパー。
-
#retry_write_allowed? (セッション、書込み保証(write_concern)=true| false
private
セッションと書込み保証 (write concern) が書込みの再試行をサポートしているかどうかをクエリします。
-
# write_with_retry (write_concern, context:, ending_transaction: false, &lock) {| connection, txn_num, context|... } = 結果
private
渡されたブロックに 1 回以上ロックを解除することで、書き込み再試行機能を実装します。
base Workerから継承されたメソッド
コンストラクターの詳細
このクラスは、 Mongo::Retryable::BaseServerからコンストラクターを継承します。
インスタンス メソッドの詳細
#nro_write_with_retry(_write_concern, context:){{| connection, txn_num, context|... } ⇒ Object
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
最新の再試行可能な書込みをサポートしていない操作用の再試行可能な書込みラッパー。
ドライバーが最新の再試行可能な書込みを使用するように構成されている場合、このメソッドは渡されたブロックに一度だけ中断されるため、書込みの再試行は行われません。
ドライバーがレガシー再試行可能な書込みを使用するように構成されている場合、このメソッドは、レガシー ロジックを使用して書込み再試行を実行する legacy_write_with_retry に委任します。
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 |
ファイル 'lib/mongo/retryable/write_worker.rb' の検索行:105 デフォルト nro_write_with_retry(書き込み (write), context:, &ブロック) セッション = context.セッション サーバー = [select_server](クラスター, ServerSelector.プライマリ, セッション) = セッション&.クライアント&. || {} 場合 [:retry_writes] errors_count = 0 errors_to_ Ops Manager = nil begin サーバー.with_ connection(connection_ global_id: context.connection_ global_id) 行う |接続| ノードの数 接続, nil, context end ヘルプ エラー::TimeoutError 発生 ヘルプ *retryable_exceptions, エラー::PoolError, エラー::OperationFailure::ファミリー => e 場合 retryable_overload_error?(e) errors_count += 1 errors_to_ Ops Manager ||= e ただし、 e.respond_to?(: ラベル) & & e.ラベル('NoWritesPerformed') errors_to_ Ops Manager = e end 遅延 = retry_ policies.バックオフ_遅延(errors_count) 発生 errors_to_ Ops Manager ただし、 retry_ policies.Should_retry_overload?(errors_count, 遅延, context: context) log_retry(e, メッセージ: ' 書き込み再試行(オーバーロード バックオフ) ') 休止(遅延) begin サーバー = [select_server]( クラスター, ServerSelector.プライマリ, セッション, サーバー, エラー: e, timeout: context.retention_timeout_second ) ヘルプ エラー, エラー::AuthError => 選択_err errors_to_ Ops Manager.add_note(" 後で再試行に失敗しました: #{select_err.クラス}: #{select_err}") 発生 errors_to_ Ops Manager end RETRY else e.add_note(無効にされた を 再試行し ます) 発生 e end end else legacy_write_with_retry(サーバー, context: context, &ブロック) end end |
#retry_write_allowed? (セッション、書込み保証(write_concern)= true| false
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
セッションと書込み保証 (write concern) が書込みの再試行をサポートしているかどうかをクエリします。
159 160 161 162 163 |
ファイル 'lib/mongo/retryable/write_worker.rb' の検索行:159 デフォルト retry_write_allowed?(セッション, write_concern) return false ただし、 セッション&.retry_writes? write_concern.nil? || WriteConcern.得る(write_concern).確認済み? end |
# write_with_retry (write_concern, context:, ending_transaction: false, &lock) {| connection, txn_num, context|... } ⇒ 結果
このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。
これは部分的な書込みがまだ発生していないことを確認できる唯一のケースであるため、これはマスター以外の障害に対してのみ操作を再試行します。
渡されたブロックに 1 回以上ロックを解除することで、書き込み再試行機能を実装します。
セッションが提供され(つまり配置はセッションをサポートする)、クライアントで最新の再試行書込みが有効になっている場合、最新の再試行ロジックが呼び出されます。 それ以外の場合は、レガシー再試行ロジックが呼び出されます。
ending_transaction パラメータが true の場合、トランザクションがコミットまたは中止されることを示し、操作は 1 回だけ実行されます。 トランザクションにはセッションが必要なため、 end_transaction が true でセッションが nil の場合、このメソッドでは ArgmentError が発生することに注意してください。
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
ファイル 'lib/mongo/retryable/write_worker.rb' の検索行:63 デフォルト write_with_retry(write_concern, context:, termination_transaction: false, &ブロック) セッション = context.セッション concern_valid_rate(end_transaction, セッション) ただし、 end_transaction || retry_write_allowed?(セッション, write_concern) return legacy_write_with_retry(nil, context: context, &ブロック) end # ここでは、セッションは nil ではありません。 セッションが nil の場合 失敗した retry_write_allowed?チェックしてください。 サーバー = [select_server]( クラスター, ServerSelector.プライマリ, セッション, timeout: context.retention_timeout_second ) ただし、 end_transaction || サーバー.retry_writes? return legacy_write_with_retry(サーバー, context: context, &ブロック) end latest_write_with_retry(セッション, サーバー, context, &ブロック) end |