Module: OCI::Retry
- Defined in:
- lib/oci/retry/retry.rb,
lib/oci/retry/retry_config.rb,
lib/oci/retry/functions/sleep.rb,
lib/oci/retry/internal/retry_state.rb,
lib/oci/retry/functions/should_retry_on_error.rb
Overview
Module for retry strategies for use with the SDK when calling OCI services
Defined Under Namespace
Modules: Functions, Internal Classes: RetryConfig
Class Method Summary collapse
-
.default_retry_config ⇒ OCI::Retry::RetryConfig
Create a default retry configuration defined by OCI SDK.
-
.generate_opc_retry_token(token_length = 32) ⇒ String
Generates a token which can be used as a value for the opc-retry-token header value.
-
.make_retrying_call(retry_config, call_name: nil) ⇒ Object
Takes a block and then executes it with retries based on the provided configuration.
Class Method Details
.default_retry_config ⇒ OCI::Retry::RetryConfig
Create a default retry configuration defined by OCI SDK
75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/oci/retry/retry.rb', line 75 def self.default_retry_config OCI::Retry::RetryConfig.new( base_sleep_time_millis: 1000, exponential_growth_factor: 2, should_retry_exception_proc: OCI::Retry::Functions::ShouldRetryOnError.default_retry_strategy_proc, sleep_calc_millis_proc: OCI::Retry::Functions::Sleep.exponential_backoff_with_full_jitter, max_attempts: 7, max_elapsed_time_millis: 300_000, # 5 minutes max_sleep_between_attempts_millis: 30_000 ) end |
.generate_opc_retry_token(token_length = 32) ⇒ String
Generates a token which can be used as a value for the opc-retry-token header value. The token will consist of uppercase letters (A-Z), lowercase letters (a-z) and digits (0-9)
62 63 64 65 66 67 68 69 70 |
# File 'lib/oci/retry/retry.rb', line 62 def self.generate_opc_retry_token(token_length = 32) raise 'The token must be at least one character long' if token_length.nil? || token_length < 1 available_chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a retry_token = '' token_length.times { retry_token << available_chars[rand(available_chars.size)] } retry_token end |
.make_retrying_call(retry_config, call_name: nil) ⇒ Object
Takes a block and then executes it with retries based on the provided configuration.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/oci/retry/retry.rb', line 20 def self.(retry_config, call_name: nil) raise 'A block must be provided' unless block_given? # If no retry configuration has been given, just do a single call return yield if retry_config.nil? retry_state = OCI::Retry::Internal::RetryState.new retry_state.start loop do begin OCI.logger.debug("[RETRYING_CALL] #{call_name}") if OCI.logger return yield rescue => e # rubocop:disable Style/RescueStandardError retry_state.increment_attempts retry_state.last_exception = e if retry_config.should_retry?(retry_state) if OCI.logger OCI.logger.debug( "[RETRYING] #{call_name} failed. Sleeping then retrying. Retry state: #{retry_state}" ) end retry_config.do_sleep(retry_state) else if OCI.logger OCI.logger.debug( "[RETRIES_EXHAUSTED] #{call_name} failed and exhausted retries. Retry state: #{retry_state}" ) end raise end end end end |