Au fil des ans, nous avons rencontré de nombreux problèmes lors de la migration vers S3, y compris des migrations implicites lors de la restauration d’une sauvegarde.
EXCEPTION: 8 publications n'ont pas été remappées à la nouvelle URL de téléchargement S3. La migration S3 a échoué pour la base de données 'default'.
Quelques exemples parmi d’autres :
- 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
Aujourd’hui, j’en ai rencontré un autre et comme c’était vendredi, j’ai décidé de l’examiner au lieu de simplement commenter la vérification.
Nous avons donc cette situation :
- nous sommes en multisite
- supposons
dbnamecomme nom de base de données pour cet exemple S3_CDN_URLest définiCDN_URLn’est pas défini
Voici ce qui se passe dans /lib/file_store/to_s3_migration.rb
D’abord le préfixe est décidé
prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"
Ensuite, les fichiers sont téléchargés sur s3 et ensuite le remappage est effectué, ce qui correspond essentiellement à ceci et à quelques variations
from = "/uploads/#{@current_db}/original/"
to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"
Donc, en multisite, cela remappera
- de
/uploads/dbname/original/ - à
https://bucket-location-url.com/uploads/dbname/original/
et ensuite finalement la vérification est effectuée
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
Maintenant, SiteSetting.cdn_path provient de lib/global_path.rb et ressemble à ceci
def cdn_path(p)
GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
end
Alors, si nous avons un CDN S3 mais pas de CDN régulier, SiteSetting.cdn_path("/uploads/#{@current_db}/original") sera simplement /uploads/dbname/original
et, selon notre remappage, les nouveaux chemins sont https://bucket-location-url.com/uploads/dbname/original/
Cela signifie que
cdn_pathest une sous-chaîne du nouveau chemin de destinationPost.where("cooked LIKE '%#{cdn_path}%'").counttrouvera donc toujours des publications- cela sonnera l’alarme à tort et échouera
