I'm not sure which parts of that you are referring to as unavoidable since C can do modules just fine without any mess.
Define the functions you want to implement as static functions and add something like this at the bottom of the file:
Then either stick `omstdout` in a list of modules known at compile-time or compile separately and use dlopen/dlsym to get the one necessary symbol.
No GNUisms, no language extensions, no linker tricks, no macro magic.
C has problems but it's not that hard to create readable code in it.
HDFS is designed mostly for immutable files, stores three copies of everything in the default setup and has the whole hadoop calculation stuff.
BeeGFS is closer to a normal NFS share. In the default setup it just stores the data once, striped over multiple machines and it supports efficient updates in-place etc.
MooseFS and BeeGFS don't really seem to be in the same category of filesystem though.
BeeGFS comes from the HPC world where it is all about performance, while MooseFS seems more focused on high reliability even in the face of entire machines coming and going.
BeeGFS stores files striped over multiple machines and can use infiniband natively which gives us a system where bandwidth to individual files can reach a bit over 1GB/s (best case) and aggregated bandwidth can reach 30GB/s from a very mixed and unoptimized bioinformatics workload, a lot more when just testing the raw bandwidth.
Since BeeGFS uses an underlying filesystem on each storage target you can of course run raid, zfs or whatever it takes to make you comfortable that the individual storage targets aren't going to be lost - which is what it takes for data to be unavailable.
If you want some extra reliability in BeeGFS it also supports mirroring so you only lose data if you fully lose two storage targets. We can't really afford to run with full mirroring for our 3PB though.
We are very happy with it for our HPC environment but I'm not sure how well it works in an AWS setup.
Then either stick `omstdout` in a list of modules known at compile-time or compile separately and use dlopen/dlsym to get the one necessary symbol. No GNUisms, no language extensions, no linker tricks, no macro magic.
C has problems but it's not that hard to create readable code in it.