I have been pretty busy this week. Lots of experiments, and read tons of code in the libfuse project.
I rewamped the code structure of the whole project, everything is turned into modules, and compiling different modules together gives you a completely different filesystem. Currently though there is only a proxyfs file system, but most of the code is pretty generic now and could be resued for further fs experiements (compiling different types of caching fs sharing a lot of commong code). Initial testing has also been added, not a lot for now but will try to keep up some high level tests to make sure there arent high level bugs.
I started to work on the low level proxy fs. Most of the work is done in terms of mapping inodes to paths. The current implementation is inspired from the libfuse implementation, where they use 2 concurrent hash tables to map names to fs nodes, and inodes to fs nodes simultanously, pretty neat implementationa I adopted a similar approach. The code currently isnt multithreaded yet but there is no global state and everything operates on a handle so adding that should be easy.
Some optimisations have also been added, for which I had to look into the sources of libfuse sources to see how they work, the high level proxy fs now transfers data with zero copies, the fuse guys have a pretty neat buffer abstraction which makes it super easy. But most of my time had actually gone on the low level fuse implementation of proxyfs. It took me longer than expected as it turned out to be a lot of work. Mapping inodes to fs paths turned out to be a pretty comlicated problem especially when multithreaded is in place, but most of the work is done and an implementation should be out in a couple of days.
I planned on adding benchmarks after finishing low level fuse proxyfs implementation, but its still pending and bencharks would soon come after that.
Again, the github project is always up to date, I push in frequently around 3 times everyday, so feel free to follow progress on https://github.com/ziahamza/fucache