[Allegro] Frage zu acon und "put"

Bernhard Eversberg ev at biblio.tu-bs.de
Di Jan 10 11:31:40 CET 2012


Am 09.01.2012 14:21, schrieb Anando Eger:
>
> dem Untenstehenden stimme ich 100%ig zu - schön, dass Herr Berger
> das noch einmal so klar aufgeschrieben hat.
>

Sicher. Hängenbleiben tut es alles natürlich allein an uns. Aber OK,
OpenSource soll ja eben dafür sorgen, daß das nicht so bleiben muß...

Bei der Untersuchung des Problemumfangs stellte sich raus, daß gewisse
Kleinigkeiten auch noch in acon zu machen sind. Es wird also nebenher
eine neue V32.0 geben und dann einen update.job, der auf dieses
angewiesen ist. Anders ist die Sache nicht sauber zu lösen.

Wir haben dann, was die Locking-Prozeduren angeht, in acon diesen
Funktionsumfang der FELX-Befehle:

Befehl            Pruefung mit

set tbl lock      if yes/no (wenn gesperrt, werden 10 Versuche gemacht,
                         mit je 1 Sek Pause)
set tbl free        keine, klappt immer (sonst versagt vorher schon
                        "tbl lock")

set rec lock      if yes/no
set rec unlock    if yes/no

if Lock      (aktueller Satz ist gesperrt)
if not Lock  (nicht gesperrt)

---------------------------------

Damit ergibt sich als sinnvolle Sequenz vor und nach dem Speichern, und
damit werden wir mal das Update-Prozedere durchtesten:

:rloop
// naechsten Satz einlesen
...

// Zuerst Satzsperre pruefen, dreimal, erst 2, dann 8 Sek. Pause
if not Lock jump settbl
sleep 2000
if not Lock jump settbl
sleep 8000
if not Lock jump settbl
jump wasLocked

// Satz ist nicht gesperrt
:settbl
// TBL sperren
set tbl lock
// zweiter Versuch (nochmal 10 Sek.)
if no set tbl lock
// dritter Versuch (nochmal 10 Sek.)
if no set tbl lock
// wieder nix, dann aufgeben
if no jump tblTrouble

// Nun den Satz NOCHMAL pruefen
// - evt. gerade eben anderweitig gesperrt worden!
// (sog. "race condition") Dann aufgeben

if Lock jump wasLocked
// aber nun kann das nicht mehr passieren, weil immer zuerst
// die TBL gesperrt ist, und das haben wir ja selber gemacht

// Satz sperren UND Schluessel merken
// (fuer "put" wichtig, sonst muesste man set lock nicht machen!)
set lock
// Nun Satz ändern oder was auch immer
  ....
// dann speichern
set tbl free
put
if ok jump putok
sleep 5000
// zweiter Versuch, nach 5 Sek.
put
if ok jump putok
jump putErr

:putok
jump rloop

:wasLocked
//Satz in die Protokolldatei o.a. mit write kn
wri "Speichern misslungen, Satz gesperrt: " n kn n
// weiter zum naechsten Satz
jump rloop

:putErr
//Satz in die Protokolldatei o.a. mit write kn
wri "Speichern misslungen: " n kn n
// weiter zum naechsten Satz
jump rloop


B.E.



Mehr Informationen über die Mailingliste Allegro