Ошибка при восстановлении SVG-файлов из резервной копии

При попытке восстановления резервной копии (для мультисайта, но, судя по всему, это не имеет значения, см. ниже) происходит следующее:

Migrating the database...
EXCEPTION: lib/discourse.rb:57:in `exec': Failed to migrate database.
rake aborted!
Errno::ENOENT: No such file or directory @ rb_sysopen - /var/www/discourse/public/uploads/default/original/2X/7/7be997f9f48c034ddf5d4eb95d2ea7416f010241.svg
/var/www/discourse/app/models/optimized_image.rb:87:in `block in create_for'
/var/www/discourse/app/models/optimized_image.rb:24:in `block (2 levels) in lock'
/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:23:in `block in lock'
/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:22:in `lock'
/var/www/discourse/app/models/optimized_image.rb:59:in `create_for'
/var/www/discourse/lib/site_icon_manager.rb:28:in `block in ensure_optimized!'
/var/www/discourse/lib/site_icon_manager.rb:24:in `each'
/var/www/discourse/lib/site_icon_manager.rb:24:in `ensure_optimized!'
/var/www/discourse/lib/tasks/db.rake:83:in `block in <top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/ruby_executable_hooks:24:in `eval'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/ruby_executable_hooks:24:in `<main>'
Tasks: TOP => db:migrate

Сначала я подумал, что это исключительно проблема мультисайта, но ошибка возникает и на одиночном сайте.

Забавно то, что в этот момент архив даже не распаковывался (РЕДАКТИРОВАНО: на тот момент). Однако указанный файл загрузки включён в архив.

tar tvf public/backups/default/redacted-forum-2020-03-02-165725-v20190130013015.tar.gz |grep 7be997f9f48c034ddf5d4eb95d2ea7416f010241
-rw-r--r-- daemon/daemon     3074 2019-05-27 08:21 uploads/default/original/2X/7/7be997f9f48c034ddf5d4eb95d2ea7416f010241.svg

Исходная версия дампа базы данных: v20190130013015

Затем я вручную распаковал файлы загрузки (в default) и снова запустил восстановление, которое завершилось успешно.

После этого я заметил следующее: файлы загрузки извлекаются ПОСЛЕ выполнения db:migrate, но db:migrate запускает SiteIconManager.ensure_optimized!, который требует, чтобы файлы уже присутствовали…

Таким образом, есть две проблемы:

  • SiteIconManager.ensure_optimized! выполняется до извлечения изображений (на самом деле оно запускается дважды — ещё раз после извлечения файлов загрузки);
  • оно ожидает наличие файлов в default, поскольку переназначение ещё не выполнено.

В данном конкретном случае ошибка возникает критически, так как код для загрузки SVG идёт по другому пути. Для других загрузок, похоже, ошибка подавляется.

Кстати, судя по коду, эту проблему можно обойти, установив SKIP_POST_DEPLOYMENT_MIGRATIONS=1, так как это пропускает оптимизацию изображений во время db:migrate, но при моей попытке это не сработало.

6 лайков

Кому стоит посмотреть это, @sam?

1 лайк

Кажется, всё довольно просто:

И

Последний, кто работал с этим потоком, — @gerhard

@RGJ, если вы хотите ускорить диагностику здесь, возможно, создайте пустую базу данных с одним SVG-файлом, который не проходит восстановление. Это значительно упростит нам тестирование.

7 лайков

Я отправил вам личное сообщение с максимально облегченным файлом резервной копии, который не восстанавливается.

Для срабатывания этой ошибки требуется «небольшой» SVG-файл в фавиконке или манифесте.

Кстати, я только что обнаружил, что SKIP_POST_DEPLOYMENT_MIGRATIONS явно сбрасывается, поэтому этот вариант не сработал как обходное решение.

5 лайков

Спасибо за сообщение об ошибке и предоставленный пример файла. Проблема исправлена.

6 лайков