Merge lp:~james-page/charm-helpers/percona-tuning-level into lp:charm-helpers

Proposed by James Page
Status: Merged
Merged at revision: 702
Proposed branch: lp:~james-page/charm-helpers/percona-tuning-level
Merge into: lp:charm-helpers
Diff against target: 147 lines (+121/-1)
2 files modified
charmhelpers/contrib/database/mysql.py (+27/-1)
tests/contrib/database/test_mysql.py (+94/-0)
To merge this branch: bzr merge lp:~james-page/charm-helpers/percona-tuning-level
Reviewer Review Type Date Requested Status
Charles Butler (community) Approve
Review via email: mp+318755@code.launchpad.net

Description of the change

Add parsing of tuning-level configuration option if detected.

To post a comment you must log in.
702. By James Page

Add other innodb config options and associated unit tests

Revision history for this message
Charles Butler (lazypower) wrote :

+1 LGTM

I see there are passing tests using this branch here: https://review.openstack.org/#/c/440333

and a big +1 to having tests with the branch. Thanks for the contribution

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'charmhelpers/contrib/database/mysql.py'
2--- charmhelpers/contrib/database/mysql.py 2017-02-28 12:04:36 +0000
3+++ charmhelpers/contrib/database/mysql.py 2017-03-02 11:55:48 +0000
4@@ -336,6 +336,21 @@
5 DEFAULT_INNODB_BUFFER_FACTOR = 0.50
6 DEFAULT_INNODB_BUFFER_SIZE_MAX = 512 * 1024 * 1024
7
8+ # Validation and lookups for InnoDB configuration
9+ INNODB_VALID_BUFFERING_VALUES = [
10+ 'none',
11+ 'inserts',
12+ 'deletes',
13+ 'changes',
14+ 'purges',
15+ 'all'
16+ ]
17+ INNODB_FLUSH_CONFIG_VALUES = {
18+ 'fast': 2,
19+ 'safest': 1,
20+ 'unsafe': 0,
21+ }
22+
23 def human_to_bytes(self, human):
24 """Convert human readable configuration options to bytes."""
25 num_re = re.compile('^[0-9]+$')
26@@ -399,7 +414,18 @@
27 mysql_config['wait_timeout'] = config['wait-timeout']
28
29 if 'innodb-flush-log-at-trx-commit' in config:
30- mysql_config['innodb_flush_log_at_trx_commit'] = config['innodb-flush-log-at-trx-commit']
31+ mysql_config['innodb_flush_log_at_trx_commit'] = \
32+ config['innodb-flush-log-at-trx-commit']
33+ elif 'tuning-level' in config:
34+ mysql_config['innodb_flush_log_at_trx_commit'] = \
35+ self.INNODB_FLUSH_CONFIG_VALUES.get(config['tuning-level'], 1)
36+
37+ if ('innodb-change-buffering' in config and
38+ config['innodb-change-buffering'] in self.INNODB_VALID_BUFFERING_VALUES):
39+ mysql_config['innodb_change_buffering'] = config['innodb-change-buffering']
40+
41+ if 'innodb-io-capacity' in config:
42+ mysql_config['innodb_io_capacity'] = config['innodb-io-capacity']
43
44 # Set a sane default key_buffer size
45 mysql_config['key_buffer'] = self.human_to_bytes('32M')
46
47=== modified file 'tests/contrib/database/test_mysql.py'
48--- tests/contrib/database/test_mysql.py 2017-02-24 16:57:44 +0000
49+++ tests/contrib/database/test_mysql.py 2017-03-02 11:55:48 +0000
50@@ -301,3 +301,97 @@
51 self.assertEqual(
52 mysql_config.get('wait_timeout'),
53 timeout)
54+
55+ @mock.patch.object(mysql.PerconaClusterHelper, 'get_mem_total')
56+ @mock.patch.object(mysql, 'config_get')
57+ @mock.patch.object(mysql, 'log')
58+ def test_parse_config_tuning_level(self, mog,
59+ config, mem):
60+ mem.return_value = "512M"
61+ config.return_value = {
62+ 'tuning-level': 'safest',
63+ }
64+
65+ helper = mysql.PerconaClusterHelper()
66+ mysql_config = helper.parse_config()
67+
68+ self.assertEqual(
69+ mysql_config.get('innodb_flush_log_at_trx_commit'),
70+ 1
71+ )
72+
73+ @mock.patch.object(mysql.PerconaClusterHelper, 'get_mem_total')
74+ @mock.patch.object(mysql, 'config_get')
75+ @mock.patch.object(mysql, 'log')
76+ def test_parse_config_tuning_level_fast(self, mog,
77+ config, mem):
78+ mem.return_value = "512M"
79+ config.return_value = {
80+ 'tuning-level': 'fast',
81+ }
82+
83+ helper = mysql.PerconaClusterHelper()
84+ mysql_config = helper.parse_config()
85+
86+ self.assertEqual(
87+ mysql_config.get('innodb_flush_log_at_trx_commit'),
88+ 2
89+ )
90+
91+ @mock.patch.object(mysql.PerconaClusterHelper, 'get_mem_total')
92+ @mock.patch.object(mysql, 'config_get')
93+ @mock.patch.object(mysql, 'log')
94+ def test_parse_config_tuning_level_unsafe(self, mog,
95+ config, mem):
96+ mem.return_value = "512M"
97+ config.return_value = {
98+ 'tuning-level': 'unsafe',
99+ }
100+
101+ helper = mysql.PerconaClusterHelper()
102+ mysql_config = helper.parse_config()
103+
104+ self.assertEqual(
105+ mysql_config.get('innodb_flush_log_at_trx_commit'),
106+ 0
107+ )
108+
109+ @mock.patch.object(mysql.PerconaClusterHelper, 'get_mem_total')
110+ @mock.patch.object(mysql, 'config_get')
111+ @mock.patch.object(mysql, 'log')
112+ def test_parse_config_innodb_valid_values(self, mog,
113+ config, mem):
114+ mem.return_value = "512M"
115+ config.return_value = {
116+ 'innodb-change-buffering': 'all',
117+ 'innodb-io-capacity': 100,
118+ }
119+
120+ helper = mysql.PerconaClusterHelper()
121+ mysql_config = helper.parse_config()
122+
123+ self.assertEqual(
124+ mysql_config.get('innodb_change_buffering'),
125+ 'all'
126+ )
127+
128+ self.assertEqual(
129+ mysql_config.get('innodb_io_capacity'),
130+ 100
131+ )
132+
133+ @mock.patch.object(mysql.PerconaClusterHelper, 'get_mem_total')
134+ @mock.patch.object(mysql, 'config_get')
135+ @mock.patch.object(mysql, 'log')
136+ def test_parse_config_innodb_invalid_values(self, mog,
137+ config, mem):
138+ mem.return_value = "512M"
139+ config.return_value = {
140+ 'innodb-change-buffering': 'invalid',
141+ }
142+
143+ helper = mysql.PerconaClusterHelper()
144+ mysql_config = helper.parse_config()
145+
146+ self.assertTrue('innodb_change_buffering' not in mysql_config)
147+ self.assertTrue('innodb_io_capacity' not in mysql_config)

Subscribers

People subscribed via source and target branches