ToS3MigrationError: Uploads nicht nach S3 migriert, was zu kaputten Anhängen führt. Wie behebt man diesen Fehler?

FileStore::ToS3MigrationError: 182 von 21512 Uploads wurden nicht nach S3 migriert. Die S3-Migration für die Datenbank ‘default’ ist fehlgeschlagen.

gefolgt von einem Stack-Trace aus ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’ und ‘block in migrate_to_s3_all_sites’

Ich bin bei der Ausführung des Tasks uploads:migrate_to_s3 zweimal auf diese Fehler gestoßen. Etwa 1 % der Dateien wurden nicht erfolgreich migriert, was nach einem Rebuild zu defekten Anhängen auf der Site führte. Alle scheinen ältere Dateien aus den ersten Monaten zu sein, als ich diese Discourse-Instanz erstmals erstellt habe.

Bei einer genaueren Untersuchung des S3-Buckets scheinen die Dateien tatsächlich erfolgreich nach S3 hochgeladen worden zu sein; sie sind nach dem Rebuild lediglich nicht korrekt verknüpft.


Das erneute Ausführen der Migration (vor einem weiteren Rebuild) hat das Problem aus irgendeinem Grund behoben. Der gleiche Fehler tritt weiterhin während des Tasks migrate_to_s3 auf.

Wenn ich jedoch erneut einen Rebuild durchführe, werden die Anhangslinks wieder defekt.

Ich halte diese nicht für Fehler, füge aber die Ausgabe während des Rebuilds hinzu:

/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

Die Ausführung von rake posts:missing_uploads oder PostCustomField.where(name: Post::MISSING_UPLOADS) zeigt keine Probleme auf, sodass dies offenbar nichts damit zu tun hat.

Mein Problem könnte mit diesem Issue zusammenhängen: Migrate_to_S3 Fails on Rebake - #12 by evenif

Ich werde mir ansehen, was ich herausfinde, und diesen Thread möglicherweise schließen und das Gespräch dorthin verlagern.

Die alten defekten Anhänge/Uploads erscheinen im Rohtext des Beitrags als
[{Dateiname}|attachment](/uploads/default/original/2X/6/{sha1-Hash + Erweiterung}). Dies wird als href="/uploads/default/original/2X/6/{sha1-Hash + Erweiterung}" verarbeitet, was Datei-Anhänge bricht, aber nicht Bilder.

Später funktionierende Anhänge erscheinen als [{Dateiname}|attachment](upload://{sha1-zu-base62 + Erweiterung}) und werden als href="/uploads/short-url/{sha1-zu-base62 + Erweiterung} verarbeitet.

Ich habe ein kleines Ruby-Skript geschrieben, das alle Beiträge im bekannten problematischen Zeitraum durchgeht und alle alten Upload-URLs durch die neuere Version ersetzt. Dabei habe ich die Funktion base62_sha1 des Upload-Modells verwendet, um den sha1-Hash in den erwarteten Dateinamen umzuwandeln, den Discourse-Short-URLs erwarten.

Dadurch funktionierten die Anhänge. Anschließend habe ich noch einmal ein Re-bake durchgeführt, um die Korrektur zu bestätigen, und es scheint immer noch zu funktionieren. Es scheint, als läge das Problem ausschließlich in Post.raw und habe nichts mit Upload zu tun.