> On 16. May 2019, at 23:03, Robert Samuel Newson <rnew...@apache.org> wrote:
> 
> I suggest an alternative; the new design document could include the _id of 
> design document it’s replacing (“_replaces”:”_design/foo”). On completion of 
> the view build of the new design document, CouchDB itself updates the named 
> _id to the same content as the new design document (strictly, only the parts 
> needed to make the view sig match) (perhaps it also deletes the new document).
> 
> The advantage to this is that queries to the original design document 
> continue to work throughout and at no point is there a discrepancy between 
> the design documents contents (the map and reduce functions, etc) and the 
> results you get from it.


As Stefan points out, this only works if the consuming code knows how to handle 
both index result formats. If not, we need a way for either CouchDB to signal 
the build being ready or a way to confirm the swap to coincide with a code 
deploy.


> 
> B.
> 
>> On 16 May 2019, at 14:55, Jan Lehnardt <j...@apache.org> wrote:
>> 
>> +1 on solving this for all users, and same caveats as Stefan raises :)
>> 
>>> On 16. May 2019, at 09:38, Stefan du Fresne <ste...@medicmobile.org> wrote:
>>> 
>>> Hey Garren,
>>> 
>>> Having this a native part of CouchDB seems like a really cool idea: we have 
>>> automated the manual dance you're talking about with our deployment 
>>> tooling, but it would be really nice not to have to!
>>> 
>>> I'm not clear how it would work though, at least in terms of coherent 
>>> deployments. View changes are, like SQL migrations, an often non-backwards 
>>> compatible change that has to occur as your new code deploys.
>>> 
>>> Currently the naive approach is you deploy your new code alongside design 
>>> doc changes, which then block view queries on first request until they're 
>>> ready to go.
>>> 
>>> The better approach is what you describe, which is what we do now, where we 
>>> extract our design documents out of our deployment bundle and place them in 
>>> a "staging" location to allow them to warm, then rename them and do the 
>>> actual code deployment once that's complete (managed by an external 
>>> deployment service we built). This importantly lets us split the "warming" 
>>> bit from the deployment bit: we only deploy new code once the design 
>>> documents that are shipped with that code is ready to go.
>>> 
>>> How would you foresee this kind of flow happening here? Would there be a 
>>> way to query the design doc to know if it had flipped to the new version 
>>> yet? Would you be able to control when this flip occurs? Or would the 
>>> expectation be that your code handles both versions gracefully?
>>> 
>>> As an example to mull over, let's say you have design doc v1, which has 
>>> view a. You push design doc v2, which has added view b, but has also 
>>> changed view a in some backwards incompatible way. While v2 is still 
>>> building and is not yet the active doc:
>>> - If you queried view a you'd get the v1 version, that's clear
>>> - If you queried view b you'd get... a 404? Some other custom code?
>>> - If you GET the design document what doc would you see? Presumably v2?
>>> - Could you query something to determine which version is currently active? 
>>> Or perhaps just whether there is a background version building at all?
>>> 
>>> Cheers,
>>> Stefan
>>> 
>>>> On 16 May 2019, at 07:51, Garren Smith <gar...@apache.org> wrote:
>>>> 
>>>> Hi Everyone,
>>>> 
>>>> A common pattern we see for updating large indexes that can take a few days
>>>> to build, is create a new design docs with the new updated views. Then once
>>>> the new design doc is built, a user changes the new design doc’s id to the
>>>> old design doc. That way the CouchDB url for the views remain the same and
>>>> any requests to the design doc url automatically get the latest views only
>>>> once they built.
>>>> 
>>>> This is an effective way of managing building large indexes, but the
>>>> process is quite complicated and often users get it wrong. I would like to
>>>> propose that we move this process into CouchDB and let CouchDB handle the
>>>> actual process. From a users perspective, they would add a field to the
>>>> options of a design document that lets CouchDB know, that this build needs
>>>> to be built in the background and only replace the current index once its
>>>> built:
>>>> 
>>>> ```
>>>> {
>>>> "_id": "_design/design-doc-id",
>>>> "_rev": "2-8d361a23b4cb8e213f0868ea3d2742c2",
>>>> "views": {
>>>> "map-view": {
>>>>   "map": "function (doc) {\n  emit(doc._id, 1);\n}"
>>>> }
>>>> },
>>>> "language": "javascript",
>>>> "options": {
>>>>     "build_and_replace": true
>>>> }
>>>> }
>>>> ```
>>>> 
>>>> I think this is something we could build quite effectively once we have
>>>> CouchDB running on top of FoundationDB. I don’t want to implement it for
>>>> version 1 of CouchDB on FDB, but it would be nice to keep this in mind as
>>>> we build out the map/reduce indexes.
>>>> 
>>>> What do you think? Any issues we might have by doing this internally?
>>>> 
>>>> Cheers
>>>> Garren
>>> 
>> 
>> -- 
>> Professional Support for Apache CouchDB:
>> https://neighbourhood.ie/couchdb-support/
>> 
> 

-- 
Professional Support for Apache CouchDB:
https://neighbourhood.ie/couchdb-support/

Reply via email to