Migración a s3 fallida, pero solo falla la verificación

A lo largo de los años hemos visto muchos, muchísimos problemas con la migración a S3, incluidas las migraciones implícitas al restaurar una copia de seguridad.

EXCEPTION: No se han reasignado 8 publicaciones a la nueva URL de carga de S3. La migración a S3 falló para la base de datos 'default'.

Algunos de los muchos ejemplos:

Hoy, me encontré con otro de estos y, como era viernes, decidí investigarlo en lugar de simplemente comentar la verificación.

Así que tenemos esta situación:

  • estamos en multisitio
  • asumamos dbname como el nombre de la base de datos para este ejemplo
  • tenemos S3_CDN_URL configurado
  • no tenemos CDN_URL configurado

Esto es lo que sucede en /lib/file_store/to_s3_migration.rb

Primero se decide el prefijo

prefix = @migrate_to_multisite ? "uploads/#{@current_db}/original/" : "original/"

Luego, los archivos se cargan en s3 y luego se realiza la reasignación, que es básicamente esto y algunas variaciones

        from = "/uploads/#{@current_db}/original/"
        to = "#{SiteSetting.Upload.s3_base_url}/#{prefix}"

Entonces, en multisitio, esto reasignará

  • de /uploads/dbname/original/
  • a https://bucket-location-url.com/uploads/dbname/original/

y luego finalmente se realiza la verificación

      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

Ahora SiteSetting.cdn_path proviene de lib/global_path.rb y se ve así

  def cdn_path(p)
    GlobalSetting.cdn_url.blank? ? p : "#{GlobalSetting.cdn_url}#{path(p)}"
  end

Así queeeeeee si tenemos un CDN de S3 pero no un CDN regular, entonces SiteSetting.cdn_path("/uploads/#{@current_db}/original") será simplemente /uploads/dbname/original

y, según nuestra reasignación, las nuevas rutas son https://bucket-location-url.com/uploads/dbname/original/

Eso significa que

  1. cdn_path es una subcadena de la nueva ruta de destino
  2. por lo tanto, Post.where("cooked LIKE '%#{cdn_path}%'").count siempre encontrará publicaciones
  3. gritará lobo solitario y se detendrá :scream: :scream: :scream:
3 Me gusta