TxFS is a novel transactional file system that builds upon the file system’s atomic-update mechanism such as journaling. Though prior work has explored a number of transactional file systems, TxFS has a unique set of properties: a simple API, portability across different hardware, high performance, low complexity (by building on the journal), and full ACID transactions.
Please cite the following paper if you use TxFS: TxFS: Leveraging File-System Crash Consistency to Provide ACID Transactions. Yige Hu, Zhiting Zhu, Ian Neal, Youngjin Kwon, Tianyu Cheng, Vijay Chidambaram, and Emmett Witchel ATC 18. Bibtex
This repository includes two main components:
linux-3.18.22-mod. This contains the modified Linux kernel for TxFS.fs/user_tx.cdefines the system calls provided by TxFS;fs/memlogcontains TxFS's internal bookkeeping code;fs/*_memlog.ccontains TxFS's changes to the VFS layer;fs/ext4/*_memlog.ccontains TxFS's major changes to ext4;fs/jbd2/transaction.ccontains TxFS's changes to JBD2.mm/filemap.ccontains TxFS's changes to memory page accesses.
benchmark. Contains benchmarks used to evaluate TxFS (we have only released microbenchmarks).syscall_wrappercontains a system call wrapper providing API calls fs_tx_begin/end/abort, and an example showing how to use the wrapper;syscallcontains a set of tests on the system calls supported by TxFS transactions;multithreadcontains multi-threaded tests;stress_testrandomly executes file system operations with multiple threads.
Inside linux-3.18.22-mod, compiling the kernel follows the standard method of configure and make. To see examples of TxFS in action, check out the examples inside benchmark.
We present an example where two files file1 and file2 are modified atomically. For the sake of brevity, we do not show error cases.
ret = fs_tx_begin();
fd1 = open("file1.txt", O_RDWR | O_APPEND, 0644);
fd2 = open("file2.txt", O_RDWR | O_APPEND, 0644);
write(fd1, "foo\n", 4);
write(fd2, "bar\n", 4);
ret = ret = fs_tx_commit();
The user does not have to add any other code apart from fs_tx_begin() and fs_tx_commit(). Once fs_tx_commit returns successfully, reads of both files will include both foo and bar.
syscall_wrapper in the benchmmark directory has the more complete version of this example. You can find it here.
Please contact us at yige@cs.utexas.edu with any questions. Drop
us a note if you would like to use TxFS in your research.