|Larus James |
Motivated by the power and volatility limitations of Dynamic Random Access Memory (DRAM), new, non-volatile memory (NVM) technologies are likely to become widely deployed in server and commodity computers in the near future. Memories built from these technologies can be directly accessible at the byte or word granularity and are also non-volatile. However, if we are to leverage non-volatility, it would not be enough to just keep data in NVM, but also to build necessary programming support to ensure that the persistent storage is left in a recoverable state after an unexpected or abrupt program failure.
Capturing a running application’s consistent state is only part of recovery. The persistent heap will be used after a restart, which means that it must be put into a state that is consistent in the new environment that exists when the application resumes execution. Another challenge is that transient values need to be removed from durable objects and pointers in a durable object may also become invalid after a crash if the durable heap is mapped to a different address in recovery.
Fixing such problems after a crash is a significant burden on a programmer. To address the issues, we present a C++ language extension for NVM reconstruction, the process of reestablishing the consistency of data structures stored in NVM in the environment in which an application is being restarted.
NVMReconstruction allows a programmer to label a field as transient, so that after a restart, the restored instances of this field will be zeroed. It supports more complex recovery through type-specific recovery methods, which can reinitialize transient fields in arbitrary ways. Programs written with NVMReconstruction use conventional data and code pointers, and the system automatically updates these pointers if the location of the persistent heap or the code segment changes.
Demonstration of NVMReconstruction using Atlas, an NVM programming framework, and the Echo key-value store, shows the ease of using NVMReconstruction with existing code and its low runtime overhead.