123456789_123456789_123456789_123456789_123456789_

Class: ActiveRecord::ConnectionAdapters::RetryBudget

Do not use. This class is for internal use only.
Relationships & Source Files
Inherits: Object
Defined in: activerecord/lib/active_record/connection_adapters/retry_budget.rb

Overview

Tracks the remaining automatic-retry allowance for one unit of work against the database: a bounded number of attempts, an optional wall clock deadline, and whether a reconnect (permitted at most once, because reconnect! has its own internal retry loop) is still available.

Raw connection access and QueryIntent delivery share this bookkeeping, so one query draws on a single allowance wherever its retries occur.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(retries:, deadline:, reconnectable:) ⇒ RetryBudget

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 16

def initialize(retries:, deadline:, reconnectable:)
  @retries_total = retries
  @retries_remaining = retries
  @deadline = deadline
  @reconnectable = reconnectable
end

Instance Attribute Details

#available?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 35

def available?
  @retries_remaining > 0 && !expired?
end

#expired?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 31

def expired?
  @deadline ? @deadline < Process.clock_gettime(Process::CLOCK_MONOTONIC) : false
end

#reconnectable?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 23

def reconnectable?
  @reconnectable
end

#retries_remaining (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 14

attr_reader :retries_remaining

Instance Method Details

#attempts_used

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 46

def attempts_used
  @retries_total - @retries_remaining
end

#consume

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 39

def consume
  return false unless available?

  @retries_remaining -= 1
  true
end

#reconnect_consumed!

[ GitHub ]

  
# File 'activerecord/lib/active_record/connection_adapters/retry_budget.rb', line 27

def reconnect_consumed!
  @reconnectable = false
end