From 425ef28924f9d4178eaea2c0c0fe9e580b796aaa Mon Sep 17 00:00:00 2001 From: Sean Mooney Date: Mon, 12 Oct 2020 22:43:31 +0100 Subject: [PATCH] add min of 1 to rpc_conn_pool_size This change add a min value of 1 to [oslo_messaging_rabbit]/rpc_conn_pool_size such that there is always at least 1 connection avaiable. This change add a runtime check to ensure that [oslo_messaging_rabbit]/rpc_conn_pool_size is greater than or equal too [oslo_messaging_rabbit]/conn_pool_min_size Modified: oslo_messaging/tests/functional/test_rabbitmq.py NOTE(stephenfin): We must set the 'conn_pool_min_size' config option in the 'RabbitMQFailoverTests.test_failover_scenario' test to avoid raising an error because the minimum is greater than the configured value. This wasn't necessary on stable/train due to the presence of change I0f86416623a0b718516147f0660b4df2b74cf867 ("Setup backend scenarios for functional tests") which changed how our functional tests ran. Change-Id: I2ad4b9f1d012c9f0586a932ac27d96da1bcc4e4c Closes-Bug: #1899533 (cherry picked from commit 00d15eaeaba0ded0330cdcec7b19eee3adbfb1e1) (cherry picked from commit 8f5847dcbe5144272ff7295fce2b50a9f544e5b0) (cherry picked from commit 7c9b070f5bc07692c837f9915eb0d8525065d0f6) --- oslo_messaging/_drivers/base.py | 3 ++- oslo_messaging/_drivers/impl_rabbit.py | 5 +++++ oslo_messaging/tests/drivers/test_impl_rabbit.py | 15 +++++++++++++++ oslo_messaging/tests/functional/test_rabbitmq.py | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/oslo_messaging/_drivers/base.py b/oslo_messaging/_drivers/base.py index fb44540e9..f8e819e3e 100644 --- a/oslo_messaging/_drivers/base.py +++ b/oslo_messaging/_drivers/base.py @@ -25,7 +25,8 @@ from oslo_messaging import exceptions base_opts = [ cfg.IntOpt('rpc_conn_pool_size', default=30, deprecated_group='DEFAULT', - help='Size of RPC connection pool.'), + help='Size of RPC connection pool.', + min=1), cfg.IntOpt('conn_pool_min_size', default=2, help='The pool size limit for connections expiration policy'), cfg.IntOpt('conn_pool_ttl', default=1200, diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py index 1f25da68c..8aac4d6fa 100644 --- a/oslo_messaging/_drivers/impl_rabbit.py +++ b/oslo_messaging/_drivers/impl_rabbit.py @@ -1370,6 +1370,11 @@ class RabbitDriver(amqpdriver.AMQPDriverBase): # the pool configuration properties max_size = conf.oslo_messaging_rabbit.rpc_conn_pool_size min_size = conf.oslo_messaging_rabbit.conn_pool_min_size + if max_size < min_size: + text = 'rpc_conn_pool_size: {max_size} must be greater than' \ + ' or equal to conn_pool_min_size:' \ + ' {min_size}'.format(max_size=max_size, min_size=min_size) + raise RuntimeError(text) ttl = conf.oslo_messaging_rabbit.conn_pool_ttl connection_pool = pool.ConnectionPool( diff --git a/oslo_messaging/tests/drivers/test_impl_rabbit.py b/oslo_messaging/tests/drivers/test_impl_rabbit.py index ce6d11d7c..988799c17 100644 --- a/oslo_messaging/tests/drivers/test_impl_rabbit.py +++ b/oslo_messaging/tests/drivers/test_impl_rabbit.py @@ -31,6 +31,7 @@ from oslo_messaging._drivers import common as driver_common from oslo_messaging._drivers import impl_rabbit as rabbit_driver from oslo_messaging.exceptions import MessageDeliveryFailure from oslo_messaging.tests import utils as test_utils +from oslo_messaging.transport import DriverLoadFailure from six.moves import mock load_tests = testscenarios.load_tests_apply_scenarios @@ -141,6 +142,20 @@ class TestRabbitDriverLoad(test_utils.BaseTestCase): self.assertIsInstance(driver, rabbit_driver.RabbitDriver) + @mock.patch('oslo_messaging._drivers.impl_rabbit.Connection' + '.ensure_connection') + @mock.patch('oslo_messaging._drivers.impl_rabbit.Connection.reset') + def test_driver_load_max_less_than_min(self, fake_ensure, fake_reset): + self.config( + rpc_conn_pool_size=1, conn_pool_min_size=2, + group='oslo_messaging_rabbit') + self.messaging_conf.transport_url = self.transport_url + error = self.assertRaises( + DriverLoadFailure, oslo_messaging.get_transport, self.conf) + self.assertIn( + "rpc_conn_pool_size: 1 must be greater than or equal " + "to conn_pool_min_size: 2", str(error)) + class TestRabbitDriverLoadSSL(test_utils.BaseTestCase): scenarios = [ diff --git a/oslo_messaging/tests/functional/test_rabbitmq.py b/oslo_messaging/tests/functional/test_rabbitmq.py index db06d01ef..ce84edab4 100644 --- a/oslo_messaging/tests/functional/test_rabbitmq.py +++ b/oslo_messaging/tests/functional/test_rabbitmq.py @@ -50,6 +50,7 @@ class RabbitMQFailoverTests(test_utils.BaseTestCase): # correctly self.config(heartbeat_timeout_threshold=1, rpc_conn_pool_size=1, + conn_pool_min_size=1, kombu_reconnect_delay=0, rabbit_retry_interval=0, rabbit_retry_backoff=0,