|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Commit changes to ensure superblock is always flushed last.
Description:
This change ensures the superblock is always the last dirty cache
entry flushed to disk. This needs to happen because the file size
is written into the superblock, and if we're not truncating the
file to match the current EOA, then the reported file size at the
time of superblock flush is only going to be guaranteed to be
correct if all other data has already been written and the
superblock is the last thing to disk.
To do this, cache states have been created to indicate when an
entry needs to be flushed last (and collectively, in parallel,
since the flush callback needs to coordinate the EOF value stored
in the VFL amongst all processes). These are flush_me_last and
flush_me_collectively, respectively.
However! Note that since the superblock is the only entry that
actually takes advantage of these flags at this time, the code has
been protected with asserts to enforce this (and some liberties
have been taken to reduce the coding effort using this knowledge
so as not to handle the large number of cases this potentially
introduces - these assumptions made when coding have been
documented in comments around additions where applicable).
Expanding on this behavior in the future will require additional
work to handle additional possible scenarios (e.g. multiple
"flush_me_collectively" entries need to be properly scheduled
amongst all processes during candidate list creation and/or
parsing, how to handle when an entry has one but not both of the
new flags, et cetera).
In passing, I've made some tabs-to-spaces and other general
whitespace cleanups in some of the areas I worked in for clarity.
Tested:
h5committested (jam, koala, ostrich) and coverage in existing
avoid truncate tests ensured. Coverage in cache unit testing
still needed prior to merge to trunk.
|