فشل الترحيل إلى s3 - ولكن التحقق فقط هو الذي يفشل

على مر السنين، رأينا العديد والعديد من المشكلات المتعلقة بالترحيل إلى S3، بما في ذلك عمليات الترحيل الضمنية عند استعادة نسخة احتياطية.

EXCEPTION: 8 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.

بعض الأمثلة العديدة:

اليوم، واجهت واحدة أخرى من هذه المشكلات، وبما أنه كان يوم الجمعة، قررت التعمق فيها بدلاً من مجرد التعليق على التحقق.

لذا لدينا هذا الموقف:

  • نحن على نظام متعدد المواقع (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/

هذا يعني

  1. cdn_path هو جزء من المسار الوجهة الجديد
  2. وبالتالي، فإن Post.where("cooked LIKE '%#{cdn_path}%'").count سيجد دائمًا منشورات
  3. سيصدر إنذارًا كاذبًا ويتوقف :scream: :scream: :scream:
3 إعجابات