Ho una vecchia applicazione Rails aggiornata alla versione 3.2.11 che ha un sacco di specifiche richieste scritte usando capybara versione 1.0.1 e in esecuzione usando il driver selenio . Il database viene pulito dopo ogni test utilizzando database_cleaner utilizzando la strategia di troncamento.Aggiornamento capibara da 1.0.1 a 1.1.4 rende database_cleaner rompere le mie specifiche
Desidero utilizzare poltergeist anziché selenio e capybara aggiornato da 1.0.1 a 1.1.4 per poter utilizzare l'ultima versione di poltergeist. Solo cambiando la gemma di capibara (e le sue dipendenze) ho introdotto problemi nell'esecuzione delle mie specifiche.
Ricevo costantemente errori di deadlock dal database Postgresql nel gestore di cleanup dopo ogni specifica. Il mio spec_helper è piuttosto semplice e si presenta così:
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
L'errore che ottengo è come questo:
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'
Io uso factorygirl per creare dati di test, ma altrimenti niente di speciale IMO.
Non sono stato in grado di capire cosa contiene l'altra estremità del deadlock creata da database_cleaner. Qualsiasi idea per capirlo è molto gradita.
Qualcuno sa di eventuali cambiamenti tra capybara 1.0.1 e 1.1.4 che è cambiato e potrebbe aver iniziato a causare questi problemi?
io in realtà espe ced l'opposto. Durante i miei test, ho avuto dei blocchi permanenti che si verificavano a intermittenza fino all'aggiornamento a capybara 1.1.4 da 1.1.2. Spiacente, il mio commento non è più utile. =/ –
Beh, sono contento di non essere l'unico a sperimentare problemi di deadlock :-) Semplicemente non riesco a capire perché due thread alla volta stiano accedendo alle tabelle allo stesso tempo. DatabaseClean dovrebbe funzionare solo dopo che i test effettivi sono stati completati ... – HakonB
Oh anche, questa potrebbe essere una domanda stupida, ma hai provato ad aggiornare il tuo gem di DatabaseCleaner? Inoltre, FWIW, penso che per noi gli errori si siano verificati solo dopo aver iniziato a usare delayed_job (anche se abbiamo disattivato i test). –