Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Locked down out-of-order writes, more tests
The main test additions are the test_powerloss tests, intended to be high-level tests over difficult/weird powerloss environments (such as out-of-order writes!): - test_powerloss_dir_many - 2242 pls - test_powerloss_file_many - 8856 pls - test_powerloss_file_pl_fuzz - 384508 pls - test_powerloss_filedir_pl_fuzz - 268339 pls But there was also a bunch of other test movement in the late-stage/ high-level tests. I'm trying to keep the core of these tests somewhat consistent so we have a nice template to extend for future testing, in case we want to test other environmentalish concerns, but not all of these tests make sense in all of these contexts: badblocks powerloss relocations exhaustion dir_many y y y dir_fuzz y y y file_many y y y file_fuzz y y y fwrite_fuzz y y orphanzombie_fuzz y y y orphanzombiedir_fuzz y y y file_pl_fuzz y y filedir_pl_fuzz y y Why not: - dir/file_many+exhaustion? - Needs to be unbounded - dir/file_fuzz+powerloss? - Takes O(n^2) - fwrite_fuzz+powerloss? - Takes O(n^2) - fwrite_fuzz+relocations? - Doesn't really test anything - orphanzombie*_fuzz+powerloss? - Powerloss kills zombies - file*_pl_fuzz+badblocks? - PL + Badblocks currently incompactible - file*_pl_fuzz+exhaustion? - PL + Badblocks currently incompactible --- Of course, in order to actually get out-of-order write testing working, we need to implement out-of-order write syncing. Fortunately this was a simple exercise in placing lfsr_bd_sync calls before any mdir commits where we may have unsynced data: - in lfsr_file_sync, to sync any pending file data - in lfsr_mdir_commit, to sync any mroot/mtree changes We also call lfsr_bd_sync _after_ mdir commits in case users expect to sequence any filesystem-external operations such as network, UI, etc. In theory this could be optional, but no users have really requested it yet, so leave that for a potential future improvement: - in lfsr_mdir_commit - in lfsr_formatinited (really just because we don't go through lfsr_mdir_commit) Note that lfsr_rbyd_commit has been relaxed in the scheme. It only flushes caches, and does _not_ call lfsr_bd_sync. This is useful for allowing multiple B-tree nodes to be written out-of-order, also long as the whole thing is synchronized before any mdir commit. All of these lfsr_bd_sync calls add a bit of code, but not really an amount to care about: code stack before: 33678 2600 after: 33766 (+0.3%) 2600 (+0.0%)
- Loading branch information