[ 
https://issues.apache.org/jira/browse/COUCHDB-3239?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15723562#comment-15723562
 ] 

Paul Joseph Davis commented on COUCHDB-3239:
--------------------------------------------

[~wilhol] Is this something you're finding is affecting things or its just 
different than you expected? The sort that I added for the latest=true fix 
specifically makes the assertion that ordering is undefined and revisions may 
be returned in any order (but is actually somewhat stable due to the 
implementation). Theoretically there aren't any bits of code that rely on the 
ordering but its possible I missed something when I did my review for that bug.

Though as a counter case to your proposal, what would you expect the ordering 
to be if you specified [1-a], or [1-a,2-b1], or [2-b1,2-b2,3-c1]?

Also, the way that the tree merging works in the fabric coordinator, we'd 
actually have to specify the ordering based on the partial revision tree that's 
build. If we re-use the ordering defined by `couch_doc:to_doc_info/1` that 
would prefer deeper undeleted/not-missing revisions over shallower revisions. 
However, its technically any different than what we return now. Its an 
arbitrary order based on the results that were obtained given the data we had.

Also, it occurs to me that part of the issue is complexity around revision 
trees when inconsistent. For instance, you've proposed having a complete tree 
available (which happens on a single node every time), however, in a cluster 
one node may be missing the 4-d1 branch and a different node may be missing the 
3-c2 branch. When we reconstitute the partial tree in the fabric coordinator 
our sense of order would be difficult to retain. And any sufficiently specified 
ordering based on input would be complex enough in practice I'm not sure how 
much use it would have (ie, in my counter cases where multiple input revs 
result in a single returned rev).

> incorrect ordering of results when using open_revs and latest=true
> ------------------------------------------------------------------
>
>                 Key: COUCHDB-3239
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-3239
>             Project: CouchDB
>          Issue Type: Bug
>          Components: Database Core
>    Affects Versions: 2.0.0
>            Reporter: Will Holley
>         Attachments: docs.json
>
>
> When fetching open_revs with latest=true for a conflicted document, the order 
> of results is incorrect. For example, if I create a document with the rev 
> tree:
> {code}
>                       4-d1
>                       /
>               3-c1
>               /
>       2-b1
>       /
> 1-a 
>       \
>       2-b2
>               \
>               3-c2
> {code}
> and ask for {{open_revs=["2-b1","2-b2"]&latest=true}}, the response will 
> return {{3-c2}} followed by {{4-d1}} - the reverse of what I'd expect.
> Below is a test/reproduction executed against Couch 1.6.1 and 2.0.
> 1.6.1:
> {code}
> $ export COUCH_HOST="http://127.0.0.1:5984";
> $ curl -XPUT "$COUCH_HOST/open_revs_test"
> {"ok":true}
> $ curl "$COUCH_HOST/open_revs_test/_bulk_docs" -H 
> "Content-Type:application/json" -XPOST -d @docs.json
> []
> # GET open_revs=["2-b1","2-b2"]
> $ curl -H "Accept:application/json" 
> "$COUCH_HOST/open_revs_test/mydoc?open_revs=%5B%222-b1%22%2C%222-b2%22%5D"
> [{"ok":{"_id":"mydoc","_rev":"2-b1","value":"x-winning"}},{"ok":{"_id":"mydoc","_rev":"2-b2","value":"x-losing"}}]
> # GET open_revs=["2-b1","2-b2"]&latest=true
> $ curl -H "Accept:application/json" 
> "$COUCH_HOST/open_revs_test/mydoc?open_revs=%5B%222-b1%22%2C%222-b2%22%5D&latest=true"
> [{"ok":{"_id":"mydoc","_rev":"4-d1","value":"z-winning"}},{"ok":{"_id":"mydoc","_rev":"3-c2","value":"y-losing"}}]
> {code}
> 2.0:
> {code}
> $ export COUCH_HOST="http://127.0.0.1:15984";
> $ curl -XPUT "$COUCH_HOST/open_revs_test"
> {"ok":true}
> $ curl "$COUCH_HOST/open_revs_test/_bulk_docs" -H 
> "Content-Type:application/json" -XPOST -d @docs.json
> []
> # GET open_revs=["2-b1","2-b2"]
> $ curl -H "Accept:application/json" 
> "$COUCH_HOST/open_revs_test/mydoc?open_revs=%5B%222-b1%22%2C%222-b2%22%5D"
> [{"ok":{"_id":"mydoc","_rev":"2-b1","value":"x-winning"}},{"ok":{"_id":"mydoc","_rev":"2-b2","value":"x-losing"}}]
> # GET open_revs=["2-b1","2-b2"]&latest=true
> $ curl -H "Accept:application/json" 
> "$COUCH_HOST/open_revs_test/mydoc?open_revs=%5B%222-b1%22%2C%222-b2%22%5D&latest=true"
> [{"ok":{"_id":"mydoc","_rev":"3-c2","value":"y-losing"}},{"ok":{"_id":"mydoc","_rev":"4-d1","value":"z-winning"}}]
> {code}
> Note the reversed order of the results in 2.0 when {{latest=true}} is 
> specified.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to