Merge ~ballot/content-cache-charm/+git/content-cache-charm:worker_connections into content-cache-charm:master

Proposed by Benjamin Allot
Status: Work in progress
Proposed branch: ~ballot/content-cache-charm/+git/content-cache-charm:worker_connections
Merge into: content-cache-charm:master
Prerequisite: ~ballot/content-cache-charm/+git/content-cache-charm:reuseport
Diff against target: 130 lines (+31/-5)
5 files modified
config.yaml (+2/-1)
lib/haproxy.py (+3/-2)
reactive/content_cache.py (+12/-0)
tests/unit/test_content_cache.py (+8/-2)
tests/unit/test_nginx.py (+6/-0)
Reviewer Review Type Date Requested Status
Content Cache Charmers Pending
Review via email: mp+400075@code.launchpad.net
To post a comment you must log in.

Unmerged commits

95f319d... by Benjamin Allot

WIP

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/config.yaml b/config.yaml
index 3ce504a..c843b93 100644
--- a/config.yaml
+++ b/config.yaml
@@ -132,11 +132,12 @@ options:
132 description: >132 description: >
133 Override default ciphers used for TLS/SSL termination (OpenSSL format).133 Override default ciphers used for TLS/SSL termination (OpenSSL format).
134 worker_connections:134 worker_connections:
135 default: 768135 default: 0
136 type: int136 type: int
137 description: >137 description: >
138 Sets the maximum number of simultaneous connections that can be138 Sets the maximum number of simultaneous connections that can be
139 opened by an Nginx worker process.139 opened by an Nginx worker process.
140 Defaults to auto-calculate (0), which is (number of sites * max_connections / worker_processes).
140 worker_processes:141 worker_processes:
141 default: 0142 default: 0
142 type: int143 type: int
diff --git a/lib/haproxy.py b/lib/haproxy.py
index 5153d97..814bc89 100644
--- a/lib/haproxy.py
+++ b/lib/haproxy.py
@@ -339,7 +339,8 @@ backend backend-{name}
339339
340 return rendered_output340 return rendered_output
341341
342 def _calculate_num_procs_threads(self, num_procs, num_threads):342 @classmethod
343 def calculate_num_procs_threads(self, num_procs, num_threads):
343 if num_procs and num_threads:344 if num_procs and num_threads:
344 ver = utils.package_version('haproxy')345 ver = utils.package_version('haproxy')
345 # With HAProxy 2, nbproc and nbthreads are mutually exclusive.346 # With HAProxy 2, nbproc and nbthreads are mutually exclusive.
@@ -359,7 +360,7 @@ backend backend-{name}
359 return (num_procs, num_threads)360 return (num_procs, num_threads)
360361
361 def render(self, config, num_procs=None, num_threads=None, monitoring_password=None, tls_cipher_suites=None):362 def render(self, config, num_procs=None, num_threads=None, monitoring_password=None, tls_cipher_suites=None):
362 (num_procs, num_threads) = self._calculate_num_procs_threads(num_procs, num_threads)363 (num_procs, num_threads) = self.calculate_num_procs_threads(num_procs, num_threads)
363364
364 listen_stanzas = self.render_stanza_listen(config)365 listen_stanzas = self.render_stanza_listen(config)
365366
diff --git a/reactive/content_cache.py b/reactive/content_cache.py
index 15cf56d..5cc47df 100644
--- a/reactive/content_cache.py
+++ b/reactive/content_cache.py
@@ -7,6 +7,7 @@ import time
7from copy import deepcopy7from copy import deepcopy
88
9import jinja29import jinja2
10import multiprocessing
10import yaml11import yaml
1112
12from charms import reactive13from charms import reactive
@@ -199,6 +200,17 @@ def configure_nginx(conf_path=None):
199200
200 connections = config['worker_connections']201 connections = config['worker_connections']
201 processes = config['worker_processes']202 processes = config['worker_processes']
203 # Auto-calculate worker_connections
204 nb_sites = len(sites.keys())
205 (haproxy_proc, haproxy_thread) = HAProxy.calculate_num_procs_threads(None, None)
206 if config['max_connections'] == 0:
207 haproxy_connections
208 if processes == 0:
209 nb_processes = multiprocessing.cpu_count()
210 else:
211 nb_processes = processes
212 if connections == 0:
213 connections = nb_sites * haproxy_max_connections / nb_processes
202 if ngx_conf.sync_sites(sites.keys()) or ngx_conf.set_workers(connections, processes):214 if ngx_conf.sync_sites(sites.keys()) or ngx_conf.set_workers(connections, processes):
203 hookenv.log('Enabled sites: {}'.format(' '.join(sites.keys())))215 hookenv.log('Enabled sites: {}'.format(' '.join(sites.keys())))
204 changed = True216 changed = True
diff --git a/tests/unit/test_content_cache.py b/tests/unit/test_content_cache.py
index b8de692..59afe21 100644
--- a/tests/unit/test_content_cache.py
+++ b/tests/unit/test_content_cache.py
@@ -1423,10 +1423,12 @@ site1.local:
1423 'enable_cache_background_update': False,1423 'enable_cache_background_update': False,
1424 'enable_cache_lock': False,1424 'enable_cache_lock': False,
1425 'enable_prometheus_metrics': True,1425 'enable_prometheus_metrics': True,
1426 'max_connections': 0,
1426 'metrics_listen_address': '127.0.0.2',1427 'metrics_listen_address': '127.0.0.2',
1427 'reuseport': True,1428 'reuseport': True,
1428 'sites': ngx_config,1429 'sites': ngx_config,
1429 'worker_connections': 768,1430 # 'worker_connections': 768,
1431 'worker_connections': 0,
1430 'worker_processes': 0,1432 'worker_processes': 0,
1431 }1433 }
14321434
@@ -1437,7 +1439,8 @@ site1.local:
1437 os.mkdir(os.path.join(self.tmpdir, 'conf.d'))1439 os.mkdir(os.path.join(self.tmpdir, 'conf.d'))
1438 os.mkdir(os.path.join(self.tmpdir, 'sites-available'))1440 os.mkdir(os.path.join(self.tmpdir, 'sites-available'))
1439 os.mkdir(os.path.join(self.tmpdir, 'sites-enabled'))1441 os.mkdir(os.path.join(self.tmpdir, 'sites-enabled'))
1440 shutil.copyfile('tests/unit/files/nginx.conf', os.path.join(self.tmpdir, 'nginx.conf'))1442 nginx_conf = os.path.join(self.tmpdir, 'nginx.conf')
1443 shutil.copyfile('tests/unit/files/nginx.conf', nginx_conf)
14411444
1442 opened_ports.return_value = ['80/tcp', '{0}/tcp'.format(nginx.METRICS_PORT)]1445 opened_ports.return_value = ['80/tcp', '{0}/tcp'.format(nginx.METRICS_PORT)]
1443 content_cache.configure_nginx(self.tmpdir)1446 content_cache.configure_nginx(self.tmpdir)
@@ -1451,3 +1454,6 @@ site1.local:
1451 with open(test_file, 'r', encoding='utf-8') as f:1454 with open(test_file, 'r', encoding='utf-8') as f:
1452 got = f.read()1455 got = f.read()
1453 self.assertEqual(got, want)1456 self.assertEqual(got, want)
1457 with open(nginx_conf, 'r', encoding='utf-8') as f:
1458 self.assertRegex(f.read(), r'.*worker_connections = '
1459 assert nginx
diff --git a/tests/unit/test_nginx.py b/tests/unit/test_nginx.py
index 2734123..6e6f209 100644
--- a/tests/unit/test_nginx.py
+++ b/tests/unit/test_nginx.py
@@ -4,6 +4,8 @@ import sys
4import tempfile4import tempfile
5import unittest5import unittest
66
7from unittest import mock
8
7import jinja29import jinja2
8import yaml10import yaml
911
@@ -20,6 +22,10 @@ class TestLibNginx(unittest.TestCase):
20 self.tmpdir = tempfile.mkdtemp(prefix='charm-unittests-')22 self.tmpdir = tempfile.mkdtemp(prefix='charm-unittests-')
21 self.addCleanup(shutil.rmtree, self.tmpdir)23 self.addCleanup(shutil.rmtree, self.tmpdir)
22 self.charm_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))24 self.charm_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
25 patcher = mock.patch('multiprocessing.cpu_count')
26 self.mock_cpu_count = patcher.start()
27 self.addCleanup(patcher.stop)
28 self.mock_cpu_count.return_value = 4
2329
24 def test_nginx_config_conf_path(self):30 def test_nginx_config_conf_path(self):
25 conf_path = '/etc/nginx/conf.d'31 conf_path = '/etc/nginx/conf.d'

Subscribers

People subscribed via source and target branches