> On 7. Oct 2019, at 11:34, Mike Rhodes <couc...@dx13.co.uk> wrote:
>
> All,
>
> I think my email wasn't my clearest missive ever, so likely pretty easy to
> get lost in it :)
>
> I think my idea to include the read version in the document rev ID is likely
> a bad one. But, if we are already including it in the database seq value, and
> we've done the work to make that number transfer cleanly across FDB
> instances, there's probably some interesting API directions post 4.0 where we
> make more use of that value towards more efficient RYW at a database level.
>
> I'm beginning to get the feeling of what this API might look like and avoid
> being painful/confusing. For example, given the more advanced nature of these
> APIs, I'd see them operating at the HTTP header level, where we can provide
> request and response headers with the same name to support sending/receiving
> database seq values across ~all read/write requests.
>
> Taking Joan and Adam's points on board, my view is that we semi-shelve this
> discussion to enable focus on getting 4.0 out the door. But, I think we can
> start to introduce useful functionality based on this during the 4.x series
> if we're careful (i.e., avoiding breaking changes). Of course, we should
> probably step back to user pain points first as Joan implies, otherwise we're
> building for the sake of building and the opportunity cost is not negligible.
>
> I think we might also want to hash out the "interchangable backend" question
> a bit more. As Adam says, FDB gives us a number of features that would be
> hard to replicate on different backends -- at least in the clustered case --
> so nailing down a position there sounds important.
I think for now there is only need for one other backend and it is for
lower-resource systems, and I’d be fine with requiring them to be not clustered.
I’m thinking of RasPI and Desktop Software scenarios.
Best
Jan
—
>
> --
> Mike.
>
> On Mon, 30 Sep 2019, at 18:12, Adam Kocoloski wrote:
>> Hi Joan,
>>
>> Allowing clients to choose the DB sequence at which a read is performed
>> won’t have any effect on replication.
>>
>> If we end up enhancing _bulk_docs so that it can use a single
>> transaction for all the documents in the batch then that’s where the
>> replicator might need to get smarter, e.g. by inferring that a range of
>> the _changes feed corresponds to a single transaction (based on
>> knowledge of the Sequence encoding) and ensuring that the transaction
>> is also written to the target atomically.
>>
>> I hadn’t gotten as far as thinking about release numbers here, just
>> thinking about what’s possible. You’re right about the positioning of
>> 4.0, although that was largely an attempt to head off anyone thinking
>> about a wholesale replacement of the current API as part of the
>> FoundationDB work rather than a “no new features” ban. Cheers,
>>
>> Adam
>>
>>> On Sep 27, 2019, at 8:16 AM, Joan Touzet <woh...@apache.org> wrote:
>>>
>>>
>>>
>>> On 2019-09-26 17:04, Adam Kocoloski wrote:
>>>>
>>>>> On Sep 26, 2019, at 1:38 PM, Joan Touzet <woh...@apache.org> wrote:
>>>>>
>>>>> On 2019-09-26 13:14, Adam Kocoloski wrote:
>>>>>> Hi Joan, no need for apologies! Snipping out a few bits:
>>>>>>
>>>>>>> One alternative is to always keep just one around, and constantly update
>>>>>>> it every 5s, whether it's used or not (idle server).
>>>>>>
>>>>>> Agreed, I see no reason to keep multiple old read versions around on a
>>>>>> given CouchDB node. Updating it every second or two could be a nice
>>>>>> thing to do (I wouldn’t wait 5 seconds because handing out a read
>>>>>> version 4.95 seconds old isn’t very useful to anyone ;).
>>>>>>
>>>>>>> This second option seems better, but as mentioned later we don't want it
>>>>>>> to be a transparent FDB token (or convertible into one). This parallels
>>>>>>> the nonce approach we use in _changes feeds to ensure a stable feed,
>>>>>>> yeah?
>>>>>>
>>>>>> In our current design we _do_ expose FDB versions pretty directly as
>>>>>> database update sequences (there’s a small prefix to allow for _changes
>>>>>> to stay monotonically increasing when relocating a database to a new FDB
>>>>>> cluster). I believe it’s worth us thinking about expanding the use of
>>>>>> sequences to other places in the API as those are a concept that’s
>>>>>> already pretty familiar to our users
>>>>>
>>>>> Did users ever craft their own 2.x db update sequence tokens to abuse
>>>>> the system? Probably not, because our clustering code was hard to
>>>>> understand. Did users ever craft their own 1.x db update sequence
>>>>> values? Yes, and it caused lots of problems.
>>>>
>>>> I don't remember the problems that this caused in 1.x, but I can certainly
>>>> imagine a too-clever user generating a sequence that doesn’t correspond to
>>>> any consistent FDB version and supplying it. FoundationDB allows for this
>>>> sort of thing with the ominous caveat: "The database cannot guarantee
>>>> causal consistency if this method is used (the transaction’s reads will be
>>>> causally consistent only if the provided read version has that property).”
>>>> So … yeah.
>>>
>>> Eek. I don't like introducing new sharp edges.
>>>
>>>>
>>>>> Does this prevent implementing the CouchDB API on any other backend? In
>>>>> which case, I'd be -1.... In other words, at the very least we need to
>>>>> reinforce that the token is opaque and that manipulating it can produce
>>>>> both undefined errors as well as potentially lead to (perceived?) data
>>>>> loss.
>>>>
>>>> I mean, we’re already down the path where we are using various specific
>>>> features of FoundationDB (versionstamps, atomic operations, and of course
>>>> transactions) that would not necessarily be in an arbitrary key-value
>>>> store. I suppose adding this enhancement would add to the list of
>>>> requirements on an underlying storage engine, but if a storage engine
>>>> couldn’t support transactions with snapshot isolation I’m not sure it’d be
>>>> a good choice for us anyway. Even something as basic as atomic maintenance
>>>> of the _all_docs and _changes indexes becomes a heroic effort without that.
>>>
>>> Two questions:
>>>
>>> I thought 4.0 was supposed to be "no new functionality, just 2.x/3.x
>>> semantics on top of FDB?" Is this something you're looking at for a
>>> later release?
>>>
>>> And how do you foresee e.g. PouchDB keeping up if they're not going to
>>> put FDB on a mobile device - will we necessarily be implementing API
>>> endpoints that demand an FDB backend that can't ever exist on a
>>> different implementation? How will this affect replication, for
>>> instance, if at all?
>>>
>>>>> If we eschew API changes for 4.0 then we need to decide on the default.
>>>>> And if
>>>>>>> we're voting, I'd say making RYWs the default (never hanging onto a
>>>>>>> handle) and then (ab-)using stale=ok or whatever state we have lying
>>>>>>> around might be sufficient.
>>>>>>
>>>>>> I definitely agree. We should not be using old read versions without the
>>>>>> client’s knowledge unless it's for some internal process where we know
>>>>>> all the tradeoffs.
>>>>>>
>>>>>>> This is the really important data point here for me. While Cloudant
>>>>>>> cares about 2-3 extra ms on the server side, many many MANY CouchDB
>>>>>>> users don't. Can we benchmark what this looks like when running
>>>>>>> FDB+CouchDB on a teeny platform like a RasPi? Is it still 2-3ms? What
>>>>>>> about the average laptop/desktop? Or is it only 2-3ms on a beefy
>>>>>>> Cloudant-sized server?
>>>>>>
>>>>>> I don’t have hard performance numbers, but I expect that acquiring a
>>>>>> read version in a small-scale deployment is faster than the same
>>>>>> operation against a big FoundationDB deployment spanning zones in a
>>>>>> cloud region. When you scale down e.g. to a single FDB process that
>>>>>> process ends up playing all the roles that need to collaborate to decide
>>>>>> on a read version and so the network latency gets taken out of the
>>>>>> picture.
>>>>>
>>>>> Then I'm concerned this is premature optimization.
>>>>
>>>> A fair concern. What I really like about this is that the way to more
>>>> efficient operations is exposing richer transactional semantics to users.
>>>> How often do you get a deal like that!
>>>
>>> Neat...but I'm always nervous when people spin new technology as a
>>> win-win, there's always a tradeoff, so I reserve the right to be
>>> skeptical until proven otherwise ;)
>>>
>>>>
>>>> Cheers, Adam
>>>>
>>>
>>> -Joan
>>
>>
--
Professional Support for Apache CouchDB:
https://neighbourhood.ie/couchdb-support/