From efb66f7c1e8aef360b21414b31859b0e9d3b9bd1 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Mon, 15 Sep 2014 15:58:56 -0400 Subject: [PATCH] Select the random row function based on DB driver. --- data/database.py | 20 ++++++++++++++++++++ test/data/test.db | Bin 231424 -> 614400 bytes workers/buildlogsarchiver.py | 4 ++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/data/database.py b/data/database.py index 96e85a7d2..2b7b3c6ad 100644 --- a/data/database.py +++ b/data/database.py @@ -21,8 +21,24 @@ SCHEME_DRIVERS = { 'postgresql+psycopg2': PostgresqlDatabase, } +SCHEME_RANDOM_FUNCTION = { + 'mysql': fn.Rand, + 'mysql+pymysql': fn.Rand, + 'sqlite': fn.Random, + 'postgresql': fn.Random, + 'postgresql+psycopg2': fn.Random, +} + +class CallableProxy(Proxy): + def __call__(self, *args, **kwargs): + if self.obj is None: + raise AttributeError('Cannot use uninitialized Proxy.') + return self.obj(*args, **kwargs) + db = Proxy() read_slave = Proxy() +db_random_func = CallableProxy() + def _db_from_url(url, db_kwargs): parsed_url = make_url(url) @@ -38,11 +54,15 @@ def _db_from_url(url, db_kwargs): return SCHEME_DRIVERS[parsed_url.drivername](parsed_url.database, **db_kwargs) + def configure(config_object): db_kwargs = dict(config_object['DB_CONNECTION_ARGS']) write_db_uri = config_object['DB_URI'] db.initialize(_db_from_url(write_db_uri, db_kwargs)) + parsed_write_uri = make_url(write_db_uri) + db_random_func.initialize(SCHEME_RANDOM_FUNCTION[parsed_write_uri.drivername]) + read_slave_uri = config_object.get('DB_READ_SLAVE_URI', None) if read_slave_uri is not None: read_slave.initialize(_db_from_url(read_slave_uri, db_kwargs)) diff --git a/test/data/test.db b/test/data/test.db index 2c16ee353e76ce9f614a978c36e8642b332c6237..29f6e14441a0a4be638dec0fd273ff2ead6ba022 100644 GIT binary patch delta 21824 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 HyNUk?vGK9{ delta 19616 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 ORe1*el`jsW=l>sA&xq^* diff --git a/workers/buildlogsarchiver.py b/workers/buildlogsarchiver.py index 213481eed..9b621eb39 100644 --- a/workers/buildlogsarchiver.py +++ b/workers/buildlogsarchiver.py @@ -7,7 +7,7 @@ from gzip import GzipFile from data import model from data.archivedlogs import JSON_MIMETYPE -from data.database import RepositoryBuild +from data.database import RepositoryBuild, db_random_func from app import build_logs, log_archive from util.streamingjsonencoder import StreamingJSONEncoder @@ -22,7 +22,7 @@ def archive_redis_buildlogs(): avoid needing two-phase commit. """ try: # Get a random build to archive - to_archive = model.archivable_buildlogs_query().order_by(fn.Random()).get() + to_archive = model.archivable_buildlogs_query().order_by(db_random_func()).get() logger.debug('Archiving: %s', to_archive.uuid) length, entries = build_logs.get_log_entries(to_archive.uuid, 0)