Ατομικότητα και ανάκαμψη
Το AtomicFilesystem::write_atomic() γράφει σε προσωρινό αρχείο, κάνει flush και
fsync στον χειριστή του αρχείου, το μετονομάζει αντικαθιστώντας τη διαδρομή-στόχο και προσπαθεί να κάνει fsync
στον γονικό κατάλογο. Οι αποτυχημένες εγγραφές διαγράφουν το δικό τους προσωρινό αρχείο.
Οι εγγράψιμες παρουσίες αποθήκης καταχωρίζουν έναν δείκτη ανά διεργασία στο
.storh/writers/ και τον αφαιρούν κατά τον ομαλό τερματισμό. Κατά το άνοιγμα μιας αποθήκης ελέγχονται
αυτοί οι δείκτες: αν ο κάτοχος κάθε δείκτη είναι ενεργός (ή αν δεν υπάρχουν δείκτες), το άνοιγμα
έχει σταθερό χρόνο· αν η διεργασία που κατέχει έναν δείκτη έχει τερματιστεί, σημαίνει ότι μια διεργασία εγγραφής
κατέρρευσε, οπότε κατά το άνοιγμα γίνεται σάρωση της συλλογής για ορφανά προσωρινά αρχεία και
διαγράφεται ο παλιός δείκτης. Το repair() εκτελεί πάντα σάρωση.
Η επιδιόρθωση του DocStore θέτει σε καραντίνα τα κατεστραμμένα ή περικομμένα αρχεία εγγραφών στο
.storh/corrupt/ και αναδημιουργεί τα δευτερεύοντα ευρετήρια από τις υπόλοιπες έγκυρες
εγγραφές. Η επαλήθευση του DocStore συγκρίνει επίσης τα αρχεία ευρετηρίων με πλήρη σάρωση των εγγραφών,
ώστε να εντοπίζονται ελλείπουσες ή παρωχημένες καταχωρίσεις ευρετηρίου πριν θεωρηθούν
υγιείς.
Οι μηχανές προσθήκης μόνο στο τέλος κάνουν flush και fsync στους χειριστές των αρχείων καταγραφής τους προτού θεωρήσουν τα συμβάντα αποθηκευμένα στη μνήμη. Η ανθεκτικότητα σε διακοπή ρεύματος εξακολουθεί να εξαρτάται από το αν το υποκείμενο σύστημα αρχείων και οι επιλογές προσάρτησης τηρούν τους συγχρονισμούς αρχείων και καταλόγων.
Το τμηματοποιημένο αρχείο καταγραφής γράφει κάθε γραμμή ως εξής:
<byte-length>\t<xxh32>\t<json>\n
Οι αναγνώσεις επαληθεύουν το μήκος των byte και το άθροισμα ελέγχου. Η ανάκαμψη σαρώνει κάθε τμήμα και περικόπτει το αρχείο στην τελευταία πλήρη έγκυρη γραμμή, αφαιρώντας έτσι τις ημιτελείς εγγραφές στο τέλος. Η επαλήθευση συγκρίνει το ενεργό ευρετήριο παράγωγης κατάστασης με ανεξάρτητη επανάληψη των τμημάτων, ώστε να αναφέρονται αλλαγές εκτός συστήματος ή παρωχημένη κατάσταση πριν η επιδιόρθωση την αναδημιουργήσει.
Η επαλήθευση της ουράς αποκωδικοποιεί κάθε ανθεκτικό συμβάν ουράς και συγκρίνει την τρέχουσα
κατάσταση εκκρεμών, υπό επεξεργασία και ολοκληρωμένων εργασιών, καθώς και το περιεχόμενο και τη σειρά ανάληψης, με ανεξάρτητη
επανάληψη του αρχείου καταγραφής. Η επιδιόρθωση αναδημιουργεί αυτή την κατάσταση από το queue.log και περικόπτει
τα ημιτελή συμβάντα στο τέλος. Οι αναλήψεις και οι ολοκληρώσεις κλειδώνουν την ουρά όσο συγχρονίζονται με
το ανθεκτικό αρχείο καταγραφής, ώστε πολλές διεργασίες εργατών να μην αναλαμβάνουν την ίδια εκκρεμή εργασία.
Η συμπύκνωση γράφει νέα αρχεία τμημάτων compact-* και έπειτα ενημερώνει το manifest.
Αν μια διεργασία τερματιστεί πριν από την αλλαγή του manifest, κατά το εκ νέου άνοιγμα αφαιρούνται τα μη αναφερόμενα
αρχεία εξόδου συμπύκνωσης και συνεχίζεται η λειτουργία με το παλιό manifest. Οι ολοκληρωμένες συμπυκνώσεις αφήνουν σκόπιμα τα παλιά κλειστά τμήματα στη θέση τους, ώστε να παραμένουν έγκυρα για αναγνώστες που ήδη διαβάζουν από αυτά.