Migration vers s3 échouée - mais seule la vérification échoue

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 :

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 dbname comme nom de base de données pour cet exemple
  • S3_CDN_URL est défini
  • CDN_URL n’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

  1. cdn_path est une sous-chaîne du nouveau chemin de destination
  2. Post.where("cooked LIKE '%#{cdn_path}%'").count trouvera donc toujours des publications
  3. cela sonnera l’alarme à tort et échouera :scream: :scream: :scream:
3 « J'aime »