activerecord-mysql-reconnect 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDdmZDFhNjRlZDc1YWRhY2I0NmFhZTViZDA4MjEzN2RkMTJlMTRiZQ==
4
+ YmEzYzliYTU5N2ZmYjFkZGJjMGM0NmY3Yjc0NzhkYjhmM2YwZDBkNg==
5
5
  data.tar.gz: !binary |-
6
- ZWEwZGEwNGNmYTExNjA5MmRkYjcxOWZjYjMxMjk0ZjBjYTI3NzJhYw==
6
+ MzgwZjEzNmVjMmQwZTlhMDY4ZGU5MDY0MjZiNzJhODViMzBlMjYyYg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTE2ZTU2OTMxNTk4MzYyY2FiMzdlZWFhMDBlMjE1ZDlhMDBmYjk4OTQyN2Ji
10
- MDc1YzhmNjQ4ZGU5MWJmMWNlZDYzZTNlMTRjNTgwMjNmZTJmY2RhMDQxMzRi
11
- ODhjYmM1NmIyZTZmNGQzY2QyZDEyYzY3NjE2YmI5NmM4YTI5MzU=
9
+ Yjk2YWZlZDZiMDE0MzQ5ZWZkZjFjNDJkZjM2OTQxNDEwMWI0NjA5Zjg4NzRm
10
+ MjM4OWU3ZjdhNjY3MDkyMDMwYjIxNzVjZGM1Mzk1MGQ5NWQzMzI2NTFmMTg2
11
+ OTNmZDljMDViZmIyNmM5NDU0N2M2NWE0M2NmZTllNWFjOWJiMTk=
12
12
  data.tar.gz: !binary |-
13
- YzNhOTRmMTZiZTU0MmM4NTdiM2FkMDI2Y2QzZDkyMTA3ZTgwOGM4MjM5ZGY3
14
- YjcwZGUxNDE0ODE4MDkxNzM3Yzg2MWNmMmZjNDBmYWI0NTYyZDAzYmI1NjI2
15
- ZGI4YzIwZTZiNWU3Y2VmYjljNmIxMzhlYjJlYzlkNDg5NjRlYTM=
13
+ ZmFkYWY5YmJkOThhYzBhN2JmOGZlOTM3NDM4Mzg1OGE2ZDJjYTU5YzVjZDcz
14
+ YWEzMDZlZDJiMThmM2QwYzcwMDg0YmZhZDA4YjEwNDA5YWE0ZmUxNTc4NGFk
15
+ NWU3OWM1ZTZiOTYzYTFlNjNkZjNhZDA1ZWJjNDZjMWFkZjRiNTc=
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ activerecord-mysql-reconnect 0.3.1 (January 9, 2014)
2
+
3
+ * Retry mode is added
4
+
1
5
  activerecord-mysql-reconnect 0.3.0 (January 9, 2014)
2
6
 
3
7
  * Retry is disabled by default
data/README.md CHANGED
@@ -91,11 +91,17 @@ MyApp::Application.configure do
91
91
  config.active_record.enable_retry = true
92
92
  config.active_record.execution_tries = 10 # times
93
93
  config.active_record.execution_retry_wait = 1.5 # sec
94
- config.active_record.retry_read_only = false # default: true
94
+ config.active_record.retry_mode = :rw # default: `:r`, valid values: `:r`, `:rw`, `:force`
95
95
  ...
96
96
  ene
97
97
  ```
98
98
 
99
+ ## Retry mode
100
+
101
+ * `:r` Retry only SELECT / SHOW / SET
102
+ * `:rw` Retry in all SQL, but does not retry if `Lost connection` has happened in write SQL
103
+ * `:force` Retry in all SQL
104
+
99
105
  ## Running tests on local
100
106
 
101
107
  ```sh
@@ -46,6 +46,9 @@ module Activerecord::Mysql::Reconnect
46
46
 
47
47
  READ_SQL_REGEXP = /\A\s*(?:SELECT|SHOW|SET)\b/i
48
48
 
49
+ RETRY_MODES = [:r, :rw, :force]
50
+ DEFAULT_RETRY_MODE = :r
51
+
49
52
  class << self
50
53
  def execution_tries
51
54
  ActiveRecord::Base.execution_tries || DEFAULT_EXECUTION_TRIES
@@ -59,8 +62,16 @@ module Activerecord::Mysql::Reconnect
59
62
  !!ActiveRecord::Base.enable_retry
60
63
  end
61
64
 
62
- def retry_read_only
63
- !!ActiveRecord::Base.retry_read_only
65
+ def retry_mode=(v)
66
+ unless RETRY_MODES.include?(v)
67
+ raise "Invalid retry_mode. Please set one of the following: #{RETRY_MODES.map {|i| i.inspect }.join(', ')}"
68
+ end
69
+
70
+ @activerecord_mysql_reconnect_retry_mode = v
71
+ end
72
+
73
+ def retry_mode
74
+ @activerecord_mysql_reconnect_retry_mode || DEFAULT_RETRY_MODE
64
75
  end
65
76
 
66
77
  def retryable(opts)
@@ -145,8 +156,8 @@ module Activerecord::Mysql::Reconnect
145
156
  end
146
157
 
147
158
  def should_handle?(e, opts = {})
148
- sql = opts[:sql]
149
- read_only = opts[:read_only]
159
+ sql = opts[:sql]
160
+ retry_mode = opts[:retry_mode]
150
161
 
151
162
  if without_retry?
152
163
  return false
@@ -161,7 +172,11 @@ module Activerecord::Mysql::Reconnect
161
172
  end
162
173
 
163
174
  if sql and READ_SQL_REGEXP !~ sql
164
- if read_only or Regexp.union(HANDLE_R_ERROR_MESSAGES) =~ e.message
175
+ if retry_mode == :r
176
+ return false
177
+ end
178
+
179
+ if retry_mode != :force and Regexp.union(HANDLE_R_ERROR_MESSAGES) =~ e.message
165
180
  return false
166
181
  end
167
182
  end
@@ -37,7 +37,7 @@ class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
37
37
  sql_names = merge_transaction(sql, name)
38
38
  },
39
39
  :sql => sql,
40
- :read_only => Activerecord::Mysql::Reconnect.retry_read_only,
40
+ :retry_mode => Activerecord::Mysql::Reconnect.retry_mode,
41
41
  :connection => @connection
42
42
  )
43
43
  end
@@ -2,9 +2,19 @@ class ActiveRecord::Base
2
2
  class_attribute :execution_tries, :instance_accessor => false
3
3
  class_attribute :execution_retry_wait, :instance_accessor => false
4
4
  class_attribute :enable_retry, :instance_accessor => false
5
- class_attribute :retry_read_only, :instance_accessor => false, :default => true
5
+
6
+ RETRY_MODES = [:r, :rw, :force]
7
+ DEFAULT_RETRY_MODE = :r
6
8
 
7
9
  class << self
10
+ def retry_mode=(v)
11
+ Activerecord::Mysql::Reconnect.retry_mode = v
12
+ end
13
+
14
+ def retry_mode
15
+ Activerecord::Mysql::Reconnect.retry_mode
16
+ end
17
+
8
18
  def without_retry
9
19
  Activerecord::Mysql::Reconnect.without_retry do
10
20
  yield
@@ -1,7 +1,7 @@
1
1
  module Activerecord
2
2
  module Mysql
3
3
  module Reconnect
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.1'
5
5
  end
6
6
  end
7
7
  end
@@ -243,10 +243,16 @@ describe 'activerecord-mysql-reconnect' do
243
243
  end
244
244
 
245
245
  it 'lost connection' do
246
+ sql = "INSERT INTO `employees` (`birth_date`, `emp_no`, `first_name`, `hire_date`, `last_name`) VALUES ('2014-01-09 03:22:25', 1, '' + sleep(15) + '', '2014-01-09 03:22:25', 'Tiger')"
247
+
248
+ expect {
249
+ ActiveRecord::Base.connection.execute(sql)
250
+ }.to_not raise_error
251
+
246
252
  mysql2_error('Lost connection to MySQL server during query') do
247
253
  expect {
248
254
  th = thread_run {|do_stop|
249
- ActiveRecord::Base.connection.execute("INTO `employees` (`birth_date`, `emp_no`, `first_name`, `hire_date`, `last_name`) VALUES ('2014-01-09 03:22:25', 1, '' + sleep(15) + '', '2014-01-09 03:22:25', 'Tiger')")
255
+ ActiveRecord::Base.connection.execute(sql)
250
256
  }
251
257
 
252
258
  mysql_restart
@@ -254,4 +260,25 @@ describe 'activerecord-mysql-reconnect' do
254
260
  }.to raise_error(ActiveRecord::StatementInvalid)
255
261
  end
256
262
  end
263
+
264
+ it 'force retry' do
265
+ sql = "INSERT INTO `employees` (`birth_date`, `emp_no`, `first_name`, `hire_date`, `last_name`) VALUES ('2014-01-09 03:22:25', 1, '' + sleep(15) + '', '2014-01-09 03:22:25', 'Tiger')"
266
+
267
+ expect {
268
+ ActiveRecord::Base.connection.execute(sql)
269
+ }.to_not raise_error
270
+
271
+ mysql2_error('Lost connection to MySQL server during query') do
272
+ expect {
273
+ th = thread_run {|do_stop|
274
+ force_retry do
275
+ ActiveRecord::Base.connection.execute(sql)
276
+ end
277
+ }
278
+
279
+ mysql_restart
280
+ th.join
281
+ }.to_not raise_error
282
+ end
283
+ end
257
284
  end
@@ -49,11 +49,21 @@ end
49
49
 
50
50
  def enable_read_only
51
51
  begin
52
- expect(ActiveRecord::Base.retry_read_only).to be_false
53
- ActiveRecord::Base.retry_read_only = true
52
+ expect(ActiveRecord::Base.retry_mode).to eq(:rw)
53
+ ActiveRecord::Base.retry_mode = :r
54
54
  yield
55
55
  ensure
56
- ActiveRecord::Base.retry_read_only = false
56
+ ActiveRecord::Base.retry_mode = :rw
57
+ end
58
+ end
59
+
60
+ def force_retry
61
+ begin
62
+ expect(ActiveRecord::Base.retry_mode).to eq(:rw)
63
+ ActiveRecord::Base.retry_mode = :force
64
+ yield
65
+ ensure
66
+ ActiveRecord::Base.retry_mode = :rw
57
67
  end
58
68
  end
59
69
 
@@ -90,6 +100,6 @@ RSpec.configure do |config|
90
100
  ActiveRecord::Base.logger.formatter = proc {|_, _, _, message| "#{message}\n" }
91
101
  ActiveRecord::Base.enable_retry = true
92
102
  ActiveRecord::Base.execution_tries = 10
93
- ActiveRecord::Base.retry_read_only = false
103
+ ActiveRecord::Base.retry_mode = :rw
94
104
  end
95
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-mysql-reconnect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara