Brian writes:

On Fri, Feb 19, 2010 at 02:29:50PM +1100, Mark Hammond wrote:
I guess is might be possible for a document to be deleted between
the view row being processed and the doc being opened for the view
result but I don't think this is happening here - the view also
emits the document _rev

I didn't think the view Btree index included the _rev. If it did it would
allow really neat things like proper view etags, as well as preventing the
race condition you describe.

However if it did, I would also expect the rev to be in the raw view rows,
i.e.

     {"id":"xxx","rev":"yyy","key":"aaa","value":"bbb","doc":{...}}
                 ^^^^^^^^^^^

Do you mean that you have emit(..., {_rev: doc._rev}) in your view?

Correct.

I tracked the code returning null to couch_httpd_view:doc_member - it does:

     case (catch couch_httpd_db:couch_doc_open(Db, DocId, Rev, [])) of

There is a LOG_DEBUG just above that. What does it show? In particular, is
Rev nil? In that case you'll just get "current" version. Or is it getting
the rev of a deleted doc?

I came to the conclusion couch had a null rev, so is attempting to get the latest. I haven't seen this happen with debug logs - it happens fairly rarely. I did add another log for that error case and saw couch is reporting the error as not_found.

Adam writes:

Mark, is it fully reproducible?  You can always read the document directly, but 
never through include_docs=true?

It isn't "fully" reproducible as such, but a test suite I have will strike this on one particular test rougly 5-10% of the times it is run.

I'll try logging what _rev couch is attempting to use...

Cheers,

Mark

Reply via email to