From 59fa4bcefe2ca8cc50d54672cab1a8bfb07fcf95 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Sun, 11 Feb 2024 14:44:16 +0900 Subject: [PATCH] Remove [database] use_tpool and TpoolDbapiWrapper This was formally deprecated in 11.0.0 release[1]. [1] 74c6bf266e0b86ceb4726cad9268f134d423bae8 Change-Id: Ia1f4dc5f081bd7cf7d1245aa9fcdf40176942af9 --- oslo_db/concurrency.py | 97 --------------- oslo_db/sqlalchemy/enginefacade.py | 6 +- oslo_db/tests/test_concurrency.py | 112 ------------------ .../remove-use_tpool-29a8bf9fc68a9bb2.yaml | 5 + setup.cfg | 1 - 5 files changed, 8 insertions(+), 213 deletions(-) delete mode 100644 oslo_db/concurrency.py delete mode 100644 oslo_db/tests/test_concurrency.py create mode 100644 releasenotes/notes/remove-use_tpool-29a8bf9fc68a9bb2.yaml diff --git a/oslo_db/concurrency.py b/oslo_db/concurrency.py deleted file mode 100644 index 6043a680..00000000 --- a/oslo_db/concurrency.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2014 Mirantis.inc -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import logging -import threading - -from debtcollector import removals -from oslo_config import cfg - -from oslo_db import api - -LOG = logging.getLogger(__name__) - -tpool_opts = [ - cfg.BoolOpt( - 'use_tpool', - default=False, - deprecated_name='dbapi_use_tpool', - deprecated_group='DEFAULT', - deprecated_for_removal=True, - deprecated_since='10.0.0', - deprecated_reason=( - 'This feature has never graduated from experimental status and is ' - 'now being removed due to lack of maintenance and test coverage' - ), - help=( - 'Enable the experimental use of thread pooling for ' - 'all DB API calls' - ), - ), -] - -_removed_msg = ( - 'Thread pool support in oslo_db is deprecated; you should use ' - 'oslo_db.api.DBAPI.from_config directly' -) - - -@removals.removed_class( - 'TpoolDbapiWrapper', message=_removed_msg, version='10.0.0') -class TpoolDbapiWrapper(object): - """DB API wrapper class. - - This wraps the oslo DB API with an option to be able to use eventlet's - thread pooling. Since the CONF variable may not be loaded at the time - this class is instantiated, we must look at it on the first DB API call. - """ - - def __init__(self, conf, backend_mapping): - self._db_api = None - self._backend_mapping = backend_mapping - self._conf = conf - self._conf.register_opts(tpool_opts, 'database') - self._lock = threading.Lock() - - @property - def _api(self): - if not self._db_api: - with self._lock: - if not self._db_api: - db_api = api.DBAPI.from_config( - conf=self._conf, backend_mapping=self._backend_mapping) - if self._conf.database.use_tpool: - try: - from eventlet import tpool - except ImportError: - LOG.exception("'eventlet' is required for " - "TpoolDbapiWrapper.") - raise - self._db_api = tpool.Proxy(db_api) - else: - self._db_api = db_api - return self._db_api - - def __getattr__(self, key): - return getattr(self._api, key) - - -def list_opts(): - """Returns a list of oslo.config options available in this module. - - :returns: a list of (group_name, opts) tuples - """ - return [('database', copy.deepcopy(tpool_opts))] diff --git a/oslo_db/sqlalchemy/enginefacade.py b/oslo_db/sqlalchemy/enginefacade.py index 293b9883..46daa3ab 100644 --- a/oslo_db/sqlalchemy/enginefacade.py +++ b/oslo_db/sqlalchemy/enginefacade.py @@ -187,14 +187,14 @@ def __init__(self): } # other options that are defined in oslo_db.options.database_opts - # or oslo_db.concurrency.tpool_opts but do not apply to the standard - # enginefacade arguments (most seem to apply to api.DBAPI). + # but do not apply to the standard enginefacade arguments (most seem + # to apply to api.DBAPI). self._ignored_cfg = dict( (k, _Default(None)) for k in [ 'db_max_retries', 'db_inc_retry_interval', 'use_db_reconnect', 'db_retry_interval', - 'db_max_retry_interval', 'backend', 'use_tpool' + 'db_max_retry_interval', 'backend', ] ) diff --git a/oslo_db/tests/test_concurrency.py b/oslo_db/tests/test_concurrency.py deleted file mode 100644 index e58337c6..00000000 --- a/oslo_db/tests/test_concurrency.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright 2014 Mirantis.inc -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import sys -from unittest import mock - -from oslo_config import fixture as config_fixture - -from oslo_db import concurrency -from oslo_db.tests import base as test_base - -FAKE_BACKEND_MAPPING = {'sqlalchemy': 'fake.db.sqlalchemy.api'} - - -class TpoolDbapiWrapperTestCase(test_base.BaseTestCase): - - def setUp(self): - super(TpoolDbapiWrapperTestCase, self).setUp() - - self.conf = self.useFixture(config_fixture.Config()).conf - - self.db_api = concurrency.TpoolDbapiWrapper( - conf=self.conf, backend_mapping=FAKE_BACKEND_MAPPING) - - # NOTE(akurilin): We are not going to add `eventlet` to `oslo_db` in - # requirements (`requirements.txt` and `test-requirements.txt`) due to - # the following reasons: - # - supporting of eventlet's thread pooling is totally optional; - # - we don't need to test `tpool.Proxy` functionality itself, - # because it's a tool from the third party library; - # - `eventlet` would prevent us from running unit tests on Python 3.x - # versions, because it doesn't support them yet. - # - # As we don't test `tpool.Proxy`, we can safely mock it in tests. - - self.proxy = mock.MagicMock() - self.eventlet = mock.MagicMock() - self.eventlet.tpool.Proxy.return_value = self.proxy - sys.modules['eventlet'] = self.eventlet - self.addCleanup(sys.modules.pop, 'eventlet', None) - - @mock.patch('oslo_db.api.DBAPI') - def test_db_api_common(self, mock_db_api): - # test context: - # CONF.database.use_tpool == False - # eventlet is installed - # expected result: - # TpoolDbapiWrapper should wrap DBAPI - - fake_db_api = mock.MagicMock() - mock_db_api.from_config.return_value = fake_db_api - - # get access to some db-api method - self.db_api.fake_call_1 - - mock_db_api.from_config.assert_called_once_with( - conf=self.conf, backend_mapping=FAKE_BACKEND_MAPPING) - self.assertEqual(fake_db_api, self.db_api._db_api) - self.assertFalse(self.eventlet.tpool.Proxy.called) - - # get access to other db-api method to be sure that api didn't changed - self.db_api.fake_call_2 - - self.assertEqual(fake_db_api, self.db_api._db_api) - self.assertFalse(self.eventlet.tpool.Proxy.called) - self.assertEqual(1, mock_db_api.from_config.call_count) - - @mock.patch('oslo_db.api.DBAPI') - def test_db_api_config_change(self, mock_db_api): - # test context: - # CONF.database.use_tpool == True - # eventlet is installed - # expected result: - # TpoolDbapiWrapper should wrap tpool proxy - - fake_db_api = mock.MagicMock() - mock_db_api.from_config.return_value = fake_db_api - self.conf.set_override('use_tpool', True, group='database') - - # get access to some db-api method - self.db_api.fake_call - - # CONF.database.use_tpool is True, so we get tpool proxy in this case - mock_db_api.from_config.assert_called_once_with( - conf=self.conf, backend_mapping=FAKE_BACKEND_MAPPING) - self.eventlet.tpool.Proxy.assert_called_once_with(fake_db_api) - self.assertEqual(self.proxy, self.db_api._db_api) - - @mock.patch('oslo_db.api.DBAPI') - def test_db_api_without_installed_eventlet(self, mock_db_api): - # test context: - # CONF.database.use_tpool == True - # eventlet is not installed - # expected result: - # raise ImportError - - self.conf.set_override('use_tpool', True, group='database') - sys.modules['eventlet'] = None - - self.assertRaises(ImportError, getattr, self.db_api, 'fake') diff --git a/releasenotes/notes/remove-use_tpool-29a8bf9fc68a9bb2.yaml b/releasenotes/notes/remove-use_tpool-29a8bf9fc68a9bb2.yaml new file mode 100644 index 00000000..9ff70c4d --- /dev/null +++ b/releasenotes/notes/remove-use_tpool-29a8bf9fc68a9bb2.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + The ``oslo_db.concurrency.TpoolDbapiWrapper`` class and supporting + ``[database] use_tpool`` config option have been removed. diff --git a/setup.cfg b/setup.cfg index 5c2831c1..dd8759a2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -37,7 +37,6 @@ packages = [entry_points] oslo.config.opts = oslo.db = oslo_db.options:list_opts - oslo.db.concurrency = oslo_db.concurrency:list_opts oslo.db.migration = alembic = oslo_db.sqlalchemy.migration_cli.ext_alembic:AlembicExtension