mergerfs status update: 2018-12-05
Added 2018-12-05 16:07:49 +0000 UTCEarlier this year I took a break from mergerfs and took over maintenance of the libretro 4DO core. I cleaned up the code, fixed misc bugs, and made a few quality of life improvements. There is still a lot that could be done to improve performance and compatibility but lack of documentation and complexity of the existing code makes that tough. So I took a break and started working on mergerfs again. As you may have noticed I released 2.25 recently. Some minor bug fixes but mostly esoteric features that I or others were interested in such as runtime xattr control, link breaking / CoW, and flexibility on how statfs reports available storage.
In some ways mergerfs feels fairly complete. At least feature wise. Then again I felt that way a year+ ago. As a result I've looked into taking advantage of newer features in the FUSE protocol such as writeback caching and copy_file_range. Since mergerfs uses libfuse2 and that's a depreciated project I could either port these to libfuse2 or look into libfuse3. I've decided to do the latter... but there are complications.
mergerfs' userbase is pretty diverse in terms of their usecases and operating system usage. The latter led me to 'vendor' libfuse2 into mergerfs' codebase. Older systems used outdated and buggy versions of libfuse2 which led to mergerfs crashing. When dealing with data you need to be careful and it just wasn't practical to have everyone upgrade their OSs or libfuse2 packages. This problem continues with libfuse3. In fact its worse. Only the most recent OSs are packaging it at all and the project itself provides no OS specific packages. Additionally, while the library itself is backwards compatible with older FUSE versions, the build system (meson + ninja) require fairly modern versions of Python 3 and I was unable to easily build it on older systems. As a result I've replaced meson + ninja with a simple makefile and a new side project (stemming from this issue) ecfd. The Embeddable C Feature Discovery project is as named. A simple set of scripts and C modules to help discover a C/C++ platform's features (function availability and sizeof(type) mostly). With this I've a version of libfuse3 which I've vendored into mergerfs which builds across multiple old and new OSs. More work needs to be done to support the libfuse3 features & API and I need to rebrand the auxiliary tooling (mount.fuse & fusermount) to be installable on a system with libfuse3 but things seem to work.
I don't know when I'll release this version. It will be released as v3.0 given the significant internal change and slight changes to the argument parsing (libfuse3 no longer gives users direct control over sensitive options).