Skip to content
This repository was archived by the owner on Jun 17, 2024. It is now read-only.

Commit fdc1c38

Browse files
committed
✨ on_error 에 retriable 적용
1 parent e955fa6 commit fdc1c38

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

activerecord-mysql-reconnect.gemspec

+3
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ Gem::Specification.new do |spec|
2121
# '~> 4.2.6'
2222
spec.add_dependency 'activerecord'
2323
spec.add_dependency 'mysql2'
24+
spec.add_dependency 'retriable', '~> 3.1'
2425
spec.add_development_dependency 'bundler'
2526
spec.add_development_dependency 'rake'
2627
spec.add_development_dependency 'rspec', '>= 3.0.0'
2728
spec.add_development_dependency "appraisal"
29+
spec.add_development_dependency 'pry'
30+
spec.add_development_dependency 'amazing_print'
2831
end

lib/activerecord-mysql-reconnect.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'active_support'
2+
require 'retriable'
23

34
ActiveSupport.on_load :active_record do
45
require_relative 'activerecord/mysql/reconnect'
5-
end
6+
end

lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'retriable'
2+
13
module Activerecord::Mysql::Reconnect::ExecuteWithReconnect
24
def execute(sql, name = nil)
35
retryable(sql, name) do |sql_names|
@@ -15,6 +17,8 @@ def execute(sql, name = nil)
1517
class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
1618
prepend Activerecord::Mysql::Reconnect::ExecuteWithReconnect
1719

20+
FAILOVER_RETRY_INTERVALS = [0.2, 0.5, 1.0, 2.0, 3.0, 3.0, 3.0].freeze
21+
1822
private
1923

2024
def retryable(sql, name, &block)
@@ -23,7 +27,9 @@ def retryable(sql, name, &block)
2327
transaction = current_transaction
2428

2529
if sql =~ /\ABEGIN\z/i and transaction.is_a?(ActiveRecord::ConnectionAdapters::NullTransaction)
26-
def transaction.state; nil; end
30+
def transaction.state
31+
nil;
32+
end
2733
end
2834

2935
Activerecord::Mysql::Reconnect.retryable(
@@ -33,8 +39,10 @@ def transaction.state; nil; end
3339
:on_error => proc {
3440
unless block_with_reconnect
3541
block_with_reconnect = proc do |i|
36-
reconnect_without_retry!
37-
block.call(i)
42+
::Retriable.retriable(intervals: FAILOVER_RETRY_INTERVALS) do
43+
reconnect_without_retry!
44+
block.call(i)
45+
end
3846
end
3947
end
4048
},

0 commit comments

Comments
 (0)