Return-Path: Delivered-To: apmail-couchdb-user-archive@www.apache.org Received: (qmail 5684 invoked from network); 12 Feb 2009 19:57:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 12 Feb 2009 19:57:04 -0000 Received: (qmail 19078 invoked by uid 500); 12 Feb 2009 19:57:01 -0000 Delivered-To: apmail-couchdb-user-archive@couchdb.apache.org Received: (qmail 19043 invoked by uid 500); 12 Feb 2009 19:57:01 -0000 Mailing-List: contact user-help@couchdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@couchdb.apache.org Delivered-To: mailing list user@couchdb.apache.org Received: (qmail 19032 invoked by uid 99); 12 Feb 2009 19:57:01 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 12 Feb 2009 11:57:01 -0800 X-ASF-Spam-Status: No, hits=1.2 required=10.0 tests=SPF_NEUTRAL X-Spam-Check-By: apache.org Received-SPF: neutral (athena.apache.org: local policy) Received: from [209.85.198.226] (HELO rv-out-0506.google.com) (209.85.198.226) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 12 Feb 2009 19:56:53 +0000 Received: by rv-out-0506.google.com with SMTP id f6so384047rvb.35 for ; Thu, 12 Feb 2009 11:56:32 -0800 (PST) Received: by 10.140.158.4 with SMTP id g4mr724882rve.160.1234468592133; Thu, 12 Feb 2009 11:56:32 -0800 (PST) Received: from ?10.0.1.205? ([67.159.148.212]) by mx.google.com with ESMTPS id k2sm831107rvb.4.2009.02.12.11.56.31 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 12 Feb 2009 11:56:31 -0800 (PST) Message-Id: <19C1C5D0-DC35-4FB0-B582-D40E3F7AFA75@blit.com> From: Troy Kruthoff To: user@couchdb.apache.org In-Reply-To: <7528BFCF-2533-4A6F-AE60-C6968E219F88@cisco.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: reserving resources in Couch Date: Thu, 12 Feb 2009 11:56:30 -0800 References: <7528BFCF-2533-4A6F-AE60-C6968E219F88@cisco.com> X-Mailer: Apple Mail (2.930.3) X-Virus-Checked: Checked by ClamAV on apache.org If I understand you correctly, what you need is already baked in with revision #'s. 1) Get a doc that is not assigned a resource 2) Flag the doc as being in-use and then save it. 2a) If the save fails because of conflict, you can then verify the new rev is in use and forget about it 2b) If save is success, you know that process has secured the "in- use" lock -- troy On Feb 12, 2009, at 9:11 AM, Wout Mertens wrote: > Ok, > > (no actual code yet, I don't have time to code right now :( ) > > I have a project currently using an RDBMS and I'd like to port it to > CouchDB. One of the things I do is lock a table, choose a free > resource from a query on a static table and the session list, assign > the resource to a new session and unlock the table. > > How would I be able to do the same thing with CouchDB given that 2 > sessions could start at the same time? I do have the advantage that > simultaneous starters would contact the same CouchDB instance. > > I was thinking of using sums: make a view that calculates the sum of > resources. A resource record would count as +1 and an in-use record > would be -1. > > Then when you reserve a resource, you save the in-use record. After > saving, look up the sum for the resource you reserved. If it's not > equal to 0, then use a stable algorithm to determine who has to > release the resource again. > > Would this close the race condition? Note that no documents are > overwritten at reservation time, each reservation doubles as the > event log. When the session clears up, the document that represents > it is updated to release the resource. > > Does this work? Is there a better way to do it? > > Thanks, > > Wout.