クラス: Mongo::Retryable::WriteWorker Private

継承:
base Worker
  • オブジェクト
すべて表示
定義:
lib/mongo/retryable/write_worker.rb

Overview

このクラスは、プライベート API の一部です。 このクラスは将来削除または変更される可能性があるため、可能な限り使用しないでください。

書込み (write) 操作の再試行に関するロジックを実装します。

以来

  • 2.19.0

インスタンス属性の概要

baseworkerから継承される属性

#retryable

インスタンス メソッドの概要を折りたたむ

base Workerから継承されたメソッド

#initialize

コンストラクターの詳細

このクラスは、 Mongo::Retryable::BaseServerからコンストラクターを継承します。

インスタンス メソッドの詳細

#nro_write_with_retry(_write_concern, context:){{| connection, txn_num, context|... } ⇒ Object

このメソッドは、プライベート API の一部です。 このメソッドは将来削除または変更される可能性があるため、可能な限り使用しないでください。

最新の再試行可能な書込みをサポートしていない操作用の再試行可能な書込みラッパー。

ドライバーが最新の再試行可能な書込みを使用するように構成されている場合、このメソッドは渡されたブロックに一度だけ中断されるため、書込みの再試行は行われません。

ドライバーがレガシー再試行可能な書込みを使用するように構成されている場合、このメソッドは、レガシー ロジックを使用して書込み再試行を実行する legacy_write_with_retry に委任します。

パラメーター:

  • write_concern nil | Hash | WriteConcern::Base

    書込み保証 (write concern) 。

  • context コンテキスト

    操作のコンテキスト。

生成パラメータ:

  • 接続 (接続)

    書込み (write) が送信される接続。

  • txn_num (nil)

    トランザクション番号としての nil 。

  • context 操作::Context

    操作コンテキスト。

以来

  • 2.19.0



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.プライマリ, セッション)
  options = セッション&.クライアント&.options || {}

  場合 options[: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) が書込みの再試行をサポートしているかどうかをクエリします。

パラメーター:

  • セッション Mongo::Session

    操作が実行されるセッション。

  • write_concern nil | Hash | WriteConcern::Base

    書込み保証 (write concern) 。

次の値を返します。

  • true | false

    書込み (write) 再試行が許可されているかどうか。

以来

  • 2.19.0



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 が発生することに注意してください。

例:

書込み (write) を実行します。

write_with_retry do
  ...
end

パラメーター:

  • write_concern nil | Hash | WriteConcern::Base

    書込み保証 (write concern) 。

  • end_transaction true | false (デフォルトはfalse

    書込み操作が abortTransaction または commitTransaction の場合は true、それ以外の場合は false です。

  • context コンテキスト

    操作のコンテキスト。

  • ブロック Proc

    実行するブロック。

生成パラメータ:

  • 接続 (接続)

    書込み (write) が送信される接続。

  • txn_num (整数)

    トランザクション番号(ACID の種類ではありません)。

  • context 操作::Context

    操作コンテキスト。

次の値を返します。

  • 結果

    操作の結果。

以来

  • 2.1.0



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