On Thu, Mar 28, 2019 at 10:58 AM Adam Kocoloski <kocol...@apache.org> wrote: > > Hi Paul, good stuff. > > I agree with you about the FDB Subspaces feature. I’ve been thinking that our > layer code should maintain its own enumeration of the various “subspaces” to > single-byte prefixes within the directory. I haven’t yet captured that in the > RFCs, but e.g. we should be using ?REVISIONS instead of <<“revisions”>> as > the prefix for the KVs representing the revision tree. >
I agree with you so hard that I already did exactly that: https://github.com/apache/couchdb/blob/prototype/fdb-layer/src/fabric/src/fabric2_fdb.erl#L67-L77 > I also agree with the use of a top-level Directory to enable multiple > applications to use the same FoundationDB cluster. > > Adam > > > On Mar 27, 2019, at 1:46 PM, Nick Vatamaniuc <vatam...@gmail.com> wrote: > > > > Looking over the code, it seems very simple and clean. Without knowing much > > of the internals or following the discussion too closely I think I was able > > to read and understand most of it. > > > > I like split between db and fdb layers. Hopefully it means if we start from > > this we can do some parallel work implementing on top of db layer and below > > it at the same time. > > > > The use of maps is nice and seems to simply things quite a bit. > > > > Don't have much to add about metadata and other issues, will let others who > > know more chime in. It seems a bit similar to how we had the > > instance_start_time at one point or how we add the suffix to db shards. > > > > Great work! > > -Nick > > > > On Wed, Mar 27, 2019 at 12:53 PM Paul Davis <paul.joseph.da...@gmail.com> > > wrote: > > > >> Hey everyone! > >> > >> I've gotten enough of a FoundationDB layer prototype implemented [1] > >> to start sharing publicly. This is emphatically no where near useful > >> to non-CouchDB-developers. The motivation for this work was to try and > >> get enough of a basic prototype written so that we can all start > >> fleshing out the various RFCs with actual implementations to compare > >> and contrast and so on. > >> > >> To be clear, I've made a lot of intentionally "bad" choices while > >> writing this to both limit the scope of what I was trying to > >> accomplish and also to make super clear that I don't expect any of > >> this code to be "final" in any way whatsoever. This work is purely so > >> that everyone has an initial code base that can be "turned on" so to > >> speak. To that end, here's a non-exhaustive list of some of the > >> silliness I've done: > >> > >> 1. All document bodies must fit inside a single value > >> 2. All requests must fit within the single fdb transaction limits > >> 3. I'm using binary_to_term for things like the revision tree > >> 4. The revision tree has to fit in a single value > >> 5. There's basically 0 supported query string parameters at this point > >> 6. Nothing outside super basic db/doc ops is implemented (i.e., no views) > >> > >> However, what it does do is start! And it talks to FoundationDB! So at > >> least that bit seems to be reliable (only tested on OS X via > >> FoundationDB binary installers so super duper caveat on that > >> "reliable"). > >> > >> There's a small test script [2] that shows what it's currently capable > >> of. A quick glance at that should give a pretty good idea of how > >> little is actually implemented in this prototype. There's also a list > >> of notes I've been keeping as I've been hacking on this that also > >> tries to gather a bunch of questions that'll need to be answered [3] > >> as we continue to work on this. > >> > >> To that end, I have learned a couple lessons from working with > >> FoundationDB from this work that I'd like to share. First is that > >> while we can cache a bunch of stuff, we have to be able to ensure that > >> the cache is invalidated properly when various bits of metadata > >> change. There's a feature on FoundationDB master [1] for this specific > >> issue. I've faked the same behavior using an arbitrary key but the > >> `fabric2_fdb:is_current/1` function I think is a good implementation > >> of this done correctly. > >> > >> Secondly, I spent a lot of time trying to figure out how to use > >> FoundationDB's Directory and Subspace layers inside the CouchDB layer. > >> After barking up that tree for a long time I've basically decided that > >> the best answer is probably "don't". I do open a single directory at > >> the root, but that's merely in order to play nice with any other > >> layers that use the directory layer. Inside the "CouchDB directory" > >> its all strictly Tuple Layer direct code. > >> > >> The Subspace Layer seems to be basically useless in Erlang. First, its > >> a very thin wrapper over the Tuple Layer that basically just holds > >> onto a prefix that's prepended onto the tuple layer operations. In > >> other languages the Subspace Layer has a lot of syntactical sugar that > >> makes them useful. Erlang doesn't support any of that so it ends up > >> being more of a burden to use that rather than just using the Tuple > >> Layer directly. Dropping the use of directories and subspaces has > >> greatly simplified the implementation thus far. > >> > >> In terms of code layout, nearly all of the new implementation is in > >> `src/fabric/src/fabric2*` modules. There's also a few changes to > >> chttpd obviously to call the new code as well as commenting out parts > >> of features so I didn't have to follow all the various call stacks > >> updating huge swathes of semi-unrelated code. > >> > >> I'd be super interested to hear feed back and see people start running > >> with this in whatever direction catches their fancy. Hopefully this > >> proves useful for people to start writing implementations of the > >> various RFCs so we can make progress on those fronts. > >> > >> [1] https://github.com/apache/couchdb/compare/prototype/fdb-layer > >> [2] https://github.com/apache/couchdb/blob/prototype/fdb-layer/fdb-test.py > >> [3] > >> https://github.com/apache/couchdb/blob/prototype/fdb-layer/FDB_NOTES.md > >> [4] > >> https://forums.foundationdb.org/t/a-new-tool-for-managing-layer-metadata/1191 > >> >