From a57db4e64ad154aeecb62adffc2a735966e44d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Czhangshengping2012=E2=80=9D?= Date: Wed, 7 Dec 2016 17:49:07 +0800 Subject: [PATCH] Replace all retrying with tenacity in Panko Change-Id: I7e61fa4dad70801cdbc1f543fe18d7c1a64116b0 --- panko/storage/__init__.py | 10 ++++++---- panko/storage/mongo/utils.py | 13 +++++++------ panko/tests/unit/storage/test_get_connection.py | 17 +++++++++-------- requirements.txt | 2 +- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/panko/storage/__init__.py b/panko/storage/__init__.py index bfdfb251..dac22042 100644 --- a/panko/storage/__init__.py +++ b/panko/storage/__init__.py @@ -17,9 +17,9 @@ from oslo_config import cfg from oslo_log import log -import retrying import six.moves.urllib.parse as urlparse from stevedore import driver +import tenacity LOG = log.getLogger(__name__) @@ -57,9 +57,11 @@ class InvalidMarker(Exception): def get_connection_from_config(conf): retries = conf.database.max_retries - # Convert retry_interval secs to msecs for retry decorator - @retrying.retry(wait_fixed=conf.database.retry_interval * 1000, - stop_max_attempt_number=retries if retries >= 0 else None) + @tenacity.retry( + wait=tenacity.wait_fixed(conf.database.retry_interval), + stop=(tenacity.stop_after_attempt(retries) if retries >= 0 + else tenacity.stop_never) + ) def _inner(): url = (getattr(conf.database, 'event_connection') or conf.database.connection) diff --git a/panko/storage/mongo/utils.py b/panko/storage/mongo/utils.py index 75f27a4e..791a2afa 100644 --- a/panko/storage/mongo/utils.py +++ b/panko/storage/mongo/utils.py @@ -21,8 +21,8 @@ from oslo_log import log from oslo_utils import netutils import pymongo import pymongo.errors -import retrying import six +import tenacity from panko.i18n import _, _LI @@ -145,11 +145,12 @@ class ConnectionPool(object): def _safe_mongo_call(max_retries, retry_interval): - return retrying.retry( - retry_on_exception=lambda e: isinstance( - e, pymongo.errors.AutoReconnect), - wait_fixed=retry_interval * 1000, - stop_max_attempt_number=max_retries if max_retries >= 0 else None + return tenacity.retry( + retry=tenacity.retry_if_exception_type( + pymongo.errors.AutoReconnect), + wait=tenacity.wait_fixed(retry_interval), + stop=(tenacity.stop_after_attempt(max_retries) if max_retries >= 0 + else tenacity.stop_never) ) diff --git a/panko/tests/unit/storage/test_get_connection.py b/panko/tests/unit/storage/test_get_connection.py index e1c4496d..b4c771b0 100644 --- a/panko/tests/unit/storage/test_get_connection.py +++ b/panko/tests/unit/storage/test_get_connection.py @@ -17,7 +17,6 @@ import mock from oslotest import base -import retrying from panko.event.storage import impl_log from panko.event.storage import impl_sqlalchemy @@ -45,17 +44,19 @@ class ConnectionRetryTest(base.BaseTestCase): self.CONF = service.prepare_service([], config_files=[]) def test_retries(self): - with mock.patch.object( - retrying.Retrying, 'should_reject') as retry_reject: + # stevedore gives warning log instead of any exception + with mock.patch.object(storage, 'get_connection', + side_effect=Exception) as retries: try: - self.CONF.set_override("connection", "no-such-engine://", + self.CONF.set_override("retry_interval", 1, group="database") - self.CONF.set_override("retry_interval", 0.00001, + self.CONF.set_override("max_retries", 3, group="database") storage.get_connection_from_config(self.CONF) - except RuntimeError as err: - self.assertIn('no-such-engine', six.text_type(err)) - self.assertEqual(10, retry_reject.call_count) + except Exception: + self.assertEqual(3, retries.call_count) + else: + self.fail() class ConnectionConfigTest(base.BaseTestCase): diff --git a/requirements.txt b/requirements.txt index 9284ce75..008abc11 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ # process, which may cause wedges in the gate later. debtcollector>=1.2.0 # Apache-2.0 -retrying!=1.3.0,>=1.2.3 # Apache-2.0 +tenacity>=3.1.0 # Apache-2.0 keystonemiddleware!=4.1.0,>=4.0.0 # Apache-2.0 lxml>=2.3 # BSD oslo.db>=4.1.0 # Apache-2.0