バージョン 3.2.11 にアップグレードされた古い Rails アプリケーションがあります。このアプリケーションには、カピバラ バージョン 1.0.1 を使用して記述され、セレン ドライバーを使用して実行される多くの要求仕様があります。データベースは、切り捨て戦略を使用して database_cleaner を使用して各テストの後にクリーンアップされます。
Selenium の代わりにポルターガイストを使用したいので、カピバラを 1.0.1 から 1.1.4 にアップグレードして、最新バージョンのポルターガイストを使用できるようにしました。capybara gem (およびその依存関係) を変更しただけで、仕様の実行に問題が発生しました。
各仕様の後、クリーンアップ ハンドラーで Postgresql データベースから一貫してデッドロック エラーが発生します。私の spec_helper はかなり基本的なもので、次のようになります。
RSpec.configure do |config|
config.mock_with :rspec
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
私が得るエラーは次のようなものです:
An error occurred in an after hook
ActiveRecord::StatementInvalid: PG::Error: ERROR: deadlock detected
DETAIL: Process 41747 waits for AccessExclusiveLock on relation 17612 of database 16396; blocked by process 41752.
Process 41752 waits for RowExclusiveLock on relation 17529 of database 16396; blocked by process 41747.
HINT: See server log for query details.
: ALTER TABLE "aaa" ENABLE TRIGGER ALL;ALTER TABLE "bbbb" ENABLE TRIGGER ALL;ALTER TABLE "ccc" ENABLE TRIGGER ALL;
occurred at /xxx/.bundle/gems/activerecord-3.2.11/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `async_exec'
FactoryGirl を使用してテスト データを作成しますが、それ以外は特別な IMO はありません。
database_cleaner によって作成されたデッドロックのもう一方の端を保持しているものを理解できませんでした。それを理解するためのアイデアは大歓迎です。
カピバラ 1.0.1 と 1.1.4 の間に変更があり、これらの問題を引き起こし始めた可能性があることを知っている人はいますか?