Return-Path: X-Original-To: apmail-couchdb-dev-archive@www.apache.org Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id D83648A8F for ; Mon, 22 Aug 2011 14:20:54 +0000 (UTC) Received: (qmail 30969 invoked by uid 500); 22 Aug 2011 14:20:52 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 30208 invoked by uid 500); 22 Aug 2011 14:20:51 -0000 Mailing-List: contact dev-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@couchdb.apache.org Delivered-To: mailing list dev@couchdb.apache.org Received: (qmail 30193 invoked by uid 99); 22 Aug 2011 14:20:50 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 22 Aug 2011 14:20:50 +0000 X-ASF-Spam-Status: No, hits=-2000.5 required=5.0 tests=ALL_TRUSTED,RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.116] (HELO hel.zones.apache.org) (140.211.11.116) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 22 Aug 2011 14:20:49 +0000 Received: from hel.zones.apache.org (hel.zones.apache.org [140.211.11.116]) by hel.zones.apache.org (Postfix) with ESMTP id 84C90AA858 for ; Mon, 22 Aug 2011 14:20:29 +0000 (UTC) Date: Mon, 22 Aug 2011 14:20:29 +0000 (UTC) From: "Adam Kocoloski (JIRA)" To: dev@couchdb.apache.org Message-ID: <1136929143.1164.1314022829540.JavaMail.tomcat@hel.zones.apache.org> Subject: [jira] [Created] (COUCHDB-1256) Incremental requests to _changes can skip revisions MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 Incremental requests to _changes can skip revisions --------------------------------------------------- Key: COUCHDB-1256 URL: https://issues.apache.org/jira/browse/COUCHDB-1256 Project: CouchDB Issue Type: Bug Components: Replication Environment: confirmed on Apache CouchDB 1.1.0, bug appears to be present in 1.0.3 and trunk Reporter: Adam Kocoloski Assignee: Adam Kocoloski Priority: Blocker Fix For: 1.0.4, 1.1.1, 1.2 Requests to _changes with style=all_docs&since=N (requests made by the replicator) are liable to suppress revisions of a document. The following sequence of curl commands demonstrates the bug: curl -X PUT localhost:5985/revseq {"ok":true} curl -X PUT -Hcontent-type:application/json localhost:5985/revseq/foo -d '{"a":123}' {"ok":true,"id":"foo","rev":"1-0dc33db52a43872b6f3371cef7de0277"} curl -X PUT -Hcontent-type:application/json localhost:5985/revseq/bar -d '{"a":456}' {"ok":true,"id":"bar","rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a"} % stick a conflict revision in foo curl -X PUT -Hcontent-type:application/json localhost:5985/revseq/foo?new_edits=false -d '{"_rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a", "a":123}' {"ok":true,"id":"foo","rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a"} % request without since= gives the expected result curl -Hcontent-type:application/json localhost:5985/revseq/_changes?style=all_docs {"results":[ {"seq":2,"id":"bar","changes":[{"rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a"}]}, {"seq":3,"id":"foo","changes":[{"rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a"},{"rev":"1-0dc33db52a43872b6f3371cef7de0277"}]} ], "last_seq":3} % request starting from since=2 suppresses revision 1-0dc33db52a43872b6f3371cef7de0277 of foo macbook:~ (master) $ curl localhost:5985/revseq/_changes?style=all_docs\&since=2 {"results":[ {"seq":3,"id":"foo","changes":[{"rev":"1-cc609831f0ca66e8cd3d4c1e0d98108a"}]} ], "last_seq":3} I believe the fix is something like this (though we could refactor further because Style is unused): diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl index e8705be..65aeca3 100644 --- a/src/couchdb/couch_db.erl +++ b/src/couchdb/couch_db.erl @@ -1029,19 +1029,7 @@ changes_since(Db, Style, StartSeq, Fun, Acc) -> changes_since(Db, Style, StartSeq, Fun, [], Acc). changes_since(Db, Style, StartSeq, Fun, Options, Acc) -> - Wrapper = fun(DocInfo, _Offset, Acc2) -> - #doc_info{revs=Revs} = DocInfo, - DocInfo2 = - case Style of - main_only -> - DocInfo; - all_docs -> - % remove revs before the seq - DocInfo#doc_info{revs=[RevInfo || - #rev_info{seq=RevSeq}=RevInfo <- Revs, StartSeq < RevSeq]} - end, - Fun(DocInfo2, Acc2) - end, + Wrapper = fun(DocInfo, _Offset, Acc2) -> Fun(DocInfo, Acc2) end, {ok, _LastReduction, AccOut} = couch_btree:fold(by_seq_btree(Db), Wrapper, Acc, [{start_key, StartSeq + 1}] ++ Options), {ok, AccOut}. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira