Nel corso degli anni abbiamo riscontrato molti, molti problemi con la migrazione a s3, incluse migrazioni implicite durante il ripristino di un backup.
EXCEPTION: 8 post non sono stati rimappati al nuovo URL di caricamento S3. La migrazione S3 è fallita per il db 'default'.
Alcuni dei tanti esempi:
- 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
Oggi, ho incontrato un altro di questi e dato che era venerdì ho deciso di approfondire invece di limitarmi a commentare il controllo.
Quindi abbiamo questa situazione:
- siamo su multisito
- assumiamo
dbnamecome nome del database per questo esempio - abbiamo impostato
S3_CDN_URL - non abbiamo impostato
CDN_URL
Questo è ciò che accade in /lib/file_store/to_s3_migration.rb
Per prima cosa viene deciso il prefisso
prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"
Quindi i file vengono caricati su s3 e poi viene eseguita la rimappatura che è fondamentalmente questa e alcune variazioni
from = "/uploads/#{@current_db}/original/"
to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"
Quindi in multisito questo rimapperà
- da
/uploads/dbname/original/ - a
https://bucket-location-url.com/uploads/dbname/original/
e poi finalmente viene eseguito il controllo
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
Ora SiteSetting.cdn_path proviene da lib/global_path.rb e assomiglia a questo
def cdn_path(p)
GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
end
Quindioooooo se abbiamo un S3 CDN ma non un CDN regolare, allora SiteSetting.cdn_path("/uploads/#{@current_db}/original") sarà semplicemente /uploads/dbname/original
e, in base alla nostra rimappatura, i nuovi percorsi sono https://bucket-location-url.com/uploads/dbname/original/
Ciò significa che
cdn_pathè una sottostringa del nuovo percorso di destinazione- il
Post.where("cooked LIKE '%#{cdn_path}%'").counttroverà quindi sempre i post - suonerà l’allarme e si bloccherà
