diff --git a/r2/r2/lib/app_globals.py b/r2/r2/lib/app_globals.py index 372941e82..b40503da4 100755 --- a/r2/r2/lib/app_globals.py +++ b/r2/r2/lib/app_globals.py @@ -231,6 +231,16 @@ class Globals(object): max_retries=3, prefill=False ), + "noretries": + PycassaConnectionPool( + keyspace, + logging_name="noretries", + server_list=self.cassandra_seeds, + pool_size=len(self.cassandra_seeds), + timeout=.1, + max_retries=0, + prefill=False + ), } perma_memcache = (CMemcache(self.permacache_memcaches, num_clients = num_mc_clients) diff --git a/r2/r2/lib/db/tdb_cassandra.py b/r2/r2/lib/db/tdb_cassandra.py index 9e17b7689..d4bf79e74 100644 --- a/r2/r2/lib/db/tdb_cassandra.py +++ b/r2/r2/lib/db/tdb_cassandra.py @@ -26,7 +26,7 @@ from pylons import g from pycassa import ColumnFamily from pycassa.cassandra.ttypes import ConsistencyLevel, NotFoundException -from pycassa.system_manager import SystemManager, UTF8_TYPE +from pycassa.system_manager import SystemManager, UTF8_TYPE, COUNTER_COLUMN_TYPE from r2.lib.utils import tup, Storage from r2.lib.db.sorts import epoch_seconds @@ -141,10 +141,14 @@ class ThingMeta(type): manager = get_manager(cassandra_seeds) + extra_creation_arguments = getattr(cls, "_extra_schema_creation_args", {}) + log.warning("Creating Cassandra Column Family %s" % (cf_name,)) with make_lock('cassandra_schema'): manager.create_column_family(keyspace, cf_name, - comparator_type = cls._compare_with) + comparator_type = cls._compare_with, + **extra_creation_arguments + ) log.warning("Created Cassandra Column Family %s" % (cf_name,)) # try again to look it up @@ -158,6 +162,30 @@ class ThingMeta(type): def __repr__(cls): return '' % cls.__name__ +class Counter(object): + __metaclass__ = ThingMeta + + _use_db = False + _connection_pool = 'noretries' + _extra_schema_creation_args = { + 'default_validation_class': COUNTER_COLUMN_TYPE, + 'replicate_on_write': True + } + + _type_prefix = None + _cf_name = None + _compare_with = UTF8_TYPE + + @classmethod + def _byID(cls, key): + return cls._cf.get(key) + + @classmethod + @will_write + def _incr(cls, key, column, delta=1): + cls._cf.add(key, column, delta) + + class ThingBase(object): # base class for Thing and Relation