Journaling και fsck

Giorgos Keramidas keramida at ceid.upatras.gr
Tue Nov 5 16:28:11 EET 2002


On 2002-11-05 10:13, Άγγελος Οικονομόπουλος <aoiko at cc.ece.ntua.gr> wrote:
> On Monday 04 November 2002 20:29, Giorgos Keramidas wrote:
> > On 2002-11-04 01:44, DJ Art wrote:
> > > On Monday 04 November 2002 01:00, Φίλιος Κωνσταντίνος wrote:
> > > >  Αν βάλω journaling, αυτή η δουλειά θα σταματήσει;
> > >
> > > Ναι, θα σταματήσει. Καμία σχέση με παλιά. reboot έτσι στην ψύχρα να
> > > χώσεις, δεν θα καταλάβει τίποτα.
> >
> > Αυτό δεν σημαίνει ότι δεν υπάρχει καμία περίπτωση για απώλεια
> > δεδομένων όμως, και πάντα αξίζει να το λέμε σε τέτοιες περιπτώσεις.
>
> bsd propaganda gia ta soft updates, e? (8a kataferei pote o kirk na
> kanei to background fsck na douleuei swsta? :) )

Προκατάληψη πως ότι λέω έχει πάντα σχέση με το τι κάνει το FreeBSD ε;

Όχι αγαπητέ.  Το journalling του reiserfs έχει κάτι που λέγεται
rollback.  Και το rollback κάνει, μάντεψε... roll back.  Γυρίζει το
filesystem κάποια βήματα πίσω.  Με ποια κριτήρια;

    Μέχρι που το filesystem να είναι σε stable κατάσταση.

> > Το journalling δεν εγγυάται ότι δεν θα χαθούν ποτέ και σε καμία
> > περίπτωση τα δεδομένα, αλλά ότι ποτέ δεν θα μείνει το filesystem σε
> > κατάσταση που να είναι "περίεργη" και να απαιτεί fsck.
>
> nyet. apla egguatai oti den 8a e3etastei olo to fs alla mono oti
> xreiazetai (basika den 8a e3etastei, log replay 8a ginei - san na
> kaneis ena fsck pou einai ane3arthto apo to mege8os tou fs
> (alla _oxi_ O(1))(god wrote in lisp mode)).

Και τι είναι my dear Watson αυτό το περίφημο log replay; Έστω ότι
κάνεις το εξής μικρό παράδειγμα.  Δεν κάνει τίποτα περίεργο.  Απλά
ανοίγει το ίδιο αρχείο δυο φορές και γράφει τη μια φορά τη φράση
"hello world" στο αρχείο και την άλλη τη φράση "hello second world".

     1	#define BUFLEN 30
     2	char buf[BUFLEN];
     3	int fd;
     4	int len;
     5
     6	fd = open("/tmp/hello.txt", O_RDONLY | O_TRUNC, S_IWRITE);
     7	if (fd == -1)
     8		err(1, "open #1");
     9
    10	bzero(buf, BUFLEN);
    11	snprintf(buf, BUFLEN, "hello world\n");
    12	len = strlen(buf);
    13	if (write(fd, buf, len) != len)
    14		err(1, "write #1");
    15
    16	if (close(fd) == -1)
    17		err(1, "close #1");
    18
    19	fd = open("/tmp/hello.txt", O_RDONLY | O_TRUNC, S_IWRITE);
    20	if (fd == -1)
    21		err(1, "open #2");
    22
    23	bzero(buf, BUFLEN);
    24	snprintf(buf, BUFLEN, "hello second world\n");
    25	len = strlen(buf);
    26	if (write(fd, buf, len) != len)
    27		err(1, "write #2");
    28
    29	if (close(fd) == -1)
    30		err(1, "close #2");

Έστω τώρα ότι ανάμεσα στη γραμμή 28 και στη γραμμή 29 πέφτει το ρεύμα.
Τι θα περιέχει το αρχείο /tmp/hello.txt μετά το rollback;  Αν το
rollback σε γυρίσει στο σημείο που έγινε το τελευταίο close() στο
αρχείο, τότε θα περιέχει το "hello world" [line 16 & sync].

Αν όμως σε γυρίσει στο τελευταίο επιτυχές γράψιμο δεδομένων στον
δίσκο, και στο μεταξύ έχει προλάβει το open("...", O_TRUNC) να
μηδενίσει το αρχείο, τότε ναι μεν θα έχεις ένα "σωστό" filesystem με
την έννοια ότι δεν θα περιέχει i-node δείκτες που δείχνουν κάπου
μεταξύ never-never land και Tanelorn, αλλά τα data που έχει το αρχείο
δεν είναι αυτά που είχες πριν.

Λοιπόν... τι θα γίνει;

:-)




More information about the Linux-greek-users mailing list