diff --git a/Gemfile b/Gemfile index 5446542668f..0db3dfef497 100644 --- a/Gemfile +++ b/Gemfile @@ -158,7 +158,7 @@ platforms :ruby, :windows do group :db do gem "pg", "~> 1.3" gem "mysql2", "~> 0.5" - gem "trilogy", ">= 2.5.0" + gem "trilogy", ">= 2.7.0" end end diff --git a/Gemfile.lock b/Gemfile.lock index 913343a25d4..55adee33919 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -543,7 +543,7 @@ GEM timeout (0.4.1) tomlrb (2.0.3) trailblazer-option (0.1.2) - trilogy (2.6.0) + trilogy (2.7.0) turbo-rails (1.5.0) actionpack (>= 6.0.0) activejob (>= 6.0.0) @@ -654,7 +654,7 @@ DEPENDENCIES syntax_tree (= 6.1.1) tailwindcss-rails terser (>= 1.1.4) - trilogy (>= 2.5.0) + trilogy (>= 2.7.0) turbo-rails tzinfo-data useragent diff --git a/activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb b/activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb index 4ad9f25c761..2b5c308fc2c 100644 --- a/activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/trilogy_adapter.rb @@ -2,7 +2,7 @@ require "active_record/connection_adapters/abstract_mysql_adapter" -gem "trilogy", "~> 2.4" +gem "trilogy", "~> 2.7" require "trilogy" require "active_record/connection_adapters/trilogy/database_statements" @@ -209,10 +209,11 @@ module ActiveRecord end case exception - when Errno::EPIPE, SocketError, IOError + when SocketError, IOError return ConnectionFailed.new(message, connection_pool: @pool) when ::Trilogy::Error - if /Connection reset by peer|TRILOGY_CLOSED_CONNECTION|TRILOGY_INVALID_SEQUENCE_ID|TRILOGY_UNEXPECTED_PACKET/.match?(exception.message) + if /TRILOGY_CLOSED_CONNECTION|TRILOGY_INVALID_SEQUENCE_ID|TRILOGY_UNEXPECTED_PACKET/.match?(exception.message) || + exception.is_a?(SystemCallError) return ConnectionFailed.new(message, connection_pool: @pool) end end diff --git a/activerecord/test/cases/adapters/trilogy/trilogy_adapter_test.rb b/activerecord/test/cases/adapters/trilogy/trilogy_adapter_test.rb index 2841ec8b4b8..ea210c5f613 100644 --- a/activerecord/test/cases/adapters/trilogy/trilogy_adapter_test.rb +++ b/activerecord/test/cases/adapters/trilogy/trilogy_adapter_test.rb @@ -358,6 +358,38 @@ class TrilogyAdapterTest < ActiveRecord::TrilogyTestCase assert_includes error.message, "/var/invalid.sock" end + test "EPIPE raises ActiveRecord::ConnectionFailed" do + assert_raises(ActiveRecord::ConnectionFailed) do + @conn.raw_connection.stub(:query, -> (*) { raise Trilogy::SyscallError::EPIPE }) do + @conn.execute("SELECT 1") + end + end + end + + test "ETIMEDOUT raises ActiveRecord::ConnectionFailed" do + assert_raises(ActiveRecord::ConnectionFailed) do + @conn.raw_connection.stub(:query, -> (*) { raise Trilogy::SyscallError::ETIMEDOUT }) do + @conn.execute("SELECT 1") + end + end + end + + test "ECONNREFUSED raises ActiveRecord::ConnectionFailed" do + assert_raises(ActiveRecord::ConnectionFailed) do + @conn.raw_connection.stub(:query, -> (*) { raise Trilogy::SyscallError::ECONNREFUSED }) do + @conn.execute("SELECT 1") + end + end + end + + test "ECONNRESET raises ActiveRecord::ConnectionFailed" do + assert_raises(ActiveRecord::ConnectionFailed) do + @conn.raw_connection.stub(:query, -> (*) { raise Trilogy::SyscallError::ECONNRESET }) do + @conn.execute("SELECT 1") + end + end + end + # Create a temporary subscription to verify notification is sent. # Optionally verify the notification payload includes expected types. def assert_notification(notification, expected_payload = {}, &block) diff --git a/railties/lib/rails/generators/database.rb b/railties/lib/rails/generators/database.rb index 85f6c82312f..2236092317c 100644 --- a/railties/lib/rails/generators/database.rb +++ b/railties/lib/rails/generators/database.rb @@ -14,7 +14,7 @@ module Rails def gem_for_database(database = options[:database]) case database when "mysql" then ["mysql2", ["~> 0.5"]] - when "trilogy" then ["trilogy", ["~> 2.4"]] + when "trilogy" then ["trilogy", ["~> 2.7"]] when "postgresql" then ["pg", ["~> 1.1"]] when "sqlite3" then ["sqlite3", ["~> 1.4"]] when "oracle" then ["activerecord-oracle_enhanced-adapter", nil] diff --git a/railties/test/generators/db_system_change_generator_test.rb b/railties/test/generators/db_system_change_generator_test.rb index 257ae95234c..77ca07fba17 100644 --- a/railties/test/generators/db_system_change_generator_test.rb +++ b/railties/test/generators/db_system_change_generator_test.rb @@ -100,7 +100,7 @@ module Rails assert_file("Gemfile") do |content| assert_match "# Use trilogy as the database for Active Record", content - assert_match 'gem "trilogy", "~> 2.4"', content + assert_match 'gem "trilogy", "~> 2.7"', content end assert_file("Dockerfile") do |content|