Skip to content

Instantly share code, notes, and snippets.

@honzasterba
Created August 6, 2022 11:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save honzasterba/29ecf3df3266ee9b5300ee75da289292 to your computer and use it in GitHub Desktop.
Save honzasterba/29ecf3df3266ee9b5300ee75da289292 to your computer and use it in GitHub Desktop.
retry for ActiveRecord::StatementInvalid
module DbUtils
def self.retry_with_reconnect
retried = false
begin
yield
rescue ActiveRecord::StatementInvalid => e
raise if retried
Rails.logger.info "Retrying after failed statement #{e}"
ActiveRecord::Base.connection.reconnect!
retried = true
retry
end
end
def self.retry_selects
old = Thread.current[:retry_select_all]
Thread.current[:retry_select_all] = true
yield
ensure
Thread.current[:retry_select_all] = old
end
module ::ActiveRecord::ConnectionAdapters::DatabaseStatements
alias_method :select_all_without_retry, :select_all
def select_all(arel, name = nil, binds = [], preparable: nil, async: false)
if Thread.current[:retry_select_all]
::DbUtils.retry_with_reconnect do
select_all_without_retry(arel, name, binds, preparable:, async:)
end
else
select_all_without_retry(arel, name, binds, preparable:, async:)
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment