Lewati ke konten

Atomisitas & Pemulihan

AtomicFilesystem::write_atomic() menulis ke file sementara, melakukan flush dan fsync pada file handle tersebut, mengganti file di jalur target dengan rename, lalu mencoba melakukan fsync pada direktori induk. Penulisan yang gagal menghapus file sementaranya sendiri.

Instans store yang melakukan penulisan mendaftarkan penanda per proses di .storh/writers/ dan menghapusnya saat proses dimatikan dengan bersih. Saat store dibuka, penanda tersebut diperiksa: jika pemilik setiap penanda masih aktif (atau tidak ada penanda), proses membuka berlangsung dalam waktu konstan; penanda yang pemilik prosesnya sudah tidak ada berarti penulis mengalami crash, sehingga proses membuka memindai seluruh koleksi untuk mencari file sementara yatim dan menghapus penanda usang. repair() selalu melakukan pemindaian.

Perbaikan DocStore mengarantina file record yang rusak atau terpotong di bawah .storh/corrupt/ dan membangun ulang indeks sekunder dari record valid yang tersisa. Verifikasi DocStore juga membandingkan file indeks dengan pemindaian penuh record agar entri indeks yang hilang atau usang dilaporkan sebelum dianggap sehat.

Mesin append-only melakukan flush dan fsync pada file log mereka sebelum menganggap peristiwa tersimpan dalam memori. Ketahanan terhadap kehilangan daya tetap bergantung pada sistem file dan opsi mount yang mendasari, apakah keduanya mematuhi sinkronisasi file dan direktori.

Log tersegmentasi menulis setiap baris sebagai:

Text
<byte-length>\t<xxh32>\t<json>\n

Pembacaan memverifikasi panjang byte dan checksum. Pemulihan memindai setiap segmen dan memotong file pada baris valid terakhir yang lengkap, sehingga menghapus penulisan akhir yang terpotong. Verifikasi membandingkan indeks status turunan yang aktif dengan pemutaran ulang segmen secara independen, sehingga status yang diubah dari luar atau usang dilaporkan sebelum perbaikan membangunnya ulang.

Verifikasi antrean mendekode setiap peristiwa antrean yang persisten dan membandingkan status saat ini—pending, processing, done, payload, serta urutan klaim—dengan pemutaran ulang log secara independen. Perbaikan membangun ulang status tersebut dari queue.log dan memotong peristiwa akhir yang terpotong. Klaim dan penyelesaian mengunci antrean saat menyinkronkan dari log persisten, sehingga beberapa proses worker tidak mengklaim pekerjaan pending yang sama.

Pemadatan menulis file segmen compact-* baru, lalu memperbarui manifest. Jika proses berhenti sebelum manifest ditukar, saat dibuka kembali file hasil pemadatan yang tidak direferensikan akan dihapus dan proses dilanjutkan dari manifest lama. Pemadatan yang selesai sengaja membiarkan segmen lama yang tersegel tetap ada agar pembaca yang sedang membacanya tetap berfungsi.