(Sihang Liu presenting on Wed. 4/24 Task 2.4 liaison meeting)
Recent
non-volatile memory technologies such as 3D XPoint and NVDIMMs have enabled
persistent memory (PM) systems that can manipulate persistent data directly in
memory. This advancement of memory technology has spurred the development of a
new set of crash-consistent software (CCS) for PM - applications that can
recover persistent data from memory in a consistent state in the event of a
crash (e.g., power failure). CCS developed for persistent memory ranges from
kernel modules to user-space libraries and custom applications. However,
ensuring crash consistency in CCS is difficult and error-prone. Programmers
typically employ low-level hardware primitives or transactional libraries to
enforce ordering and durability guarantees that are required for ensuring crash
consistency. Unfortunately, hardware can reorder instructions at runtime,
making it difficult for the programmers to test whether the implementation
enforces the correct ordering and durability guarantees.
We
believe that there is an urgent need for developing a testing framework that
helps programmers identify crash consistency bugs in their CCS. We find that
prior testing tools lack generality, i.e., they work only for one specific CCS
or memory persistency model and/or introduce significant performance overhead.
To overcome these drawbacks, we propose PMTest1 , a crash consistency testing
framework that is both flexible and fast. PMTest provides flexibility by
providing two basic assertion-like software checkers to test two fundamental
characteristics of all CCS: the ordering and durability guarantee. These
checkers can also serve as the building blocks of other application-specific,
high-level checkers. PMTest enables fast testing by deducing the persist order
without exhausting all possible orders. In the evaluation with eight programs,
PMTest not only identified 45 synthetic crash consistency bugs, but also
detected 3 new bugs in a file system (PMFS) and in applications developed using
a transactional library (PMDK), while on average being 7.1x faster than the
state-of-the-art tool.