Matei Conovici scria la data de 7 Februarie 2006:
> >     Cred ca nu am explicat suficient de clar ce vreau.  Cand cineva
> > face un update, poate pune in directorul respectiv (prin Samba) mai
> > multe fisiere.  Daca a pus de exemplu 5 fisiere, e important sa
> > fie sincronizate fie toate 5, fie nici unul.  Tranzactia incepe in
> > momentul in care e deschis primul fisier si se termina in momentul
> > in care e inchis ultimul.  Nu e suficient sa impart asta in 5
> > tranzactii separate.
>
> Cum nu exista in SO o operatie atomica "creeaza 5 fisiere", nu cred
> ca-ti poti asigura in vreun fel atomicitatea tranzactiei daca nu te
> ajuti un pic, de exemplu cu un lockfile.

    Da, asta era clar de la inceput.  Ce nu mi-era clar era cum fac asta
numai cu informatia de pe server, fara interventii din partea procesului
care face modificarea.

> >     Timing-ul nu e critic, sunt acceptabile intarzieri de mai multe
> > minute.  E important insa sa nu amestec fisiere vechi cu fisiere
> > noi.  Un race condition e probabil inevitabil, dar sistemul trebuie
> > sa minimizeze asta.
>
> Daca vrei doar sa minimizezi sansele, i/dnotify ca sa vezi daca se
> umbla pe fs, si astepti un pic sa nu mai apara operatii noi :)

    We have a winner! :-) Asta ar putea sa mearga:

(1) Monitorizez directorul cu [di]notify; la fiecare modificare spawn-ez
    un proces care incrementeaza un semafor, asteapta 20 secunde,
    decrementeaza acelasi semafor, apoi iese.

(2) Dintr-un cron job verific semaforul; daca nu e pe zero, iese; daca e
    pe zero face directorul readonly, cheama rsync, apoi face directorul
    read-write.

    Probleme ramase:

(a) Inotify nu merge pentru 2.4.  Dnotify nu monitorizeaza automat
    directoarele nou create.  Solutie posibila: chem dnotify cu optiunea
    "--once" si il repornesc de fiecare data.  Problema cu asta: race
    condition.

(b) Mecanismul cu semafoare nu e robust, indiferent ce intgeleg prin
    "semafor".  Daca unul din procese moare inainte sa apuce sa
    decrementeze semaforul, sincronizarea nu se mai face niciodata.

(c) Nu pot face directorul read only fara race conditions.  Daca
    directorul este o partitie separata, situatia se imbunatateste
    putin, dar problema ramane.

    Pentru semafoare am AFAICT doua posibilitati: SysV IPC (shared
memory, nu semafoare in sensul ipc(2)), si named pipes.  Ambele abordari
ofera ample oportunitati pentru noi race conditions, si pentru nici una
comenzile shell standard nu sunt suficiente.  De fapt speram intr-o
solutie mai simpla.

    Alte comentarii?

    Salutari,

    Liviu Daia

-- 
Dr. Liviu Daia                                  http://www.imar.ro/~daia

_______________________________________________
RLUG mailing list
[email protected]
http://lists.lug.ro/mailman/listinfo/rlug

Raspunde prin e-mail lui