couchdb-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Adam Kocoloski <>
Subject Re: [DISCUSS] Statistics maintenance in FoundationDB
Date Wed, 17 Apr 2019 21:40:13 GMT
Just a quick note to say that I started drafting an RFC on this topic (also on _all_docs, since
it was a small topic): <>

It’d be good to get any feedback (here or in the PR) on the importance of backwards compatibility
in the DB info blob. Some of the elements in there could be carried forward in the name of
compatibility (e.g. the “cluster” bits, and some of the “sizes”), but they’re not
the way I’d choose to present that information if starting from scratch.


> On Apr 9, 2019, at 1:03 PM, Adam Kocoloski <> wrote:
> Now that you mention it …
> Blind writes also do not conflict with one another, so a bunch of writers updating a
single key _without_ reading it is OK. The DB info endpoint would have to be careful to use
a snapshot read, but I was wrong in stating that just updating this single key would cause
a bunch of conflicts.
> Regardless, I agree with you that it’s still preferable to just read from the tail
of the changes space and avoid the extra write altogether.
> Adam
>> On Apr 9, 2019, at 11:14 AM, Paul Davis <> wrote:
>> I've only got two notes for color.
>> I'm pretty sure that keeping the update_seq as a key could be fine
>> since its an atomic op underneath and shouldn't conflict. However
>> given that we're looking to store an Incarnation and Batch Id with
>> every version stamp I still think it makes better sense to read from
>> the end of the changes feed as that means we're only doing the update
>> logic in a single place.
>> For the offset calculation I'll just mention that its the same
>> scenario as custom JS reduces in that we need to be able to calculate
>> some value over and arbitrary range of keys. For custom JS reduces I
>> could see having the complexity (if we go that route) however for
>> offset its not very useful. Especially given fdb transaction
>> limitations which means its not necessarily valid any time we have to
>> use multiple transactions to satisfy a read from the index.
>> On Tue, Apr 9, 2019 at 3:12 AM Robert Newson <> wrote:
>>> Hi,
>>> I agree with all of this.
>>> On "sizes", we should clean up the various places that the different sizes are
reported. I suggest we stick with just the "sizes" object, which will have two items, 'external'
which will be jiffy's estimate of the body as json plus the length of all attachments (only
if held within fdb) and 'file' which will be the sum of the lengths of the keys and values
in fdb for the Directory (excluding the sum key/value itself). (the long way of saying I agree
with what you already said).
>>> On "offset", I agree we should remove it. It's of questionable value today, so
let's call it out as an API change in the appropriate RFC section. The fdb release (ostensibly
"4.0") is an opportunity to clean up some API cruft. Given we know about this one early, we
should also remove it in 3.0.
>>> --
>>> Robert Samuel Newson
>>> On Mon, 8 Apr 2019, at 23:33, Adam Kocoloski wrote:
>>>> Hi all, a recent comment from Paul on the revision model RFC reminded
>>>> me that we should have a discussion on how we maintain aggregate
>>>> statistics about databases stored in FoundationDB. I’ll ignore the
>>>> statistics associated with secondary indexes for the moment, assuming
>>>> that the design we put in place for document data can serve as the
>>>> basis for an extension there.
>>>> The first class of statistics are the ones we report in GET /<dbname>,
>>>> which are documented here:
>>>> These fall into a few different classes:
>>>> doc_count, doc_del_count: these should be maintained using
>>>> FoundationDB’s atomic operations. The revision model RFC enumerated all
>>>> the possible update paths and showed that we always have enough
>>>> information to know whether to increment or decrement each of these
>>>> counters; i.e., we always know when we’re removing the last
>>>> deleted=false branch, adding a new branch to a previously-deleted
>>>> document, etc.
>>>> update_seq: this must _not_ be maintained as its own key; attempting to
>>>> do so would cause every write to the database to conflict with every
>>>> other write and kill throughput. Rather, we can do a limit=1 range read
>>>> on the end of the ?CHANGES space to retrieve the current sequence of
>>>> the database.
>>>> sizes.*: things get a little weird here. Historically we relied on the
>>>> relationship between and sizes.file to know when to
>>>> trigger a database compaction, but we don’t yet have a need for
>>>> compaction in the FDB-based data model and it’s not clear how we should
>>>> define these two quantities. The sizes.external field has also been a
>>>> little fuzzy. Ignoring the various definitions of “size” for the
>>>> moment, let’s agree that we’ll want to be tracking some set of byte
>>>> counts for each database. I think the way we should do this is by
>>>> extending the information stored in each edit branch in ?REVISIONS to
>>>> included the size(s) of the current revision. When we update a document
>>>> we need to compare the size(s) of the new revision with the size(s) of
>>>> the parent, and update the database level atomic counter(s)
>>>> appropriately. This requires an enhancement to RFC 001.
>>>> I’d like to further propose that we track byte counts not just at a
>>>> database level but also across the entire Directory associated with a
>>>> single CouchDB deployment, so that FoundationDB administrators managing
>>>> multiple applications for a single cluster can have a better view of
>>>> per-Directory resource utilization without walking every single
>>>> database stored inside.
>>>> Looking past the DB info endpoint, one other statistic worth discussing
>>>> is the “offset” field included with every response to an _all_docs
>>>> request. This is not something that we get for free in FoundationDB,
>>>> and I have to confess it seems to be of limited utility. We could
>>>> support this by implementing a tree structure by adding additional
>>>> aggregation keys on top of the keys stored in the _all_docs space, but
>>>> I’m skeptical that it’s worth baking this extra cost into every
>>>> database update and _all_docs operation. I’d like to hear others’
>>>> thoughts on this one.
>>>> I haven’t yet looked closely at _stats and _system to see if any of
>>>> those metrics require specific support from FDB.
>>>> Adam

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message