Hi all,

I'm trying to write an application using Cassandra which requires the
use of a global, monotonically-increasing counter. I've seen the
previous threads on this subject which basically say that this can't
be done in Cassandra as is, but I think I've come up with a method
that might work. I wanted to get the list's feedback on whether or not
this method is workable:

* Each client maintains its own monotonically-increasing counter as a
row in Cassandra
* When a client wants to increment the counter, it will:
  * increment its own counter key using a quorum write
  * read all keys in the CF using a quorum read
  * the sum of the values is then the value of the counter

This method is robust against nodes coming and going (new nodes just
get a new counter and dead nodes never increase their counter again).
It also doesn't matter for my application if some possible values for
the counter are skipped over, as long as every value is greater than
the last. I believe this scheme to be commensurate to a vector clock,
no?

My question would be: assuming we're using both quorum reads and
writes, is it possible that clients A and B could race in the
following manner:

* A updates its counter
* B updates its counter
* A reads the keys to get sum X
* B reads the keys to get the same sum X

...thus violating the ever-increasing constraint?

Google App Engine suggests a similar method for doing global counters
on Datastore: http://code.google.com/appengine/articles/sharding_counters.html.
I'm troubled by their implementation, though, because the reads on the
list of counters are not transactional and are potentially subject to
the same race that I've described above.

Any thoughts/ideas?

-- 
Toby DiPasquale

Reply via email to