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:
- 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
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
dbnameals Datenbanknamen an S3_CDN_URList gesetztCDN_URList 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
cdn_pathist ein Teilstring des neuen Zielpfads- Die Zählung
Post.where("cooked LIKE '%#{cdn_path}%'").countwird daher immer Beiträge finden - Es wird fälschlicherweise Alarm schlagen und abbrechen
