Add retry on db connection errors

Change-Id: I381af38ff486f3c53b6bfd65c3a6d3f82f11b228
This commit is contained in:
Mike Fedosin 2016-10-05 15:33:33 +03:00
parent e6d7af4cf8
commit 97b0da3afe
1 changed files with 29 additions and 0 deletions

View File

@ -14,12 +14,27 @@
"""Database API for all artifact types"""
from oslo_db import exception as db_exception
from oslo_log import log as logging
from retrying import retry
import six
from glare.db import api as base_api
from glare.db.sqlalchemy import api
from glare.i18n import _LW
from glare import locking
LOG = logging.getLogger(__name__)
def _retry_on_connection_error(exc):
"""Function to retry a DB API call if connection error was received."""
if isinstance(exc, db_exception.DBConnectionError):
LOG.warn(_LW("Connection error detected. Retrying..."))
return True
return False
class ArtifactAPI(base_api.BaseDBAPI):
@ -36,25 +51,35 @@ class ArtifactAPI(base_api.BaseDBAPI):
new_values.setdefault('properties', {})[key] = value
return new_values
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def create(self, context, values):
values = self._serialize_values(values)
values['type_name'] = self.type
session = api.get_session()
return api.create(context, values, session)
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def update(self, context, artifact_id, values):
session = api.get_session()
return api.update(context, artifact_id,
self._serialize_values(values), session)
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def delete(self, context, artifact_id):
session = api.get_session()
return api.delete(context, artifact_id, session)
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def get(self, context, artifact_id):
session = api.get_session()
return api.get(context, artifact_id, session)
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def list(self, context, filters, marker, limit, sort, latest):
session = api.get_session()
if self.type != 'all':
@ -65,10 +90,14 @@ class ArtifactAPI(base_api.BaseDBAPI):
class ArtifactLockApi(locking.LockApiBase):
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def create_lock(self, context, lock_key):
session = api.get_session()
return api.create_lock(context, lock_key, session)
@retry(retry_on_exception=_retry_on_connection_error, wait_fixed=1000,
stop_max_attempt_number=20)
def delete_lock(self, context, lock_id):
session = api.get_session()
api.delete_lock(context, lock_id, session)