From 715fc2747432a06c19474be95277aba2c47968b8 Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Thu, 25 Aug 2016 15:01:18 -0400 Subject: [PATCH] Add a default database connect timeout Fixes #1760 --- data/database.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/data/database.py b/data/database.py index e3db10efc..4414e73dc 100644 --- a/data/database.py +++ b/data/database.py @@ -28,6 +28,7 @@ from util.names import urn_generator logger = logging.getLogger(__name__) +DEFAULT_DB_CONNECT_TIMEOUT = 10 # seconds _SCHEME_DRIVERS = { 'mysql': MySQLDatabase, @@ -37,7 +38,6 @@ _SCHEME_DRIVERS = { 'postgresql+psycopg2': PostgresqlDatabase, } - SCHEME_RANDOM_FUNCTION = { 'mysql': fn.Rand, 'mysql+pymysql': fn.Rand, @@ -46,7 +46,6 @@ SCHEME_RANDOM_FUNCTION = { 'postgresql+psycopg2': fn.Random, } - def pipes_concat(arg1, arg2, *extra_args): """ Concat function for sqlite, since it doesn't support fn.Concat. Concatenates clauses with || characters. @@ -215,9 +214,8 @@ db_concat_func = CallableProxy() def validate_database_url(url, db_kwargs, connect_timeout=5): db_kwargs = db_kwargs.copy() - db_kwargs['connect_timeout'] = connect_timeout - driver = _db_from_url(url, db_kwargs) + driver = _db_from_url(url, db_kwargs, connect_timeout=connect_timeout) driver.connect() driver.close() @@ -226,7 +224,7 @@ def _wrap_for_retry(driver): return type('Retrying' + driver.__class__.__name__, (RetryOperationalError, driver), {}) -def _db_from_url(url, db_kwargs): +def _db_from_url(url, db_kwargs, connect_timeout=DEFAULT_DB_CONNECT_TIMEOUT): parsed_url = make_url(url) if parsed_url.host: @@ -239,8 +237,8 @@ def _db_from_url(url, db_kwargs): db_kwargs['password'] = parsed_url.password # Note: sqlite does not support connect_timeout. - if parsed_url.drivername == 'sqlite' and 'connect_timeout' in db_kwargs: - del db_kwargs['connect_timeout'] + if parsed_url.drivername != 'sqlite': + db_kwargs['connect_timeout'] = db_kwargs.get('connect_timeout', connect_timeout) driver = _SCHEME_DRIVERS[parsed_url.drivername] wrapped_driver = _wrap_for_retry(driver)