Funny you should mention it.  I drafted an email in early February to queue up 
the same discussion whenever I could get involved again (which I promptly 
forgot about).  What happens currently in 2.0 appears unchanged from earlier 
versions.  When R is not satisfied in fabric, fabric_doc_open:handle_message 
eventually responds with a {stop, …}  but leaves the acc-state as the original 
r_not_met which triggers a read_repair from the response handler.  read_repair 
results in an {ok, …} with the only doc available, because no other docs are in 
the list.  The final doc returned to chttpd_db:couch_doc_open and thusly to 
chttpd_db:db_doc_req is simply {ok, Doc}, which has now lost the fact that the 
answer was not complete.

This seems straightforward to fix by a change in 
fabric_open_doc:handle_response and read_repair.  handle_response knows whether 
it has R met and could pass that forward, or allow read-repair to pass it 
forward if read_repair is able to satisfy acc.r.  I can’t speak for community 
interest in the behavior of sending a 202, but it’s something I’d definitely 
like for the same reasons you cite.  Plus it just seems disconnected to do it 
on writes but not reads.

Cheers,
</JamesM>

On Mar 24, 2015, at 14:06, Nathan Vander Wilt <[email protected]> wrote:

> Sorry, I have not been following CouchDB 2.0 roadmap but I was extending my 
> fermata-couchdb plugin today and realized that perhaps the Apache release of 
> BigCouch as CouchDB 2.0 might provide an opportunity to fix a serious issue I 
> had using Cloudant's implementation.
> 
> See https://github.com/cloudant/bigcouch/issues/55#issuecomment-30186518 for 
> some additional background/explanation, but my understanding is that Cloudant 
> for all practical purposes ignores the read durability parameter. So you can 
> write with ?w=N to attempt some level of quorum, and get a 202 back if that 
> quorum is unment. _However_ when you ?r=N it really doesn't matter if only <N 
> nodes are available…if even just a single available node has some version of 
> the requested document you will get a successful response (!).
> 
> So in practice, there's no way to actually use the quasi-Dynamo features to 
> dynamically _choose_ between consistency or availability — when it comes time 
> to read back a consistent result, BigCouch instead just always gives you 
> availability* regardless of what a given request actually needs. (In my usage 
> I ended up treating a 202 write as a 500, rather than proceeding with no way 
> of ever knowing whether a write did NOT ACTUALLY conflict or just hadn't YET 
> because $who_knows_how_many nodes were still down…)
> 
> IIRC, this was both confirmed and acknowledged as a serious bug by a Cloudant 
> engineer (or support personnel at least) but could not be quickly fixed as it 
> could introduce backwards-compatibility concerns. So…
> 
> Is CouchDB 2.0 already breaking backwards compatibility with BigCouch? If 
> true, could this read durability issue now be fixed during the merge?
> 
> thanks,
> -natevw
> 
> 
> 
> 
> 
> * DISCLAIMER: this statement has not been endorsed by actual uptime of *any* 
> Couch fork…

Reply via email to