Migration zu s3 fehlgeschlagen – aber nur der Check schlägt fehl

Im Laufe der Jahre haben wir viele, viele Probleme bei der Migration zu S3 gesehen, einschließlich impliziter Migrationen beim Wiederherstellen eines Backups.

EXCEPTION: 8 Beiträge wurden nicht auf die neue S3-Upload-URL umgestellt. S3-Migration für die Datenbank 'default' fehlgeschlagen.

Einige der vielen Beispiele:

Heute bin ich auf eines dieser Probleme gestoßen und da es Freitag war, habe ich beschlossen, es zu untersuchen, anstatt die Prüfung einfach auszukommentieren.

Wir haben also folgende Situation:

  • wir verwenden Multisite
  • nehmen wir für dieses Beispiel dbname als Datenbanknamen an
  • S3_CDN_URL ist gesetzt
  • CDN_URL ist nicht gesetzt

Dies geschieht in /lib/file_store/to_s3_migration.rb

Zuerst wird das Präfix festgelegt

prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"

Dann werden die Dateien auf S3 hochgeladen und danach erfolgt die Zuordnung, die im Grunde dies und einige Variationen ist

        from = "/uploads/#{@current_db}/original/"
        to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"

In Multisite wird also umgestellt

  • von /uploads/dbname/original/
  • auf https://bucket-location-url.com/uploads/dbname/original/

und dann schließlich wird die Prüfung durchgeführt

      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

Nun kommt SiteSetting.cdn_path aus lib/global_path.rb und sieht so aus

  def cdn_path(p)
    GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
  end

Alsooooooo, wenn wir einen S3 CDN, aber keinen regulären CDN haben, wird SiteSetting.cdn_path("/uploads/#{@current_db}/original") einfach /uploads/dbname/original sein.

und gemäß unserer Zuordnung sind die neuen Pfade https://bucket-location-url.com/uploads/dbname/original/.

Das bedeutet

  1. cdn_path ist ein Teilstring des neuen Zielpfads
  2. Die Zählung Post.where("cooked LIKE '%#{cdn_path}%'").count wird daher immer Beiträge finden
  3. Es wird fälschlicherweise Alarm schlagen und abbrechen :scream: :scream: :scream:
3 „Gefällt mir“