클래스: Mongo::Retryable::WriteWorker Private

상속:
Base Worker 모두 표시
다음에 정의됨:
lib/ Mongo/retryable/write_Worker.rb

개요

이 클래스는 비공개 API의 일부입니다. 이 클래스는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

쓰기 작업 재시도와 관련된 로직을 구현합니다.

이후:

  • 2.19.0

인스턴스 속성 요약

BaseWorker에서 상속된 속성

#retryable

인스턴스 메서드 요약 접기

BaseWorker에서 상속된 메서드

#initialize

생성자 세부 정보

이 클래스는 Mongo::Retryable::BaseWorker에서 생성자를 상속합니다.

인스턴스 메서드 세부 정보

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

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

최신 재시도 가능 쓰기를 지원하지 않는 작업에 대한 재시도 가능 쓰기 래퍼입니다.

운전자 가 최신 재시도 가능 쓰기를 사용하도록 구성된 경우 이 메서드는 전달된 차단 에 정확히 한 번만 양보하므로 쓰기를 재시도하지 않습니다.

운전자 가 레거시 재시도 가능 쓰기를 사용하도록 구성된 경우 이 메서드는 레거시 로직을 사용하여 쓰기 (write) 재시도를 수행하는 legacy_write_with_retry에 위임됩니다.

매개변수:

  • write_concern (nil | 해시 | WriteConcern::Base)

    쓰기 고려 (write concern).

  • 컨텍스트 (컨텍스트)

    작업의 컨텍스트입니다.

수율 매개변수:

  • 연결 (연결)

    쓰기를 전송해야 하는 연결입니다.

  • txn_num (nil)

    nil을 트랜잭션 번호로 지정합니다.

  • 컨텍스트 (Operation::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

def nro_write_with_retry(쓰기 (write), 컨텍스트:, &차단)
  Session = 컨텍스트.Session
  서버 = select_server(cluster, ServerSelector.기본, Session)
  옵션 = Session&.고객&.옵션 || {}

  만약 옵션[:retry_writes]
    error_count = 0
    error_to_raise = nil
    시작
      서버.with_connection(connection_global_id: 컨텍스트.connection_global_id) do |연결|
        yield 연결, nil, 컨텍스트
      end
    구출 오류::시간 초과 오류
      올리다
    구출 *retryable_exceptions, 오류::풀 오류, 오류::OperationFailure::패밀리 => e
      만약 retryable_overload_error?(e)
        error_count += 1
        error_to_raise ||= e
        하지 않는 한 e.response_to?(:label?) && e.레이블?('NoWritesPerformed')
          error_to_raise = e
        end
        지연 = retry_policy.backoff_delay(error_count)
        올리다 error_to_raise 하지 않는 한 retry_policy.should_retry_overload?(error_count, 지연, 컨텍스트: 컨텍스트)

        log_retry(e, 메시지: '쓰기 재시도 (오버로드 백오프)')
        sleep(지연)
        시작
          서버 = select_server(
            cluster, ServerSelector.기본, Session, 서버,
            오류: e, timeout: 컨텍스트.나머지_시간 초과_초
          )
        구출 오류, 오류::AuthError => select_err
          error_to_raise.add_note("나중에 재시도 실패: #{select_err.클래스}: #{select_err}")
          올리다 error_to_raise
        end
        재시도
      other
        e.add_note('재시도 비활성화')
        올리다 e
      end
    end
  other
    legacy_write_with_retry(서버, 컨텍스트: 컨텍스트, &차단)
  end
end

#retry_write_allowed?(session, write_concern) ⇒ true | false

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

세션 및 쓰기 고려가 쓰기 재시도를 지원하는지 여부를 쿼리합니다.

매개변수:

반환합니다:

  • (true | false)

    쓰기 재시도 허용 여부입니다.

이후:

  • 2.19.0



159
160
161
162
163
# 파일 'lib/ Mongo/retryable/write_Worker.rb', 줄 159

def retry_write_allowed?(Session, write_concern)
  반환 거짓 하지 않는 한 Session&.retry_writes?

  write_concern.nil? || writeConcern.get(write_concern).인정?
end

#write_with_retry(write_concern, context:,ending_transaction: false, &block) {|connection, txn_num, context|... } ⇒ 결과

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

참고:

이는 부분 쓰기가 아직 발생하지 않았음을 확신할 수 있는 유일한 경우이므로 마스터가 아닌 장애에서만 작업을 재시도합니다.

전달된 차단 에 한 번 이상 양보하여 쓰기 (write) 재시도 기능을 구현합니다.

세션이 제공되고(따라서 배포에서 세션을 지원함) 클라이언트에서 최신 재시도 쓰기가 활성화된 경우 최신 재시도 로직이 호출됩니다. 그렇지 않으면 레거시 재시도 로직이 호출됩니다.

end_transaction 매개 변수가 true(트랜잭션이 커밋 또는 중단 중임을 나타냅니다)인 경우 작업은 정확히 한 번 실행됩니다. 트랜잭션에는 세션이 필요하므로 종료_트랜잭션이 true이고 세션이 nil인 경우 이 메서드는 ArgumentError를 발생시킵니다.

예시:

쓰기 (write) 를 실행합니다.

write_with_retry do
  ...
end

매개변수:

  • write_concern (nil | 해시 | WriteConcern::Base)

    쓰기 고려 (write concern).

  • end_transaction (true | false) (기본값은 false)

    쓰기 (write) 작업이 abortTransaction 또는 commitTransaction이면 true이고, 그렇지 않으면 false입니다.

  • 컨텍스트 (컨텍스트)

    작업의 컨텍스트입니다.

  • 차단 (Proc)

    실행할 차단 입니다.

수율 매개변수:

  • 연결 (연결)

    쓰기를 전송해야 하는 연결입니다.

  • txn_num (정수)

    트랜잭션 번호( ACID 종류가 아님).

  • 컨텍스트 (Operation::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

def write_with_retry(write_concern, 컨텍스트:, end_transaction: 거짓, &차단)
  Session = 컨텍스트.Session

  sure_valid_state!(end_transaction, Session)

  하지 않는 한 end_transaction || retry_write_allowed?(Session, write_concern)
    반환 legacy_write_with_retry(nil, 컨텍스트: 컨텍스트, &차단)
  end

  # 우리가 여기에 있다면 세션은 nil이 아닙니다. 세션이 nil이면
  # 실패한 retry_write_allowed? 확인합니다.

  서버 = select_server(
    cluster, ServerSelector.기본,
    Session,
    timeout: 컨텍스트.나머지_시간 초과_초
  )

  하지 않는 한 end_transaction || 서버.retry_writes?
    반환 legacy_write_with_retry(서버, 컨텍스트: 컨텍스트, &차단)
  end

  Modern_write_with_retry(Session, 서버, 컨텍스트, &차단)
end