Return-Path: Delivered-To: apmail-couchdb-dev-archive@www.apache.org Received: (qmail 4920 invoked from network); 6 Apr 2009 16:21:50 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 6 Apr 2009 16:21:50 -0000 Received: (qmail 71578 invoked by uid 500); 6 Apr 2009 16:21:49 -0000 Delivered-To: apmail-couchdb-dev-archive@couchdb.apache.org Received: (qmail 71520 invoked by uid 500); 6 Apr 2009 16:21:49 -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 71510 invoked by uid 99); 6 Apr 2009 16:21:49 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Apr 2009 16:21:49 +0000 X-ASF-Spam-Status: No, hits=0.2 required=10.0 tests=RCVD_IN_DNSWL_LOW,SPF_NEUTRAL X-Spam-Check-By: apache.org Received-SPF: neutral (nike.apache.org: local policy) Received: from [209.68.5.16] (HELO relay02.pair.com) (209.68.5.16) by apache.org (qpsmtpd/0.29) with SMTP; Mon, 06 Apr 2009 16:21:40 +0000 Received: (qmail 92559 invoked from network); 6 Apr 2009 16:21:17 -0000 Received: from 75.139.91.230 (HELO ?192.168.1.195?) (75.139.91.230) by relay02.pair.com with SMTP; 6 Apr 2009 16:21:17 -0000 X-pair-Authenticated: 75.139.91.230 Message-Id: <3B257AE4-8A98-4486-BC42-BA6D9A9423BA@apache.org> From: Damien Katz To: dev@couchdb.apache.org In-Reply-To: <20090406074001.GA7236@uk.tiscali.com> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v930.3) Subject: Re: Removing PUT 409? Date: Mon, 6 Apr 2009 12:21:17 -0400 References: <20090406074001.GA7236@uk.tiscali.com> X-Mailer: Apple Mail (2.930.3) X-Virus-Checked: Checked by ClamAV on apache.org You can already get the proposed behavior by using _bulk_docs POST and all_or_nothing:true with a single document. We can easily add a flag to single doc PUTs too. The interactive conflict behavior in CouchDB is useful for completely eliminating persisted conflicts in a lot of replicated circumstances, such as master-slave replication, or in instances where different documents will be only edited at a single node (like documents pertaining to different branches offices) but replicated amongst all nodes. -Damien On Apr 6, 2009, at 3:40 AM, Brian Candler wrote: > The following is part thought-experiment, part serious suggestion. > > I propose the following: remove all concurrency control from PUT > operations, > and hence also the 409 response. If you PUT a document where the > _rev is not > the same as a 'head' revision, then a new conflicting version is > inserted. > [1] > > The reasoning is as follows: > > 1. Any application which relies on the 409 PUT conflict behaviour is > not going to work properly in a multi-master replication > environment. > That is: it is protected against concurrent changes on the same > node, > but not on a different node. This is arbitrary. > > 2. The same reasoning was used for getting rid of bulk non-conflicting > updates. Paraphrasing: "a grown-up CouchDB app which runs on a > replicated > cluster won't be able to rely on these semantics, so removing this > capability will encourage you to write your app in a more scalable > way. > You will thank us later." > > 3. A CouchDB app should be written so that it "treats edit conflicts > as a > common state, not an exceptional one" [2] > > This change will slightly increase the number of these normal > conflicts, > whilst forcing the app writer to deal with them. > > 4. By increasing the number of conflicting versions, it is likely to > exercise more the underlying code and flush out bugs (for example, > more > fully testing what happens in views when multiple conflicting > versions of > a document are updated or removed) > > 5. It may highlight more clearly where API improvements are needed > to help > applications deal with and resolve conflicts. For example: > > - making it easier for applications to be aware of the existence of > conflicts (Maybe a GET without _rev should fail if there are > multiple > conflicting revs, or return all of the versions) > > - given that multiple concurrent clients will see conflicts, and may > attempt to resolve them at the same time, then it's likely that > two > clients will independently submit exactly the same document > content > after running the conflict-resolution algorithm. It could be > helpful > if these were treated as a single new rev, and not two new > conflicts. > > Comments? I would be especially interested in hearing from core > developers > who didn't want bulk non-conflicting updates, but *do* want to > retain single > non-conflicting updates, as to why this is logical. > > Regards, > > Brian. > > [1] You can get this behaviour on 0.9.0 by POSTing to _bulk_docs with > {"all_or_nothing":true} > > [2] http://couchdb.apache.org/docs/overview.html under heading > "Conflicts"