Migrazione a s3 fallita - ma fallisce solo il controllo

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:

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 dbname come 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

  1. cdn_path è una sottostringa del nuovo percorso di destinazione
  2. il Post.where("cooked LIKE '%#{cdn_path}%'").count troverà quindi sempre i post
  3. suonerà l’allarme e si bloccherà :scream: :scream: :scream:
3 Mi Piace