9 messages in com.googlegroups.google-appengine[google-appengine] Re: felxible shard...
FromSent OnAttachments
conmanAug 13, 2008 4:11 am 
Calvin SpealmanAug 13, 2008 3:07 pm 
BillAug 13, 2008 7:03 pm 
conmanAug 14, 2008 12:16 am 
conmanAug 14, 2008 12:39 am 
BillAug 14, 2008 10:38 am 
BillAug 14, 2008 11:39 am 
Bryan A. PendletonAug 14, 2008 12:15 pm 
conmanAug 14, 2008 11:58 pm 
Actions with this message:
Paste this link in email or IM:
Paste this link in email or IM:
Atom feed for this thread
Paste this URL into your reader:
Subject:[google-appengine] Re: felxible sharded counterActions...
From:Calvin Spealman (iron@gmail.com)
Date:Aug 13, 2008 3:07:55 pm
List:com.googlegroups.google-appengine

thanks to this code, if there are db issues raises transaction errors, you'll just keep raising the number of shards over and over. couldnt other things cause the error? i dont think having a static shard count is bad. some times, extra code is just more trouble than raising it when you get more popular.

On Wed, Aug 13, 2008 at 7:11 AM, conman <cons@googlemail.com> wrote:

Hello,

I have implemented a variation of the sharded counter form Google IO speech (http://sites.google.com/site/io/building-scalable-web- applications-with-google-app-engine)

My variation is that instead of haveing a fixed number my number of shards increases if contention on the counter increases.

But I am not quite sure if I have done it right: Please have a look:

def inc(self): try: def txn(): c = self._get_one() # get sharded counter by random c.count += 1 # increase counter c.put() # write counter try: db.run_in_transaction(txn) except db.TransactionFailedError(): # if this transaction fails... logging.debug('Counter %s: inc failed.' % self.name) self.num_shards += 5 # increase number of shards self.put() except: pass

You see, when the transaction fails due to high contention I modify the number of shards. But I am not sure, if I should place this

self.num_shards += 5 # increase number of shards self.put()

inside a transaction or not...? I mean if contention is high a lot threads are going to try to increase the number of shards. Is it correct to ignore the case when this code fails (the outer try/except block) or should it be placed inside a transaction (which would leed to retries of this code)?