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:
- 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
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
dbnamecomo el nombre de la base de datos para este ejemplo - tenemos
S3_CDN_URLconfigurado - no tenemos
CDN_URLconfigurado
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
cdn_pathes una subcadena de la nueva ruta de destino- por lo tanto,
Post.where("cooked LIKE '%#{cdn_path}%'").countsiempre encontrará publicaciones - gritará lobo solitario y se detendrá
