From 4a16bf49e990f0fc641d87d1a4c316a0364f2d5c Mon Sep 17 00:00:00 2001 From: Andrew Lazarus Date: Mon, 14 Jul 2025 10:57:08 -0600 Subject: [PATCH] release_connection after cleaning For Rails >= 7.2, this library gets a connection via `#lease_connection`. But it never releases the connection. Release the connection back to the pool after `#clean`-ing. Rails >= 7.2 does connection health checks / reconnect on connection checkout. If the connection is never checked back into the pool, it will never get "repaired", which makes testing database connection issues tricky. --- .github/workflows/ci.yml | 21 ++++++++++++------- CHANGELOG.md | 1 + gemfiles/rails_6.1.gemfile | 3 +++ gemfiles/rails_7.0.gemfile | 3 +++ gemfiles/rails_7.1.gemfile | 3 +++ gemfiles/rails_7.2.gemfile | 3 +++ gemfiles/rails_8.0.gemfile | 16 ++++++++++++++ gemfiles/rails_edge.gemfile | 3 +++ .../active_record/deletion.rb | 2 ++ .../active_record/transaction.rb | 2 ++ .../active_record/truncation.rb | 2 ++ spec/spec_helper.rb | 2 ++ 12 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 gemfiles/rails_8.0.gemfile diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0305415..68d17e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,14 +9,17 @@ jobs: strategy: fail-fast: false matrix: - ruby: ['3.3', '3.2', '3.1'] - rails: ['6.1', '7.0', '7.1', '7.2'] + ruby: ['3.4', '3.3', '3.2', '3.1'] + rails: ['6.1', '7.0', '7.1', '7.2', '8.0'] channel: ['stable'] include: - ruby: 'ruby-head' rails: 'edge' channel: 'experimental' + - ruby: 'ruby-head' + rails: '8.0' + channel: 'experimental' - ruby: 'ruby-head' rails: '7.2' channel: 'experimental' @@ -24,25 +27,29 @@ jobs: rails: '7.1' channel: 'experimental' - - ruby: '3.3' + - ruby: '3.4' rails: 'edge' channel: 'experimental' - - ruby: '3.2' + - ruby: '3.3' rails: 'edge' channel: 'experimental' - - ruby: '3.1' + - ruby: '3.2' rails: 'edge' channel: 'experimental' exclude: - - ruby: '3.3' - rails: '7.0' # TODO: works on 7-0-stable branch, remove after a 7.0.x patch release + - ruby: '3.4' + rails: '6.1' + - ruby: '3.3' rails: '6.1' - ruby: '3.2' rails: '6.1' + - ruby: '3.1' + rails: '8.0' + continue-on-error: ${{ matrix.channel != 'stable' }} env: # $BUNDLE_GEMFILE must be set at the job level, so it is set for all steps diff --git a/CHANGELOG.md b/CHANGELOG.md index bb2869c..b1c169c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Development (unreleased) +* Release database connections after cleaning: https://github.com/DatabaseCleaner/database_cleaner-active_record/pull/122 * Provide a 'Changelog' link on Rubygems: https://github.com/DatabaseCleaner/database_cleaner-active_record/pull/114 * Fix bundling and CONTRIBUTE.md instructions: https://github.com/DatabaseCleaner/database_cleaner-active_record/pull/123 * Fix order of arguments in `truncate_tables` expectation https://github.com/DatabaseCleaner/database_cleaner-active_record/pull/124 diff --git a/gemfiles/rails_6.1.gemfile b/gemfiles/rails_6.1.gemfile index b2cc5ce..26989b3 100644 --- a/gemfiles/rails_6.1.gemfile +++ b/gemfiles/rails_6.1.gemfile @@ -6,6 +6,9 @@ gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_c gem "rails", "~> 6.1.0" gem "sqlite3", "~> 1.5" gem "concurrent-ruby", "1.3.4" +gem "logger" +gem "mutex_m" +gem "bigdecimal" group :test do gem "simplecov", require: false diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile index 76289d4..2dfa378 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_7.0.gemfile @@ -6,6 +6,9 @@ gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_c gem "rails", "~> 7.0.0" gem "sqlite3", "~> 1.7" gem "concurrent-ruby", "1.3.4" +gem "logger" +gem "mutex_m" +gem "bigdecimal" group :test do gem "simplecov", require: false diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile index 5e16b40..d0faf8c 100644 --- a/gemfiles/rails_7.1.gemfile +++ b/gemfiles/rails_7.1.gemfile @@ -5,6 +5,9 @@ source "https://rubygems.org" gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_cleaner" gem "rails", "~> 7.1.0" gem "sqlite3", "~> 1.7" +gem "logger" +gem "mutex_m" +gem "bigdecimal" group :test do gem "simplecov", require: false diff --git a/gemfiles/rails_7.2.gemfile b/gemfiles/rails_7.2.gemfile index 95b90db..143ebc3 100644 --- a/gemfiles/rails_7.2.gemfile +++ b/gemfiles/rails_7.2.gemfile @@ -4,6 +4,9 @@ source "https://rubygems.org" gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_cleaner" gem "rails", "~> 7.2.0" +gem "logger" +gem "mutex_m" +gem "bigdecimal" group :test do gem "simplecov", require: false diff --git a/gemfiles/rails_8.0.gemfile b/gemfiles/rails_8.0.gemfile new file mode 100644 index 0000000..5d8a2e8 --- /dev/null +++ b/gemfiles/rails_8.0.gemfile @@ -0,0 +1,16 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_cleaner" +gem "rails", "~> 8.0" +gem "logger" +gem "mutex_m" +gem "bigdecimal" + +group :test do + gem "simplecov", require: false + gem "codecov", require: false +end + +gemspec path: "../" diff --git a/gemfiles/rails_edge.gemfile b/gemfiles/rails_edge.gemfile index 94be381..edbd48d 100644 --- a/gemfiles/rails_edge.gemfile +++ b/gemfiles/rails_edge.gemfile @@ -4,6 +4,9 @@ source "https://rubygems.org" gem "database_cleaner-core", git: "https://github.com/DatabaseCleaner/database_cleaner" gem "rails", github: "rails/rails" +gem "logger" +gem "mutex_m" +gem "bigdecimal" group :test do gem "simplecov", require: false diff --git a/lib/database_cleaner/active_record/deletion.rb b/lib/database_cleaner/active_record/deletion.rb index ad28212..70b6819 100644 --- a/lib/database_cleaner/active_record/deletion.rb +++ b/lib/database_cleaner/active_record/deletion.rb @@ -9,6 +9,8 @@ def clean delete_tables(connection, tables_to_clean(connection)) end end + + connection_class.connection_pool.release_connection end private diff --git a/lib/database_cleaner/active_record/transaction.rb b/lib/database_cleaner/active_record/transaction.rb index 6d3722e..c7391f0 100644 --- a/lib/database_cleaner/active_record/transaction.rb +++ b/lib/database_cleaner/active_record/transaction.rb @@ -22,6 +22,8 @@ def clean connection.rollback_transaction end end + + connection_class.connection_pool.release_connection end end end diff --git a/lib/database_cleaner/active_record/truncation.rb b/lib/database_cleaner/active_record/truncation.rb index ce4c095..366b296 100644 --- a/lib/database_cleaner/active_record/truncation.rb +++ b/lib/database_cleaner/active_record/truncation.rb @@ -26,6 +26,8 @@ def clean connection.truncate_tables(tables_to_clean(connection), { truncate_option: @truncate_option }) end end + + connection_class.connection_pool.release_connection end private diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f54dccf..d391458 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,7 @@ require "bundler/setup" +require "logger" # Fix for Rails 7.0 tests + if ENV['COVERAGE'] == 'true' require "simplecov"