Sha256: 0097b7f5d0d7a71c651e9fb5ac7dfdab589f1e47c8dee49ca547d5b102060986

Contents?: true

Size: 1.94 KB

Versions: 16

Compression:

Stored size: 1.94 KB

Contents

module Aws
  module Plugins
    module Retries

      # @api private
      # Used in 'standard' and 'adaptive' retry modes.
      class RetryQuota
        INITIAL_RETRY_TOKENS = 500
        RETRY_COST = 5
        NO_RETRY_INCREMENT = 1
        TIMEOUT_RETRY_COST = 10

        def initialize(opts = {})
          @mutex              = Mutex.new
          @max_capacity       = opts.fetch(:max_capacity, INITIAL_RETRY_TOKENS)
          @available_capacity = @max_capacity
        end

        # check if there is sufficient capacity to retry
        # and return it.  If there is insufficient capacity
        # return 0
        # @return [Integer] The amount of capacity checked out
        def checkout_capacity(error_inspector)
          @mutex.synchronize do
            capacity_amount = if error_inspector.networking?
                                TIMEOUT_RETRY_COST
                              else
                                RETRY_COST
                              end

            # unable to acquire capacity
            return 0 if capacity_amount > @available_capacity

            @available_capacity -= capacity_amount
            capacity_amount
          end
        end

        # capacity_amount refers to the amount of capacity requested from
        # the last retry.  It can either be RETRY_COST, TIMEOUT_RETRY_COST,
        # or unset.
        def release(capacity_amount)
          # Implementation note:  The release() method is called for
          # every API call.  In the common case where the request is
          # successful and we're at full capacity, we can avoid locking.
          # We can't exceed max capacity so there's no work we have to do.
          return if @available_capacity == @max_capacity

          @mutex.synchronize do
            @available_capacity += capacity_amount || NO_RETRY_INCREMENT
            @available_capacity = [@available_capacity, @max_capacity].min
          end
        end
      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
aws-sdk-core-3.100.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.99.2 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.99.1 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.99.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.98.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.97.1 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.97.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.96.1 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.96.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.95.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.94.1 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.94.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.93.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.92.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.91.1 lib/aws-sdk-core/plugins/retries/retry_quota.rb
aws-sdk-core-3.91.0 lib/aws-sdk-core/plugins/retries/retry_quota.rb