diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa459188..31f339c2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,4 +88,4 @@ jobs: done cat ${{ github.workspace }}/setup.sql | cockroach sql --insecure - name: Test - run: bundle exec rake test TESTOPTS='--profile=3 --verbose' + run: bundle exec rake test TESTOPTS='--profile=3 --verbose' TEST_FILES_AR=test/cases/adapters/postgresql/transaction_nested_test.rb diff --git a/Gemfile b/Gemfile index bb239f29..6ddda894 100644 --- a/Gemfile +++ b/Gemfile @@ -62,7 +62,6 @@ group :development, :test do # Gems used by the ActiveRecord test suite gem "bcrypt", "~> 3.1.18" - gem "mocha", "~> 1.14.0" gem "sqlite3", "~> 1.4.4" gem "minitest", "~> 5.15.0" diff --git a/lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb b/lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb index 8591f027..63f3e894 100644 --- a/lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb +++ b/lib/active_record/connection_adapters/cockroachdb/transaction_manager.rb @@ -25,6 +25,7 @@ module TransactionManagerMonkeyPatch def within_new_transaction(isolation: nil, joinable: true, attempts: 0) super(isolation: isolation, joinable: joinable) rescue ActiveRecord::ConnectionNotEstablished => error + puts "IN RETRY CASE ! " * 5 raise unless retryable? error raise if attempts >= @connection.max_transaction_retries @@ -37,6 +38,7 @@ def within_new_transaction(isolation: nil, joinable: true, attempts: 0) within_new_transaction(isolation: isolation, joinable: joinable, attempts: attempts + 1) { yield } rescue ActiveRecord::StatementInvalid => error + puts "IN RETRY CASE ! " * 5 raise unless retryable? error raise if attempts >= @connection.max_transaction_retries @@ -46,6 +48,8 @@ def within_new_transaction(isolation: nil, joinable: true, attempts: 0) end def retryable?(error) + puts "========> In a serialization failure" if error.is_a? ActiveRecord::SerializationFailure + puts "========> In a serialization error" if serialization_error?(error) return true if serialization_error?(error) return true if error.is_a? ActiveRecord::SerializationFailure return retryable? error.cause if error.cause diff --git a/test/cases/connection_adapters/type_test.rb b/test/cases/connection_adapters/type_test.rb index 8b47004a..8aca51cf 100644 --- a/test/cases/connection_adapters/type_test.rb +++ b/test/cases/connection_adapters/type_test.rb @@ -7,10 +7,9 @@ module CockroachDB module ConnectionAdapters class TypeTest < ActiveRecord::TestCase fixtures :accounts - class SqliteModel < ActiveRecord::Base + class FakeModel < ActiveRecord::Base establish_connection( - adapter: "sqlite3", - database: "tmp/some" + adapter: "fake" ) end def test_type_can_be_used_with_various_db @@ -19,8 +18,8 @@ def test_type_can_be_used_with_various_db ActiveRecord::Type.adapter_name_from(Account) ) assert_equal( - :sqlite3, - ActiveRecord::Type.adapter_name_from(SqliteModel) + :fake, + ActiveRecord::Type.adapter_name_from(FakeModel) ) end end diff --git a/test/excludes/ActiveRecord/PostgresqlTransactionNestedTest.rb b/test/excludes/ActiveRecord/PostgresqlTransactionNestedTest.rb index 22838c71..35ae977f 100644 --- a/test/excludes/ActiveRecord/PostgresqlTransactionNestedTest.rb +++ b/test/excludes/ActiveRecord/PostgresqlTransactionNestedTest.rb @@ -1,2 +1,14 @@ -exclude :test_deadlock_raises_Deadlocked_inside_nested_SavepointTransaction, "Causes CI to hand. Skip while debugging." -exclude :test_unserializable_transaction_raises_SerializationFailure_inside_nested_SavepointTransaction, "Causes CI to hand. Skip while debugging." + +# > In CRDB SERIALIZABLE, reads block on in-progress writes for +# > as long as those writes are in progress. However, PG does +# > not have this "read block on write" behavior, and so rather +# > than allowing the left-hand-side to execute, it must instead +# > abort that transaction. Both are valid ways to implement SERIALIZABLE. +# +# See discussion: https://github.com/cockroachdb/activerecord-cockroachdb-adapter/pull/333 +message = "SERIALIZABLE transactions are different in CockroachDB." + +# exclude :test_deadlock_raises_Deadlocked_inside_nested_SavepointTransaction, message +# exclude :test_unserializable_transaction_raises_SerializationFailure_inside_nested_SavepointTransaction, message +exclude :test_SerializationFailure_inside_nested_SavepointTransaction_is_recoverable, message +exclude :test_deadlock_inside_nested_SavepointTransaction_is_recoverable, message