ToS3MigrationError: upload non migrati a S3, con allegati non funzionanti. Come risolvere questo errore?

FileStore::ToS3MigrationError: 182 di 21512 caricamenti non sono stati migrati su S3. La migrazione su S3 è fallita per il database ‘default’.

quindi una parte dello stack trace da ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, ‘block in migrate_to_s3_all_sites’

Ho riscontrato questi errori due volte durante l’esecuzione del task uploads:migrate_to_s3. Circa l’1% dei file non è stato migrato correttamente, causando allegati rotti sul sito dopo un rebake. Sembra che si tratti di file più vecchi, risalenti ai primi mesi dalla creazione di questa istanza di Discourse.

Esaminando il bucket S3, sembra che i file siano stati effettivamente caricati con successo su S3; il problema è che non sono collegati correttamente dopo il rebake.


Rieseguire la migrazione (prima di un altro rebake) ha risolto il problema per qualche motivo. Lo stesso errore si verifica ancora durante il task migrate_to_s3.

Tuttavia, se eseguo di nuovo il rebake, i collegamenti agli allegati si rompono nuovamente.

Non credo che si tratti di errori, ma includo l’output durante il rebake:

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

L’esecuzione di rake posts:missing_uploads o PostCustomField.where(name: Post::MISSING_UPLOADS) non evidenzia alcun problema, quindi sembra che non siano correlati.

Il mio problema potrebbe essere correlato a questa discussione: Migrate_to_S3 Fails on Rebake - #12 by evenif

Vedrò cosa imparerò e potrei chiudere questa discussione e spostare la conversazione lì.

I vecchi allegati/caricamenti danneggiati vengono visualizzati come
[{nome file}|attachment](/uploads/default/original/2X/6/{hash sha1 + estensione}) nel testo grezzo del post. Questo viene elaborato come href="/uploads/default/original/2X/6/{hash sha1 + estensione}", che interrompe gli allegati dei file, ma non le immagini.

Gli allegati funzionanti successivi appaiono come [{nome file}|attachment](upload://{sha1 in base62 + estensione}) e vengono elaborati come href="/uploads/short-url/{sha1 in base62 + estensione}.

Ho scritto un piccolo codice Ruby per scorrere tutti i post nel periodo problematico noto e sostituire tutti i vecchi URL di caricamento con la versione più recente. Ho utilizzato la funzione base62_sha1 del modello Upload per convertire l’hash sha1 nel nome file atteso che gli URL brevi di Discourse si aspettano.

Questo ha fatto funzionare gli allegati. Poi ho eseguito un altro rebake solo per confermare la correzione e sembra che funzioni ancora. Sembra che il problema risiedesse solo in Post.raw e non avesse nulla a che fare con Upload.