خطأ عند استعادة ملفات SVG من النسخة الاحتياطية

عند محاولة استعادة نسخة احتياطية (إلى موقع متعدد، لكن يبدو أن هذا لا يهم، انظر أدناه)، يحدث ما يلي:

جاري ترحيل قاعدة البيانات...
استثناء: 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، لكن هذا لم ينجح عندما جربته.

6 إعجابات

من يجب أن ينظر في هذا يا @sam؟

إعجاب واحد (1)

يبدو الأمر واضحًا إلى حد كبير:

و

آخر شخص لعب بهذا التدفق كان @gerhard

@RGJ إذا كنت ترغب في تسريع التشخيص هنا، ربما قم بإنشاء قاعدة بيانات فارغة تحتوي على ملف SVG واحد يفشل في الاستعادة، مما سيجعل الاختبار أسهل بكثير بالنسبة لنا.

7 إعجابات

أرسلت لك رسالة خاصة تحتوي على ملف نسخة احتياطية مُصغَّر قدر الإمكان ولا يمكن استعادته.

يتطلب الأمر ملف “صغير” بصيغة SVG في الأيقونة أو ملف التظهير (manifest) لتفعيل الخطأ.

بالمناسبة، اكتشفت للتو أن SKIP_POST_DEPLOYMENT_MIGRATIONS يتم إعادة تعيينه صراحةً هنا، وهذا هو السبب في أن هذه الطريقة لم تعمل كحل بديل.

5 إعجابات

شكرًا لك على الإبلاغ عن المشكلة وتقديم ملف مثال. تم إصلاحها.

6 إعجابات