Re: [Allegro] Dateiinhalt wird mit Byte 00 überschrieben

Bernhard Eversberg ev at biblio.tu-bs.de
Di Nov 20 07:23:29 CET 2012


Am 19.11.2012 17:10, schrieb Andreas Wolf:

> Wir haben nunmehr zum zweiten Mal in den letzten drei Monaten ein
> merkwürdiges Phänomen. Vielleicht kennt das ja jemand.
>
> Nebenbei: auf meinen Rechnern ist das noch nie aufgetreten... Ich tippe
> entsprechend eher auf Festplatte und/oder Netzwerk als auf allegro.
>
> Eine allegro Datenbank blockiert plötzlich vollständig. Es ist keine
> Entsperrung der TBL möglich, keine Reorganisation möglich und auch kein
> erneuter Aufruf der allegro Datenbank möglich.
>
> Bei der Analyse stellt sich heraus, daß die Datei kat_1.ald zwar noch immer
> die exakte Größe hat (knapp unter 16 MB), alle Bytes darin aber vom Byte
> Hex00 überschrieben wurden. Dies betrifft nicht kat_2.ald oder kat_3.ald.
>
> Sprich: Alle Daten sind weg.
>

Welches Programm, welche Version, welche Plattform?
Gesamte Datei nur noch Nullen, oder vorn oder hinten noch Daten?
Oder mittendrin ein einzelner Satz? (per HEX-Editor nach "20" suchen)
(Das könnte dann der zuletzt gespeicherte Satz sein)
Welche Aktionen gingen dem Debakel voran?
Haben Sie den letzten Eintrag in der LOG-Datei besichtigt, und fiel
daran etwas auf? (Damit müßte ja der letzte Schreibvorgang erfolgt
sein)

Zur Sache selbst:

Ein Auffüllen mit Nullen passiert nirgends in allegro.
Es gibt ein Auffüllen mit Füllzeichen (Bef. f und F in der CFG)
wenn der zu speichernde Satz kürzer ist als seine in dem
Moment in der Datenbank vorhandene ältere Version, die dann
überschrieben wird und am restlichen Ende eben mit Füllzeichen
ergänzt, damit dort keine residuellen Daten stehenbleiben.
Hierbei gab es auch mal einen Fehler, der aber zum
Aufblähen mit Füllzeichen führte, nicht mit Nullen.
Nochmals: Ein Auffüllen mit Nullen erfolgt(e) seitens allegro
in keinem seiner Module oder Versionen.

Was passiert genau beim Speichern, wo und wie könnte da ein
Auffüllen mit Nullen sich ereignen?
Grob sind es 3 Schritte:

1. Feststellen der Offset-Position des zu speichernden Satzes
    (entweder die alte Position, oder  Suche eines Leersatzes über die
     //-Schlüssel, oder Ende der Datei (falls keine solchen da sind)

2. Positionieren in der (zum Schreiben geöffneten) .ALD-Datei

3. Schreiben des Satzes und ggfls. Auffüllen der Länge mit Füllz.

Beim Schritt 2. *könnte* es geschehen, daß das Betriebssystem
in dem Moment eine falsche (zu kurze) Dateilänge annimmt. Das
Positionieren auf eine jenseits des tatsächlichen Endpunkts
liegende Stelle würde, Öffnung mit Schreibmodus vorausgesetzt,
dann in der Tat dazu führen, aber das macht das Betriebnssystem!,
daß die Datei auf diese Größe verlängert wird und ab der tatsächlichen
Endposition mit Nullen aufgefüllt.
Wenn es so ist, daß die gesamte Datei nur noch aus Nullen besteht,
aber kürzer als 16MB ist, bleiben aus meiner Sicht keine anderen
Möglichkeiten, als daß diese Überschreibung vorher von anderer
Seite passiert ist. Eigentlich sollte dann aber in der Datei der
zuletzt gespeicherte Satz (Kopie in der .LOG) stehen.
Wenn es so ist, daß am Ende der genannte Satz steht, dann war
u.U. die Datei vor dem Schreiben leer (0 Byte), auch dies, oder
die Löschung der Datei kann aber kein allegro-Schreibbefehl bewirkt
haben.
Wäre es hingegen so, daß am Anfang noch Daten
stehen, hätte die Dateilänge beim Beginn der Schreibaktion
nicht mehr gestimmt, was wohl kaum anzunehmen ist. (allegro
prüft und setzt in solchen Aktionen nicht diese Länge, das ist
dem System überlassen).

B.E.




Mehr Informationen über die Mailingliste Allegro