على مر السنين، رأينا العديد والعديد من المشكلات المتعلقة بالترحيل إلى S3، بما في ذلك عمليات الترحيل الضمنية عند استعادة نسخة احتياطية.
EXCEPTION: 8 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
بعض الأمثلة العديدة:
- False positives on "posts are not remapped to new S3 upload URL"
- Restore process cancelled at migrating uploads to S3 step
- Restore to New Host
اليوم، واجهت واحدة أخرى من هذه المشكلات، وبما أنه كان يوم الجمعة، قررت التعمق فيها بدلاً من مجرد التعليق على التحقق.
لذا لدينا هذا الموقف:
- نحن على نظام متعدد المواقع (multisite)
- لنفترض أن
dbnameهو اسم قاعدة البيانات لهذا المثال - لدينا
S3_CDN_URLمضبوطة - ليس لدينا
CDN_URLمضبوطة
هذا ما يحدث في /lib/file_store/to_s3_migration.rb
أولاً يتم تحديد البادئة (prefix)
prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"
ثم يتم تحميل الملفات إلى s3 و بعد ذلك تتم إعادة التعيين (remap) وهي في الأساس هذا وبعض الاختلافات
from = "/uploads/#{@current_db}/original/"
to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"
لذا في النظام متعدد المواقع، سيتم إعادة تعيين:
- من
/uploads/dbname/original/ - إلى
https://bucket-location-url.com/uploads/dbname/original/
ثم أخيرًا يتم إجراء التحقق
cdn_path = SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
count = Post.where("cooked LIKE '%#{cdn_path}%'").count
if count > 0
error_message = "#{count} posts are not remapped to new S3 upload URL. #{failure_message}"
raise_or_log(error_message, should_raise)
success = false
end
الآن SiteSetting.cdn_path يأتي من lib/global_path.rb ويبدو كالتالي
def cdn_path(p)
GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
end
إذًا، إذا كان لدينا S3 CDN ولكن ليس لدينا CDN عادي، فإن SiteSetting.cdn_path("/uploads/#{@current_db}/original") سيكون ببساطة /uploads/dbname/original
ووفقًا لإعادة التعيين الخاصة بنا، ستكون المسارات الجديدة هي https://bucket-location-url.com/uploads/dbname/original/
هذا يعني
cdn_pathهو جزء من المسار الوجهة الجديد- وبالتالي، فإن
Post.where("cooked LIKE '%#{cdn_path}%'").countسيجد دائمًا منشورات - سيصدر إنذارًا كاذبًا ويتوقف
