From 69e85f834855eb12ad3280e26c2a0da49521d9bf Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Thu, 3 Aug 2023 10:56:56 -0500 Subject: [PATCH 01/15] Override raw_execute to be compatible with Rails 7+ --- .../mysql/reconnect/abstract_mysql_adapter_ext.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb b/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb index cc190ac..0f39fd1 100644 --- a/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb +++ b/lib/activerecord/mysql/reconnect/abstract_mysql_adapter_ext.rb @@ -1,10 +1,10 @@ module Activerecord::Mysql::Reconnect::ExecuteWithReconnect - def execute(sql, name = nil) + def raw_execute(sql, name, async: false) retryable(sql, name) do |sql_names| retval = nil sql_names.each do |s, n| - retval = super(s, n) + retval = super(s, n, async:) end retval From 6d986018342a21cc36b3ff43671cf1f5dc8fd76a Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Thu, 3 Aug 2023 11:00:45 -0500 Subject: [PATCH 02/15] Add a changelog and bump version for release --- CHANGELOG.md | 5 +++++ lib/activerecord/mysql/reconnect/version.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ee440da --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## [1.0.0](https://github.com/planningcenter/activerecord-mysql-reconnect/releases/tag/v1.0.0) - 2023-08-03 + +- FIX: Change overridden method name from `execute` to `raw_execute` to work with Rails 7+ diff --git a/lib/activerecord/mysql/reconnect/version.rb b/lib/activerecord/mysql/reconnect/version.rb index 697f6ae..d451b1a 100644 --- a/lib/activerecord/mysql/reconnect/version.rb +++ b/lib/activerecord/mysql/reconnect/version.rb @@ -1,7 +1,7 @@ module Activerecord module Mysql module Reconnect - VERSION = '0.5.0' + VERSION = '1.0.0' end end end From d87e8d2ba7a43eefa4cc87778efc03b750bf6d7d Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 12:45:36 -0500 Subject: [PATCH 03/15] Update Appraisals to run on modern Rails --- Appraisals | 27 ++++--------------- gemfiles/activerecord_4.2.gemfile | 8 ------ gemfiles/activerecord_5.0.gemfile | 7 ----- gemfiles/activerecord_5.1.gemfile | 7 ----- gemfiles/activerecord_5.2.gemfile | 7 ----- ...d_6.0.gemfile => activerecord_7.0.gemfile} | 2 +- gemfiles/activerecord_master.gemfile | 7 ----- 7 files changed, 6 insertions(+), 59 deletions(-) delete mode 100644 gemfiles/activerecord_4.2.gemfile delete mode 100644 gemfiles/activerecord_5.0.gemfile delete mode 100644 gemfiles/activerecord_5.1.gemfile delete mode 100644 gemfiles/activerecord_5.2.gemfile rename gemfiles/{activerecord_6.0.gemfile => activerecord_7.0.gemfile} (74%) delete mode 100644 gemfiles/activerecord_master.gemfile diff --git a/Appraisals b/Appraisals index c8f84b7..aa0563c 100644 --- a/Appraisals +++ b/Appraisals @@ -1,24 +1,7 @@ -appraise "activerecord-4.2" do - gem "activerecord", "~> 4.2.0" - gem "mysql2", "< 0.5" +appraise "activerecord-7.0" do + gem "activerecord", "~> 7.0.0" end -appraise "activerecord-5.0" do - gem "activerecord", "~> 5.0.0" -end - -appraise "activerecord-5.1" do - gem "activerecord", "~> 5.1.0" -end - -appraise "activerecord-5.2" do - gem "activerecord", "~> 5.2.0" -end - -appraise "activerecord-6.0" do - gem "activerecord", "~> 6.0.2" -end - -appraise "activerecord-master" do - gem "activerecord", git: "https://github.com/rails/rails.git" -end +#appraise "activerecord-master" do +# gem "activerecord", git: "https://github.com/rails/rails.git" +#end diff --git a/gemfiles/activerecord_4.2.gemfile b/gemfiles/activerecord_4.2.gemfile deleted file mode 100644 index 193449b..0000000 --- a/gemfiles/activerecord_4.2.gemfile +++ /dev/null @@ -1,8 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 4.2.0" -gem "mysql2", "< 0.5" - -gemspec path: "../" diff --git a/gemfiles/activerecord_5.0.gemfile b/gemfiles/activerecord_5.0.gemfile deleted file mode 100644 index a7a9bb0..0000000 --- a/gemfiles/activerecord_5.0.gemfile +++ /dev/null @@ -1,7 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 5.0.0" - -gemspec path: "../" diff --git a/gemfiles/activerecord_5.1.gemfile b/gemfiles/activerecord_5.1.gemfile deleted file mode 100644 index e2f8f85..0000000 --- a/gemfiles/activerecord_5.1.gemfile +++ /dev/null @@ -1,7 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 5.1.0" - -gemspec path: "../" diff --git a/gemfiles/activerecord_5.2.gemfile b/gemfiles/activerecord_5.2.gemfile deleted file mode 100644 index 027888d..0000000 --- a/gemfiles/activerecord_5.2.gemfile +++ /dev/null @@ -1,7 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", "~> 5.2.0" - -gemspec path: "../" diff --git a/gemfiles/activerecord_6.0.gemfile b/gemfiles/activerecord_7.0.gemfile similarity index 74% rename from gemfiles/activerecord_6.0.gemfile rename to gemfiles/activerecord_7.0.gemfile index fe660bc..bc1dfc9 100644 --- a/gemfiles/activerecord_6.0.gemfile +++ b/gemfiles/activerecord_7.0.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "activerecord", "~> 6.0.2" +gem "activerecord", "~> 7.0.0" gemspec path: "../" diff --git a/gemfiles/activerecord_master.gemfile b/gemfiles/activerecord_master.gemfile deleted file mode 100644 index 8980228..0000000 --- a/gemfiles/activerecord_master.gemfile +++ /dev/null @@ -1,7 +0,0 @@ -# This file was generated by Appraisal - -source "https://rubygems.org" - -gem "activerecord", git: "https://github.com/rails/rails.git" - -gemspec path: "../" From e04a29f177b8143a42203f819da6e88805db3f93 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 12:45:55 -0500 Subject: [PATCH 04/15] Depend on ActiveRecord 7 and up --- activerecord-mysql-reconnect.gemspec | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/activerecord-mysql-reconnect.gemspec b/activerecord-mysql-reconnect.gemspec index 49769e6..af0d332 100644 --- a/activerecord-mysql-reconnect.gemspec +++ b/activerecord-mysql-reconnect.gemspec @@ -18,8 +18,7 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ['lib'] - # '~> 4.2.6' - spec.add_dependency 'activerecord' + spec.add_dependency 'activerecord', '>= 7' spec.add_dependency 'mysql2' spec.add_development_dependency 'bundler' spec.add_development_dependency 'rake' From df0d731df4e92374a2627e19ef927fb0802ee558 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 12:46:13 -0500 Subject: [PATCH 05/15] Fix docker-compose config format --- docker-compose.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0b89c0c..c2832fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,7 @@ -mysql_for_ar_mysql_reconn: - image: "mysql:5.6" - ports: - - "14407:3306" - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: "yes" +services: + mysql: + image: "mysql:5.6" + ports: + - "14407:3306" + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: "yes" From 64f35efeab8abb055abff8288e78dd75c1a8e218 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 16:58:21 -0500 Subject: [PATCH 06/15] Add GitHub workflow for specs --- .github/workflows/specs.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/specs.yml diff --git a/.github/workflows/specs.yml b/.github/workflows/specs.yml new file mode 100644 index 0000000..fca85d2 --- /dev/null +++ b/.github/workflows/specs.yml @@ -0,0 +1,21 @@ +name: Specs +on: + push: + branches: [main] + pull_request: + branches: [main] +jobs: + run-rspec: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Setup Ruby and install gems + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1 + bundler-cache: true + - name: Install gems with Appraisal + run: bundle exec appraisal install + - name: Run RSpec + run: bundle exec appraisal rspec From 84ddf397004c407f4e4ee2696e242c9420bdbe9d Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 12:58:01 -0500 Subject: [PATCH 07/15] Mark unsafe sql as safe for this spec --- spec/activerecord-mysql-reconnect_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index 9087c51..cba2ac4 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -60,7 +60,7 @@ context 'wehn select on other thread' do specify do th = thread_start { - expect(Employee.where(:id => 1).pluck('sleep(10) * 0 + 3')).to eq [3] + expect(Employee.where(:id => 1).pluck(Arel.sql('sleep(10) * 0 + 3'))).to eq [3] } MysqlServer.restart From c9acfa706eba4e978e921dd2d1f8b8272a5d2e16 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 13:33:17 -0500 Subject: [PATCH 08/15] Also handle ActiveRecord::DatabaseConnectionError --- lib/activerecord/mysql/reconnect.rb | 2 + spec/activerecord-mysql-reconnect_spec.rb | 45 +++++++---------------- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/lib/activerecord/mysql/reconnect.rb b/lib/activerecord/mysql/reconnect.rb index 2a3322f..4717f5f 100644 --- a/lib/activerecord/mysql/reconnect.rb +++ b/lib/activerecord/mysql/reconnect.rb @@ -26,6 +26,7 @@ module Activerecord::Mysql::Reconnect HANDLE_ERROR = [ ActiveRecord::ConnectionNotEstablished, + ActiveRecord::DatabaseConnectionError, ActiveRecord::StatementInvalid, Mysql2::Error, ] @@ -47,6 +48,7 @@ module Activerecord::Mysql::Reconnect lost_connection: "Lost connection to MySQL server at 'reading initial communication packet'", not_connected: "MySQL client is not connected", killed: 'Connection was killed', + issue_connecting: 'There is an issue connecting with your hostname', } READ_SQL_REGEXP = /\A\s*(?:SELECT|SHOW|SET)\b/i diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index cba2ac4..175fb1f 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -451,39 +451,29 @@ "%s (cause: %s, sql: SELECT `employees`.* FROM `employees`, connection: host=127.0.0.1;database=employees;username=root)" end - let(:mysql_error) do - Mysql2::Error.const_defined?(:ConnectionError) ? Mysql2::Error::ConnectionError : Mysql2::Error - end - before do - allow_any_instance_of(mysql_error).to receive(:message).and_return('Lost connection to MySQL server during query') + allow_any_instance_of(Mysql2::Error::ConnectionError).to receive(:message).and_return('Lost connection to MySQL server during query') + allow_any_instance_of(ActiveRecord::StatementInvalid).to receive(:message).and_return('Lost connection to MySQL server during query') + allow_any_instance_of(ActiveRecord::DatabaseConnectionError).to receive(:message).and_return('Lost connection to MySQL server during query') end context "when retry failed " do specify do - if ActiveRecord::VERSION::MAJOR < 6 - expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ - "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", - "#{mysql_error}: Lost connection to MySQL server during query: SELECT `employees`.* FROM `employees` [ActiveRecord::StatementInvalid]", - ]) - else - expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ - "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", - "#{mysql_error}: Lost connection to MySQL server during query [ActiveRecord::StatementInvalid]", - ]) - end - + expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ + "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", + "Lost connection to MySQL server during query [ActiveRecord::StatementInvalid]", + ]) (1.0..4.5).step(0.5).each do |sec| expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ "MySQL server has gone away. Trying to reconnect in #{sec} seconds.", - "Lost connection to MySQL server during query [#{mysql_error}]", + "Lost connection to MySQL server during query [ActiveRecord::DatabaseConnectionError]", ]) end expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ "Query retry failed.", - "Lost connection to MySQL server during query [#{mysql_error}]", + "Lost connection to MySQL server during query [ActiveRecord::DatabaseConnectionError]", ]) expect(Employee.all.length).to eq 1000 @@ -491,23 +481,16 @@ expect { Employee.all.length - }.to raise_error(mysql_error) + }.to raise_error(ActiveRecord::DatabaseConnectionError) end end context "when retry succeeded" do specify do - if ActiveRecord::VERSION::MAJOR < 6 - expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ - "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", - "#{mysql_error}: Lost connection to MySQL server during query: SELECT `employees`.* FROM `employees` [ActiveRecord::StatementInvalid]", - ]) - else - expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ - "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", - "#{mysql_error}: Lost connection to MySQL server during query [ActiveRecord::StatementInvalid]", - ]) - end + expect(ActiveRecord::Base.logger).to receive(:warn).with(warning_template % [ + "MySQL server has gone away. Trying to reconnect in 0.5 seconds.", + "Lost connection to MySQL server during query [ActiveRecord::StatementInvalid]", + ]) expect(Employee.all.length).to eq 1000 MysqlServer.restart From 603738b8fbdc513fd28607169d62c484f63c1238 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 13:36:04 -0500 Subject: [PATCH 09/15] Fix typos --- spec/activerecord-mysql-reconnect_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index 175fb1f..75314ec 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -49,7 +49,7 @@ end end - context 'when count on same thead' do + context 'when count on same thread' do specify do expect(Employee.count).to eq 1000 MysqlServer.restart @@ -57,7 +57,7 @@ end end - context 'wehn select on other thread' do + context 'when select on other thread' do specify do th = thread_start { expect(Employee.where(:id => 1).pluck(Arel.sql('sleep(10) * 0 + 3'))).to eq [3] From fbccb64e10e5a139b067bcc73b7704ce3f0a0ca4 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 17:57:16 -0500 Subject: [PATCH 10/15] Test with MySQL 8 --- docker-compose.yml | 2 +- spec/activerecord-mysql-reconnect_spec.rb | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c2832fa..cc42b19 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: mysql: - image: "mysql:5.6" + image: "mysql:8" ports: - "14407:3306" environment: diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index 75314ec..8aa30c4 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -113,14 +113,8 @@ specify do th = thread_start { - emp = Employee.create( - :emp_no => 9999, - :birth_date => Time.now, - # wait 10 sec - :first_name => "' + sleep(10) + '", - :last_name => 'Tiger', - :hire_date => Time.now - ) + id = ActiveRecord::Base.connection.insert("insert into employees (emp_no, birth_date, hire_date, first_name, last_name) values (sleep(10) + 9998, '2000-01-01', '2023-08-16', 'Daniel', 'Tiger')", returning: 'id') + emp = Employee.find(id) expect(emp.id).to eq 1001 expect(emp.emp_no).to eq 9999 From 0f843102a469913a29ea3eb8065087bdf7f57665 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 18:47:51 -0500 Subject: [PATCH 11/15] Fix spec for MySQL 8, where auto_increment still goes up --- spec/activerecord-mysql-reconnect_spec.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index 8aa30c4..300bb24 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -208,6 +208,9 @@ MysqlServer.restart + # record is lost + expect { emp.reload }.to raise_error(ActiveRecord::RecordNotFound) + emp = Employee.create( :emp_no => 9998, :birth_date => Time.now, @@ -217,7 +220,8 @@ ) # NOTE: Ignore the transaction on :rw mode - expect(emp.id).to eq 1001 + + expect(emp.id).to eq 1002 # auto_increment still goes up expect(emp.emp_no).to eq 9998 end From fdce52165d6a6e615432b0a048c4031e21b8da5c Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 18:48:09 -0500 Subject: [PATCH 12/15] Update badge and words in readme --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3b141ee..d978dd2 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # activerecord-mysql-reconnect -It is the library to reconnect automatically when ActiveRecord is disconnected from MySQL. +Reconnect automatically when ActiveRecord is disconnected from MySQL. Supports Rails 7+ and MySQL 8. -[![Gem Version](https://badge.fury.io/rb/activerecord-mysql-reconnect.svg)](http://badge.fury.io/rb/activerecord-mysql-reconnect) -[![Build Status](https://travis-ci.org/winebarrel/activerecord-mysql-reconnect.svg?branch=master)](https://travis-ci.org/winebarrel/activerecord-mysql-reconnect) +[![Specs](https://github.com/planningcenter/activerecord-mysql-reconnect/actions/workflows/specs.yml/badge.svg)](https://github.com/planningcenter/activerecord-mysql-reconnect/actions/workflows/specs.yml) ## Installation From 1a07c9555a3dd68a70b184f045979c2177f05399 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Wed, 16 Aug 2023 19:21:46 -0500 Subject: [PATCH 13/15] Combine old and new changelog, update with undocumented versions --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- ChangeLog | 31 ------------------------------- 2 files changed, 49 insertions(+), 34 deletions(-) delete mode 100644 ChangeLog diff --git a/CHANGELOG.md b/CHANGELOG.md index ee440da..e4dded8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ -# Changelog +## 1.0.0 (unreleased) -## [1.0.0](https://github.com/planningcenter/activerecord-mysql-reconnect/releases/tag/v1.0.0) - 2023-08-03 +- Feature: Add support for Rails 7 +- Change: Drop support for older versions +- Chore: Test against MySQL 8 +- Fix: Handle ActiveRecord::ConnectionNotEstablished errors too -- FIX: Change overridden method name from `execute` to `raw_execute` to work with Rails 7+ +## 0.5.0 (Jan 29, 2020) + +- Change error message for Rails 6.0 +- Load database config from db_config instead +- Add Active Record 6.0 and master to build matrix + +## 0.4.2 (Aug 15, 2018) + +- Add activerecord-5.2 test +- Add error messages accessor +- Fix mysql2 dependency +- Added "Connection was killed" as an error string to reconnect on. + +## 0.4.1 (Aug 8, 2016) + +- Support AR 5.0 (RP#5 @ssig33) +- Fix test (use docker-compose) + +## 0.4.0 (Mar 22, 2016) + +- Remove `retryable_transaction` +- Disable support AR 3.x 4.0 + +## 0.3.3 (Jan 18, 2014) + +- use BigDecimal for sleep +- add handling error ('The MySQL server is running with the --read-only...') + +## 0.3.1 (Jan 9, 2014) + +- Retry mode is added + +## 0.3.0 (Jan 9, 2014) + +- Retry is disabled by default +- Read-only mode is added + +## 0.2.0 (Jan 4, 2014) + +- Retry transaction is supported + +## 0.1.0 (Oct 11, 2013) + +- activerecord-mysql-reconnect is released diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index cbb8d89..0000000 --- a/ChangeLog +++ /dev/null @@ -1,31 +0,0 @@ -activerecord-mysql-reconnect 0.4.1 (Aug 8, 2016) - - * Support AR 5.0 (RP#5 @ssig33) - * Fix test (use docker-compose) - -activerecord-mysql-reconnect 0.4.0 (Mar 22, 2016) - - * Remove `retryable_transaction` - * Disable support AR 3.x 4.0 - -activerecord-mysql-reconnect 0.3.3 (Jan 18, 2014) - - * use BigDecimal for sleep - * add handling error ('The MySQL server is running with the --read-only...') - -activerecord-mysql-reconnect 0.3.1 (Jan 9, 2014) - - * Retry mode is added - -activerecord-mysql-reconnect 0.3.0 (Jan 9, 2014) - - * Retry is disabled by default - * Read-only mode is added - -activerecord-mysql-reconnect 0.2.0 (Jan 4, 2014) - - * Retry transaction is supported - -activerecord-mysql-reconnect 0.1.0 (Oct 11, 2013) - - * activerecord-mysql-reconnect is released From 0d747504bec731e4837c6e5ebfe3805252d71de9 Mon Sep 17 00:00:00 2001 From: Tim Morgan Date: Thu, 17 Aug 2023 10:43:31 -0500 Subject: [PATCH 14/15] Do not retry on ActiveRecord::StatementTimeout errors --- CHANGELOG.md | 1 + lib/activerecord/mysql/reconnect.rb | 8 ++++++++ spec/activerecord-mysql-reconnect_spec.rb | 9 +++++++++ 3 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4dded8..1eae719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Change: Drop support for older versions - Chore: Test against MySQL 8 - Fix: Handle ActiveRecord::ConnectionNotEstablished errors too +- Fix: Do not retry on ActiveRecord::StatementTimeout errors ## 0.5.0 (Jan 29, 2020) diff --git a/lib/activerecord/mysql/reconnect.rb b/lib/activerecord/mysql/reconnect.rb index 4717f5f..eee1769 100644 --- a/lib/activerecord/mysql/reconnect.rb +++ b/lib/activerecord/mysql/reconnect.rb @@ -31,6 +31,10 @@ module Activerecord::Mysql::Reconnect Mysql2::Error, ] + DO_NOT_HANDLE_ERROR = [ + ActiveRecord::StatementTimeout + ] + @@handle_r_error_messages = { lost_connection: 'Lost connection to MySQL server during query', } @@ -205,6 +209,10 @@ def should_handle?(e, opts = {}) return false end + if DO_NOT_HANDLE_ERROR.any? { |i| e.kind_of?(i) } + return false + end + unless Regexp.union(@@handle_r_error_messages.values + @@handle_rw_error_messages.values) =~ e.message return false end diff --git a/spec/activerecord-mysql-reconnect_spec.rb b/spec/activerecord-mysql-reconnect_spec.rb index 300bb24..50d4ad0 100644 --- a/spec/activerecord-mysql-reconnect_spec.rb +++ b/spec/activerecord-mysql-reconnect_spec.rb @@ -497,6 +497,15 @@ end end + context "when statement execution time is exceeded" do + it "does not retry" do + expect(ActiveRecord::Base.logger).not_to receive(:warn) + expect { + Employee.connection.select_all("SELECT /*+ MAX_EXECUTION_TIME(1) */ * FROM employees where emp_no > sleep(1)") + }.to raise_error(ActiveRecord::StatementTimeout) + end + end + # NOTE: The following test need to execute at the last context "when the custom error is happened" do before do From a9fa0511b2c5d6ec1c2653a3a6859c821be50f49 Mon Sep 17 00:00:00 2001 From: James Miller Date: Thu, 24 Aug 2023 14:57:48 -0700 Subject: [PATCH 15/15] lock to ~> 7.0.0 and add a note for the reason --- Appraisals | 4 ---- activerecord-mysql-reconnect.gemspec | 5 ++++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Appraisals b/Appraisals index aa0563c..ac2bda5 100644 --- a/Appraisals +++ b/Appraisals @@ -1,7 +1,3 @@ appraise "activerecord-7.0" do gem "activerecord", "~> 7.0.0" end - -#appraise "activerecord-master" do -# gem "activerecord", git: "https://github.com/rails/rails.git" -#end diff --git a/activerecord-mysql-reconnect.gemspec b/activerecord-mysql-reconnect.gemspec index af0d332..e30ee46 100644 --- a/activerecord-mysql-reconnect.gemspec +++ b/activerecord-mysql-reconnect.gemspec @@ -18,7 +18,10 @@ Gem::Specification.new do |spec| spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ['lib'] - spec.add_dependency 'activerecord', '>= 7' + # We are going to stop using this in Rails 7.1 and beyond in favor of newly + # added reconnect / retry functionality. The Platform team will provide + # instructions for replacing this gem once 7.1 is released. + spec.add_dependency 'activerecord', '~> 7.0.0' spec.add_dependency 'mysql2' spec.add_development_dependency 'bundler' spec.add_development_dependency 'rake'