عند محاولة استعادة نسخة احتياطية (إلى موقع متعدد، لكن يبدو أن هذا لا يهم، انظر أدناه)، يحدث ما يلي:
جاري ترحيل قاعدة البيانات...
استثناء: lib/discourse.rb:57:in `exec': فشل ترحيل قاعدة البيانات.
rake aborted!
Errno::ENOENT: لا يوجد ملف أو دليل @ 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>'
المهام: 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، لكن هذا لم ينجح عندما جربته.