Context: playing with some toy database / storage implementations.
For Rust IO crates, are there any that clearly specify the following:
- we open a file for read/write
- we issue some write ops (possibly including a flush)
- we do not yet get a "completed" message back
- system crashes
question: what is the space of all possible states the file system can be in ?
Possible answers are:
(1) ideal (but unrealistic) world: let F0 = last state we got a "write done"; let F! = new state we want; the file is at either F0 or F1
(2) also nice (but probably unrealistic world): let F0 = last state we got a "write done"; let d0, d1, ..., dn be the write commands we issued. The file is at F0 + d0 + d1 + d2 + ... + d_i for some i.
(3) no guarantees whatsoever (realistic but useless)
(4) maybe?: let F0 = last state we got a "write done"; let F1 = intended state; divide them into blocks of 4kb; on blocks that they agree, the blocks guarnteed to stay the same; on blocks they disagree, no guarantee ....
Question: do any Rust crates doing IO on linux x86_64 make any form of useful guarantees of the form:
last good state = F0; we are writing towards F1; machine crashes, ... we guarantee the following properties about the half written file ... ?
[ It is file to have separate answers opened in append-only mode, mmap mode, etc ... ]