CodamAIDocs
Themafertig

Rollback bei Dateien

Wie der Dateiinhalt beim Rollback zurückkopiert wird und warum der aktuelle Stand vorher gesichert wird.

Ausprägungen
Inhalt kommt mit dem Datensatz zurückaktueller Inhalt wird vorher als Version gesichertRollback eines RollbacksRevision ohne fileVersion → Inhalt bleibtgleicher Inhalt wie jetztName, Größe und Typ

Worum es geht

Ein Datei-Modell hat zwei Teile: den Datensatz in der Datenbank und den Inhalt im Dateispeicher. Ist das Modell auditiert, bleibt jeder alte Inhalt als Version liegen, und jede Revision des Datensatzes merkt sich in fileVersion, welcher Inhalt zu ihr gehört. Siehe Dateiversionen.

Ein Rollback setzt beide Teile gemeinsam zurück: den Datensatz auf den Stand der Revision und den Inhalt auf die Version, die in dieser Revision steht.

Vorher und nachher im Speicher

Ein Vertrag wurde dreimal hochgeladen. Jetzt wird er auf die Revision der ersten Fassung zurückgesetzt:

Vorher – der Datensatz trägt fileVersion 1790000300000:

Datei im SpeicherInhalt
<fileId>„Fassung drei“ (aktuell)
<fileId>.1790000200000„Fassung zwei“
<fileId>.1790000100000„Fassung eins“

Nachher – POST /fileasset/f1…/rollback/17, der Datensatz trägt fileVersion 1790000100000:

Datei im SpeicherInhalt
<fileId>„Fassung eins“ (aktuell, eine Kopie)
<fileId>.1790000300000„Fassung drei“ (neu als Version gesichert)
<fileId>.1790000200000„Fassung zwei“
<fileId>.1790000100000„Fassung eins“ (bleibt als Version liegen)

Der aktuelle Inhalt bekommt die Kennung der Version, von der er eine Kopie ist. Datensatz und Inhalt passen also wieder zusammen: fileVersion 1790000100000 heißt „Fassung eins“.

Der Ablauf

Rollback eines Datei-Modells auf Revision 17
  1. 1
    Client→CDMS
    POST /fileasset/f1…/rollback/17 mit response
  2. 2
    CDMS
    prüft Sichtbarkeit und Rollback-Rolle wie bei jedem Rollback
  3. 3
    CDMS
    merkt sich die fileVersion, die der Datensatz jetzt trägt: 1790000300000
    Das ist die Kennung des Inhalts, der gerade im Speicher liegt.
  4. 4
    CDMS→Datenbank
    setzt den Datensatz auf Revision 17 zurück. Er trägt jetzt fileVersion 1790000100000.
  5. 5
    CDMS→Dateispeicher
    Gibt es die Version 1790000100000?
    Nein → 500 file-version-not-found, die Änderung in der Datenbank wird verworfen.
  6. 6
    CDMS→Dateispeicher
    kopiert <fileId>.1790000100000 in eine Zwischendatei neben <fileId>
    Kopieren, nicht verschieben: Die Version bleibt liegen und kann später wieder zurückgeholt werden. Aktuell ist weiterhin „Fassung drei“.
  7. 7
    CDMS
    setzt fileSize und mimeType nach dem zurückgeholten Inhalt
  8. 8
    CDMS→Datenbank
    After-Hooks, flush, zurücklesen, Commit
    Scheitert hier etwas, wird die Zwischendatei verworfen. Datensatz und Inhalt bleiben auf „Fassung drei“.
  9. 9
    CDMS→Dateispeicher
    benennt den aktuellen Inhalt in <fileId>.1790000300000 um und die Zwischendatei in <fileId>
    So bleibt „Fassung drei“ erhalten, und „Fassung eins“ ist in einem Schritt aktuell.
    Ergebnis: GET /fileasset/f1…/file liefert „Fassung eins“. Die Historie hat eine neue MOD-Revision.

Warum der aktuelle Inhalt vorher gesichert wird

Ohne diesen Schritt würde der Rollback den aktuellen Inhalt überschreiben. „Fassung drei“ wäre dann weg, obwohl die Historie noch eine Revision mit fileVersion 1790000300000 enthält. Ein Rollback auf diese Revision fände keinen Inhalt mehr.

So aber gilt dieselbe Regel wie für den Datensatz: Die Geschichte wird nicht umgeschrieben. Jede Revision findet ihren Inhalt, auch die Revision direkt vor dem Rollback.

Die Ausprägungen

Rollback und Dateiinhalt

Wann: Die Zielrevision nennt eine andere Version als der aktuelle Stand.

Der aktuelle Inhalt wird zur Version, die Zielversion wird an den aktuellen Platz kopiert.

Ergebnis: Download liefert den alten Inhalt.

Wann: Nach dem Rollback auf 17 wird auf die Revision davor zurückgesetzt.

Der aktuelle Inhalt ist eine Kopie von Version 1790000100000, die es schon gibt. CDMS legt sie deshalb nicht doppelt ab, sondern entfernt nur die Kopie. Dann kopiert es Version 1790000300000 zurück.

Ergebnis: „Fassung drei“ ist wieder aktuell, im Speicher liegt keine Datei doppelt.

Wann: Nach dem Rollback wird ein neuer Inhalt hochgeladen.

Auch hier ist der aktuelle Inhalt nur eine Kopie einer vorhandenen Version. Er wird entfernt statt ein zweites Mal gesichert, und der neue Inhalt nimmt seinen Platz ein.

Wann: Die Zielrevision stammt aus der Zeit, bevor der Datensatz eine fileVersion hatte.

Der Datensatz wird zurückgesetzt, der Inhalt bleibt, wie er ist. CDMS kann keinem Inhalt sicher sagen, dass er zu dieser Revision gehört, und rät nicht.

Wann: Seit der Zielrevision wurde nur der Datensatz geändert, etwa umbenannt, aber kein neuer Inhalt hochgeladen.

Die Zielrevision nennt dieselbe fileVersion wie der aktuelle Stand. Der Inhalt ist also schon der richtige. CDMS setzt nur den Datensatz zurück und lässt den Inhalt, wie er ist.

Ergebnis: Der alte Name und die übrigen Felder sind zurück, der Download liefert denselben Inhalt wie vorher.

Name, Größe und Typ

FeldNach dem Rollback
nameder Name aus der Zielrevision, wie jedes einfache Feld
fileVersiondie Kennung der zurückgeholten Version
fileSizeneu gemessen am zurückgeholten Inhalt
mimeTypeneu bestimmt aus der Endung des Namens, wie beim Hochladen
fileIdbleibt, sie bestimmt den Ort im Speicher

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-system-layer – AbstractSystemLayer.historyRollback (currentFileVersion vor dem Rollback), AbstractLayer.rollbackFileContent (targetVersion null → nichts), currentFileVersion
  • CDMS/cdms-localfs-storage – LocalFSFileController.stageRollback (gleiche Kennung → nichts zu tun, file-version-not-found, Kopie in eine Zwischendatei, applyStoredMetadata), Staged.publish (retainCurrentContent, Umbenennen), retainCurrentContent (vorhandene Version → aktuelle Kopie wird gelöscht); FileUtils.versionPath; ADR-021
  • CDMS/cdms-integrationtest – AbstractFileRollbackTest (rollbackRestoresTheContentOfThatRevision, rollbackAddsARevisionInsteadOfRewritingOne, rollbackWithoutTheRoleIsRefused, aRefusedRollbackKeepsTheCurrentContent, rollingBackARenameKeepsTheContent)
  • documentation/50-auditierung/01-auditing-und-historie.md (Dateien beim Rollback)
Suchen