Задать вопрос
@Meezmo
Python, C# programmer

Как исправить ошибки Postgres deadlock в Minitest?

После того как я добавил тесты для контроллера и модели, я начал получать ошибки
UPD
Я нашёл проблему. Ошибки появляются когда слишком много тестов. Когда у меня 50 тестов, всё работает. Когда добавляю ещё пару тестов, появляются эти ошибки. Как их можно исправить?

Ошибки:
Minitest::UnexpectedError: ActiveRecord::Deadlocked: PG::TRDeadlockDetected: ERROR:  deadlock detected LINE 7: DELETE FROM "videos"; 
^ DETAIL:  Process 11456 waits for RowExclusiveLock on relation 42608 of database 42434; blocked by process 10460. 
Process 10460 waits for ShareRowExclusiveLock on relation 42564 of database 42434; blocked by process 11456. 
HINT:  See server log for query details.

Ещё ошибки:
Minitest::UnexpectedError: ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "accounts_pkey"
DETAIL:  Key (id)=(825136781) already exists.

Minitest::UnexpectedError: ActiveRecord::ConnectionNotEstablished: connection is closed
  • Вопрос задан
  • 51 просмотр
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
gohdan
@gohdan
Системный администратор
Дедлоки возникают, когда одна транзакция что-то блокирует (например, строки для апдейта) а другая транзакция слишком долго ждёт освобождения блокированного ресурса. Такое бывает, когда базе не хватает ресурсов, либо sql запросы сделаны не оптимально, работают слишком долго и блокируют слишком много. Решить можно следующим образом:

1) на уровне инфраструктуры - добавить ресурсов базе (CPU и RAM серверу, диск поменять на более быстрый, в конфигах постгреса добавить памяти в разных местах и сделать пореже запись на диск);
2) на уровне приложения - оптимизировать sql запросы, чтобы они создавали меньше блокировок, либо больше, но попроще, чтобы они быстрее проходили;
3) на уровне архитектуры - запускать тесты не в параллель, а последовательно, чтобы они друг друга не блокировали.
Ответ написан
Комментировать
@Meezmo Автор вопроса
Python, C# programmer
Если кому то нужно:
В файле test_helper.rb убрать строку
parallelize(workers: :number_of_processors, with: :threads)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы