Edit: Support for concurrent mounts seems to be the main difference https://bitbucket.org/nikratio/s3ql/wiki/FAQ#!can-i-access-a...
Edit: Support for concurrent mounts seems to be the main difference https://bitbucket.org/nikratio/s3ql/wiki/FAQ#!can-i-access-a...
One drawback to this design would be that many small files in the filesystem would translate to many small objects in S3 (with associated operations). One solution would be to put small objects right into the metadata log. Alternately they (or maybe all objects) could be put into a log-structured merge tree.
Another problem with this design is that S3 doesn't support append operations so sync latency would be bounded by client log flush intervals, again creating lots of small objects. Maybe the coordination service routes some of the data to manage this?
Anyway, really interesting design problem. Is this close?
We do write bundling before sending data to S3 so lots of small files would be packed together and stored in a single S3 object. This also helps reduce the number of object store operations.
You are absolutely right that frequent sync will necessarily create many small objects, which is why small objects will be combined into bigger ones (this compaction is done in the background). Sync latency is of course bounded by the S3 PUT time, since fsync(2) can only return after your data has been safely stored in S3.
It is a really interesting design problem. Thanks for sharing your ideas.