Nice list of questions. Couple more from me:

# global vs per endpoint?

If we decide for API per endpoint we could different mechanisms to get list of 
supported versions:
- new /_api endpoint which would return list of versions for each endpoint
```
 {
            "/{db}/{docid}": ["4", "55", "95"]
 }
```
- new suffix for each endpoint /{somehing}/_schema which would return JSON 
schema or OpenAPI spec for an endpoint including all versions
```

```
- new suffix for each endpoint /{somehing}/_v which would return list of 
versions supported on this endpoint
- abuse HEAD http verb to retrieve information about supported versions
- the `/` endpoint could return a list of endpoints and versions they support 
(the vendor takes precedence )
```

{
    "couchdb": "Welcome",
    "uuid": "85fb71bf700c17267fef77535820e371",
    "vendor": {
        "name": "The Apache Software Foundation",
        "APIs": {
            "/{db}/{docid}": ["4", "55", "95"]
        }, 
        "version": "1.3.1"
    },
    "APIs": {
        "/{db}/{docid}": ["3", "4", "55"]
    }, 
    "version": "1.3.1"
}
```
- Use dedicated HTTP header and set it in each response X-CouchDB-API: 1, 2, 3, 
99

# return warnings

- there is an expired IETF draft  
https://tools.ietf.org/id/draft-cedik-http-warning-02.html which proposes a 
convention how to inject warnings into JSON response
- there is a standard Warning header 
https://tools.ietf.org/html/rfc7234#section-5.5.7
  - Warning: 299 api.couchdb.db.doc "Deprecated API: Use v4 instead."
  - vendors could extend it to look like:
    - Warning: 299 api.couchdb.db.doc "Deprecated API: Use v4 instead.  Old v3 
API maintained until 2015-06-02"
- some http frameworks use Deprecation ( expired 
https://tools.ietf.org/id/draft-dalal-deprecation-header-01.html) and Sunset 
headers https://tools.ietf.org/html/rfc8594

Best regards,
iilyak

On 2021/03/30 22:52:49, San Sato <sans...@inator.biz> wrote: 
> Proposed.  Mix and match:
> 
>    - Any expected behaviors dropped or changed from pre-existing API
>    versions are available only when API v4 is specified.
>    - Any existing behaviors, unchanged in couchdb 4, work the same whether
>    API v4 is specified, or not
>    - Any new endpoints created in couchdb 4 are available only when API v4
>    is specified (=404)
>    - - OR -, they respond with an error indicating that v4 is required
>       (422?)
>       - #include ways-of-indicating-v4
>    - start emitting deprecation warnings in v3 api requests
>       - e.g. response header: couchdb-warning: start_key is deprecated; use
>       startkey instead
>       - ...etc...
>       - drop v4 support for deprecations (422 error: use of deprecated
>    start_key)
>    - ? include errors @v3 requests for detected request parameters that are
>    clearly v4-targeted (422: feature newAndShiny requires that you
>    <indicate-v4-api>)
>    - ? be conservative: include v3 deprecation-related behaviors only when
>    request-header x-i-want-couchdb-v4: help me
>    - other things we want to deprecate @v3  =not support in v4, while the
>    window is (?) still open for that
>    - plus or minus bike-shedding on header names, message content, 422 vs
>    400 etc.
>    - Something else?
> 
> Anything about the proposed Replicator changes that would conflict with
> this?  I guess the replicator, making a request to a remote server whose
> protocol support is uncertain, would need to start by making a request
> guaranteed to fail on pre-4.0 server - e.g. with /_v4/ url prefix, and from
> there, branch to the appropriate behavior for the remote server's
> capabilities.
> 
> San
> 
> 
> On Tue, Mar 30, 2021 at 2:25 PM Adam Kocoloski <kocol...@apache.org> wrote:
> 
> > Thanks for bubbling this thread back up to the top Donat.
> >
> > I think a “cleaner slate” v4 API has a lot going for it, but if we go that
> > route without also supporting the v3 API at the same time we’ll be sunk.
> > Python succeeded in spite of the 2->3 transition, but it was a long and
> > painful road as Joan points out. I’d rather get people on the new version
> > and have them adopt new APIs over time there, rather than make all of that
> > work a gate on adopting 4.0.
> >
> > >>>> If we do want to go with API versioning, can someone help me with a
> > worked example that shows how and when an endpoint gets a new `v_`, how
> > that affects other endpoints, which versions of CouchDB need updating for
> > such a change and when do we get to drop previous versions of the API?
> >
> > That seems like a good set of questions to work through. I wouldn’t think
> > this requires any changes to 3.x and would be something we could introduce
> > going forward in 4.0. As to whether we support N-1, N-2, … versions of the
> > API, I don’t have a strong opinion at the moment. 5.0 is a long ways off :)
> >
> > Cheers, Adam
> >
> > > On Mar 30, 2021, at 4:27 PM, Joan Touzet <woh...@apache.org> wrote:
> > >
> > >
> > >
> > > On 2021-03-30 2:35 p.m., Bessenyei Balázs Donát wrote:
> > >>> It'd be like a Python 2 -> 3 transition
> > >>
> > >> I think the simile is spot on.
> > >> But that shouldn't be a problem, it's more like evolution.
> > >>
> > >>> your user base plummet
> > >>
> > >> Looking at [1] and for lack of a better idea for reference [2], the
> > >> user base issues are not obvious to me.
> > >
> > > It also took them 12 years to get back to that point. Python 3.0 came
> > > out in December 2008. It took until Python 3.5-3.6 or so (3.6 was
> > > released in 2016) before people really started taking Python 3 seriously
> > > for production at scale, I believe. The rest of the people were forced
> > > off of it with the end of support for 2.7 at the beginning of last year.
> > >
> > > If he's back from break, Paul Davis can tell you about all the horrors
> > > of the transition. It was not pretty.
> > >
> > >> Having said that, I'm okay with dropping the idea, I just want to make
> > >> sure it's also considered.
> > >
> > > Not railing against it, just saying, if you expect to succeed, you will
> > > need to do a *LOT* more community work than throwing a release over the
> > > wall and calling it done. It would be wise to at least look into why
> > > Python had such a hard time, and start making concrete plans (and
> > > dedication of people) to avoid a similar trajectory.
> > >
> > > -Joan
> > >
> > >>
> > >> [1]: https://www.jetbrains.com/lp/python-developers-survey-2020/
> > >> [2]: https://www.tiobe.com/tiobe-index//
> > >>
> > >> On Tue, Mar 30, 2021 at 7:20 PM Joan Touzet <woh...@apache.org> wrote:
> > >>>
> > >>>
> > >>>
> > >>> On 30/03/2021 12:57, Bessenyei Balázs Donát wrote:
> > >>>> If we are bumping major anyways, can we just go "clean slate" and
> > >>>> promise replication compatibility only?
> > >>>
> > >>> Basically: watch your user base plummet. It'd be like a Python 2 -> 3
> > >>> transition, or a Perl 5 -> 6 one. It would take years of concerted
> > >>> effort to recover.
> > >>>
> > >>> This is why I'd thought pushing that off to 5.0, with 4.0 being the
> > >>> transitional release, would be best. But I have no strong opinion.
> > >>>
> > >>>> All that while we'd publish a migration guide that explains the
> > >>>> differences and helps users adjust their implementations, but this way
> > >>>> we'd get rid of some potential complexity.
> > >>>>
> > >>>> If we do want to go with API versioning, can someone help me with a
> > >>>> worked example that shows how and when an endpoint gets a new `v_`,
> > >>>> how that affects other endpoints, which versions of CouchDB need
> > >>>> updating for such a change and when do we get to drop previous
> > >>>> versions of the API?
> > >>>
> > >>> I'd like to see this too.
> > >>>
> > >>>> Thank you,
> > >>>> Donat
> > >>>>
> > >>>> On Mon, Mar 29, 2021 at 6:28 PM Joan Touzet <woh...@apache.org>
> > wrote:
> > >>>>>
> > >>>>> On 22/02/2021 20:48, Adam Kocoloski wrote:
> > >>>>>> Hi all,
> > >>>>>>
> > >>>>>> Several times in recent months we’ve had discussions on this list
> > about behavior changes in CouchDB 4.0 that boil down to tradeoffs between
> > >>>>>>
> > >>>>>> a) maintaining compatibility with current CouchDB APIs, and
> > >>>>>> b) capitalizing on the transactional semantics of FoundationDB
> > >>>>>>
> > >>>>>> An example would be the support for large result sets in a view
> > response: do we stitch together multiple transactions to support very large
> > responses, or provide new pagination APIs and guarantee that each response
> > is generated from a single isolated snapshot?
> > >>>>>>
> > >>>>>> I’d like to suggest that we “have our cake and eat it, too” by
> > introducing versioned APIs as previously suggested by Ilya[1]. We’d have a
> > V3 API that strives to maximize compatibility with CouchDB 3.x, and a V4
> > API that still looks and feels like CouchDB, but introduces breaking
> > changes where necessary to provide well-defined transactional semantics. I
> > think this explicit approach to API evolution could make life easier for
> > client library maintainers, and also free us up to improve the API without
> > needing to be quite as careful about in-place backwards compatibility.
> > >>>>>>
> > >>>>>> [1]:
> > https://lists.apache.org/thread.html/rcc742c0fdca0363bb338b54526045720868597ea35ee6842aef174e0%40%3Cdev.couchdb.apache.org%3E
> > >>>>>>
> > >>>>>> What do you think? Cheers, Adam
> > >>>>>
> > >>>>> In general, +1, as long as the concerns raised by Bob are addressed.
> > >>>>> Namely: if I point a CouchDB 1.x-3.x client at a future CouchDB 4.0,
> > I
> > >>>>> shouldn't be *too* surprised, and as much as possible should "just
> > work."
> > >>>>>
> > >>>>> I've long believed that 4.0 would be a transitional version, and 5.0
> > >>>>> would break things completely... so if 5.0 (or whatever) stops
> > accepting
> > >>>>> "v3" syntax, or "default" changes to "v4", fine by me.
> > >>>>>
> > >>>>> Also it'd be great if this was advertised in the feature strings
> > shown
> > >>>>> in `GET /` in some intelligent way. Maybe an array of API versions
> > >>>>> supported?
> > >>>>>
> > >>>>> -Joan
> >
> >
> 

Reply via email to