Merge "Enforce a maximum of 1024 async threads."

This commit is contained in:
Zuul 2023-04-12 17:36:45 +00:00 committed by Gerrit Code Review
commit 415fcc4054
3 changed files with 40 additions and 6 deletions

View File

@ -57,8 +57,11 @@ ENV_CONF = '/etc/rabbitmq/rabbitmq-env.conf'
# https://tinyurl.com/rabbitmq-3-5-7 for exact value. Note that
# this default has increased with newer versions so we should
# track this and keep the charm up-to-date.
# Also note that 1024 is the maximum supported number of
# threads.
DEFAULT_MULTIPLIER = 24
MAX_DEFAULT_THREADS = DEFAULT_MULTIPLIER * 2
MAX_NUM_THREADS = 1024
def convert_from_base64(v):
@ -210,9 +213,9 @@ class RabbitMQEnvContext(object):
Determine the number of erl vm threads in pool based in cpu resources
available.
Number of threads will be limited to MAX_DEFAULT_WORKERS in
Number of threads will be limited to MAX_DEFAULT_THREADS in
container environments where no worker-multipler configuration
option been set.
option been set and to MAX_NUM_THREADS in all other situations.
@returns int: number of io threads to allocate
"""
@ -238,6 +241,10 @@ class RabbitMQEnvContext(object):
# configuration in LXD containers on large servers.
count = min(count, MAX_DEFAULT_THREADS)
# Never configure a number of threads above the MAX_NUM_THREADS since
# otherwise the daemon won't start.
count = min(count, MAX_NUM_THREADS)
log("erl vm io thread pool size = {} (capped={})"
.format(count, is_container()), DEBUG)

View File

@ -315,7 +315,7 @@ class TestRabbitMQEnvContext(unittest.TestCase):
"'+A 48'"})
@mock.patch.object(rabbitmq_context, 'relation_ids', lambda *args: [])
@mock.patch.object(rabbitmq_context.psutil, 'NUM_CPUS', 128)
@mock.patch.object(rabbitmq_context.psutil, 'NUM_CPUS', 40)
@mock.patch.object(rabbitmq_context, 'service_name')
@mock.patch.object(rabbitmq_context, 'config')
def test_rabbitmqenv_in_container(self, mock_config, mock_service_name):
@ -340,11 +340,35 @@ class TestRabbitMQEnvContext(unittest.TestCase):
ctxt = rabbitmq_context.RabbitMQEnvContext()()
self.assertEqual(ctxt['settings'],
{'RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS':
"'+A 3072'"})
"'+A 960'"})
del config['erl-vm-io-thread-multiplier']
mock_is_ctnr.return_value = False
ctxt = rabbitmq_context.RabbitMQEnvContext()()
self.assertEqual(ctxt['settings'],
{'RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS':
"'+A 3072'"})
"'+A 960'"})
@mock.patch.object(rabbitmq_context.psutil, 'NUM_CPUS', 48)
@mock.patch.object(rabbitmq_context, 'relation_ids', lambda *args: [])
@mock.patch.object(rabbitmq_context, 'service_name')
@mock.patch.object(rabbitmq_context, 'config')
def test_rabbitmqenv_max_num_threads(self, mock_config, mock_service_name):
config = {}
def fake_config(key):
return config.get(key)
mock_service_name.return_value = 'svc_foo'
mock_config.side_effect = fake_config
ctxt = rabbitmq_context.RabbitMQEnvContext()()
self.assertEqual(ctxt['settings'],
{'RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS':
"'+A 1024'"})
config['erl-vm-io-thread-multiplier'] = 10
ctxt = rabbitmq_context.RabbitMQEnvContext()()
self.assertEqual(ctxt['settings'],
{'RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS':
"'+A 480'"})

View File

@ -328,6 +328,7 @@ class RelationUtil(CharmTestCase):
if os.path.exists(tmpdir):
shutil.rmtree(tmpdir)
@patch('rabbit_utils.lsb_release')
@patch.object(rabbitmq_server_relations.rabbit, 'grant_permissions')
@patch('rabbit_utils.create_user')
@patch('rabbit_utils.local_unit')
@ -359,7 +360,8 @@ class RelationUtil(CharmTestCase):
mock_remove_check, mock_add_check,
mock_local_unit,
mock_create_user,
mock_grant_permissions):
mock_grant_permissions,
mock_lsb_release):
self.test_config.set('ssl', 'on')
@ -379,6 +381,7 @@ class RelationUtil(CharmTestCase):
mock_nrpe_relation_ids.side_effect = lambda x: [
'nrpe-external-master:1']
mock_local_unit.return_value = 'unit/0'
mock_lsb_release.return_value = {'DISTRIB_CODENAME': 'focal'}
rabbitmq_server_relations.update_nrpe_checks()
mock_check_output.assert_any_call(