@RGJ gleichermaßen, ich bin aufrichtig der Meinung: Wenn jemand mit Sicherheit weiß, wie man das Fiasko des Neuaufbaus aller Bilder vermeidet, bin ich dafür. Und wenn ich ein erfahrener Discourse-Entwickler wäre und wüsste, wie man das einfach umsetzt, hätte ich das wahrscheinlich von Anfang an so gemacht.
Meine Vermutung ist, dass die Migration weg von S3 für diejenigen mit vielen Bildern kein häufiger Fall ist, sodass es sich im Verhältnis zu allgemein nützlicheren Features für Discourse kaum lohnt, die Zeit dafür aufzuwenden. Ich hatte beim Import von Google+ nach MakerForums etwa 100 GB hochgeladene Dateien. Wir entschieden uns für S3 mit der Idee, dass viele Nutzer aus diesen Communities zu MakerForums wechseln könnten. Am Ende zogen jedoch nur wenige Communities aktiv mit, sodass das weitere Wachstum den Verbleib bei S3 letztlich nicht mehr rechtfertigte. Ich gehe davon aus, dass dies ein eher extremer Ausreißer ist und die Neubearbeitung der Bilder nur einmalige Kosten verursacht.
Schließlich bin ich Ihnen sehr dankbar, dass Sie dieses Thema überhaupt eröffnet haben, denn sonst hätte ich nicht-postbezogene Uploads sehr leicht übersehen.
…
@RGJ Sie haben eindeutig recht, dass das Zerstören und Neuerstellen keine gute Lösung ist. Ich habe eine Prüfung hinzugefügt: raise "Error: upload url #{url} changed to #{new_upload.short_url}, should be unchanged." if url != new_upload.short_url, die zumindest Probleme mit beschädigten Quellen meldet. Der heutige Ausfall von Digital Ocean Spaces hat dazu geführt, dass mir beschädigte Daten gesendet wurden, wodurch dieser Fehler bei vielen Uploads ausgelöst wurde – ich weiß nicht, wie viele. Da jedoch der alte Upload bereits zerstört war, habe ich nun einige beschädigte Seiten. Mir ist das erst aufgefallen, nachdem ich den Scrollback mit den Logs verloren hatte, die mir mitteilten, welche Seiten beschädigt sind. Daher kann ich sie nicht einmal manuell aus einem Backup reparieren.
Meine Arbeit ist also zwar eine Verbesserung gegenüber dem alten Weg, da sie zumindest einige Fehler meldet, aber es wäre viel besser, die Dateien herunterzuladen, die SHA1-Prüfsummen der heruntergeladenen Dateien zu prüfen und sie dann in lokale Dateien zu schreiben. In der Zwischenzeit habe ich meinen PR so angepasst, dass die Migration bei jedem unbehandelten Fehler gestoppt wird, um Datenverlust zumindest zu begrenzen.
Ich bin immer noch der Meinung, dass meine Arbeit als Pareto-Verbesserung gemergt werden sollte, da sie die Situation nicht verschlechtert, sondern verbessert. Es wäre jedoch deutlich besser, es einfach richtig zu machen. Ich denke, das wäre die Erstellung von lib/file_store/from_s3_migration.rb, die parallel zu lib/file_store/to_s3_migration.rb arbeitet, aber das übersteigt derzeit meine Möglichkeiten.
Da mein PR noch nicht überprüft wurde, habe ich noch mehr darauf aufgesetzt. Ich habe eine Aufgabe uploads:report_missing_uploads hinzugefügt, die in raw nach Vorkommen von upload://... sucht, bei denen das Upload-Objekt nicht vorhanden ist. Zumindest in meinem Fall kann ich dank Backups durch diese suchen, die verwaisten Dateien finden und sie auf die Site wiederherstellen, um dann diese Beiträge neu zu rendern und die fehlenden Bilder wiederherzustellen. Ich habe 678 solcher Fälle gefunden, von denen ich bisher alle außer 10 in den Backups wiedergefunden habe. Daher bin ich froh, dass ich diesen Test geschrieben habe! Ich muss das noch erledigen, bevor ich in die Phase übergehen kann, in der ich die restlichen Beiträge neu rendern werde.
…
Ich habe meine erste Migrationsphase abgeschlossen, ohne die betroffenen Beiträge mit geteilten Uploads neu zu rendern und ohne nicht-postbezogene Uploads. Nach Abschluss eines weiteren Remote-Backups plane ich, diese Funktionen ebenfalls zu testen und sie meinem PR hinzuzufügen.
…
Ich habe nun mit dem Testen der nächsten Migrationsphasen begonnen: Neu-Rendering und Migration nicht-postbezogener Uploads. Meine erste Lektion war, dass das Neu-Rendering als nächster Schritt aufgrund von Avatar-Bildern in Zitaten, die nicht-postbezogene Uploads betreffen, fehlschlägt. Daher muss das Neu-Rendering der Beiträge der letzte Schritt sein.
Nächste Entdeckung: Danke für die Fremdschlüsselbeschränkungen! Während der Migration nicht-postbezogener Uploads stellte ich fest, dass ich mindestens Profile vor der allgemeinen Migration nicht-postbezogener Uploads migrieren muss.
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: update or delete on table "uploads" violates foreign key constraint "fk_rails_1d362f2e97" on table "user_profiles"
Die Profil-Migration war knifflig, da ich zwei mit dem Profil verbundene Uploads migrieren musste. In einigen Fällen verwendeten die Benutzer jedoch dasselbe Bild für beide, sodass ich diese Arbeit in drei Schritten erledigen musste. Ich habe alle Profile auf meiner Site mit S3-URLs erfolgreich migriert.
Ich habe alle nicht-postbezogenen, nicht-profilbezogenen Uploads migriert. @RGJ, wenn Sie den von mir geposteten Branch testen möchten, ist er mit meiner Arbeit auf dem neuesten Stand. Alles darin wurde bereits für eine abgeschlossene Site-Migration verwendet.
…
@cvx Ich weiß nicht, wann Sie Zeit für eine Überprüfung haben werden, aber ohne meinen PR ist migrate_from_s3 definitiv voller schweigsamer Datenvernichtungsfehler. Was ich getan habe, ist nicht perfekt, aber es schützt vor vielen Fehlern, auf die ich in der Praxis gestoßen bin.
Ich habe hier all die Arbeit erledigt, die ich derzeit vorhatte. Ich habe meine Site migriert, was bedeutet, dass ich selbst keine effektiv bewerteten Änderungen mehr vornehmen kann. Wenn Sie diesen PR ablehnen, schlage ich dringend vor, stattdessen die bestehende Migration zu löschen, da sie für Benutzer Daten stillschweigend zerstören wird.
Bezüglich des PR: Manchmal treten in CI (in der aktuellen Version) Testfehler auf, ähnlich wie hier:
7867 examples, 0 failures, 11 pending, 1 error occurred outside of examples
##[error]Process completed with exit code 1.
Dies lässt sich bei mir lokal (bisher) nicht reproduzieren, und ich sehe in den CI-Logs keine Informationen darüber, was in CI falsch läuft. Daher werde ich meine Zeit nicht weiter damit verschwenden, CI-Ausgaben nach versteckten Informationen zu durchsuchen.
Eine letzte Anmerkung: Nach Abschluss der Migration stellten wir fest, dass die Profilbilder einiger Benutzer bei der Migration verloren gingen und sie diese manuell wiederherstellen. Ich vermute, dass zusätzlicher Code erforderlich gewesen wäre, um dies erfolgreich abzuschließen. Da ich das jedoch erst zu spät herausfand, habe ich keinen Testfall, um dies zu validieren. Das ist also ein verbleibender Fehler, der in einigen Konfigurationen Probleme verursachen könnte, aber ich bin nicht mehr in der Lage, diese zusätzliche Korrektur zu schreiben.