From 3ece35c0a607cc6cd2f2fa18c5d10c215b1833a6 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Thu, 16 Feb 2017 17:07:21 +0100 Subject: [PATCH] Reassemble postgresql parameters when major version became known (#395) * Reassemble postgresql parameters when major version became known Otherwise we were writing some "unknown" parameters into postgresql.conf and postgres was refusing to start. Only 9.3 was affected. In addition to that move rename of wal_level from hot_standby to replica into get_server_parameters method. Now this rename is handled in a single place. * Bump etcd and consul versions --- .travis.yml | 2 +- patroni/postgresql.py | 10 +++++----- tests/test_postgresql.py | 5 ++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6613e551..3be05f05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ python: - "3.4" # 2.7 and 3.5 are preinstalled by default env: global: - - ETCDVERSION=3.0.15 ZKVERSION=3.4.9 CONSULVERSION=0.7.2 + - ETCDVERSION=3.0.17 ZKVERSION=3.4.9 CONSULVERSION=0.7.4 - PYVERSIONS="2.7 3.4 3.5" matrix: - TEST_SUITE="python setup.py" diff --git a/patroni/postgresql.py b/patroni/postgresql.py index c8366dbe..5781b61c 100644 --- a/patroni/postgresql.py +++ b/patroni/postgresql.py @@ -177,6 +177,8 @@ class Postgresql(object): parameters.pop('synchronous_standby_names', None) else: parameters['synchronous_standby_names'] = self._synchronous_standby_names + if self._major_version >= 9.6 and parameters['wal_level'] == 'hot_standby': + parameters['wal_level'] = 'replica' return {k: v for k, v in parameters.items() if not self._major_version or self._major_version >= self.CMDLINE_OPTIONS.get(k, (0, 1, 9.1))[2]} @@ -249,8 +251,6 @@ class Postgresql(object): elif r[0] in changes: unit = changes['wal_segment_size'] if r[0] in ('min_wal_size', 'max_wal_size') else r[2] new_value = changes.pop(r[0]) - if self._major_version >= 9.6 and r[0] == 'wal_level' and new_value == 'hot_standby': - new_value = 'replica' if new_value is None or not compare_values(r[3], unit, r[1], new_value): if r[4] == 'postmaster': pending_restart = True @@ -435,6 +435,7 @@ class Postgresql(object): if ret: self.write_pg_hba(config.get('pg_hba', [])) self._major_version = self.get_major_version() + self._server_parameters = self.get_server_parameters(self.config) else: self.set_state('initdb failed') return ret @@ -697,9 +698,7 @@ class Postgresql(object): self._write_postgresql_conf() self.resolve_connection_addresses() - opts = {p: self._server_parameters[p] for p, v in self.CMDLINE_OPTIONS.items() if self._major_version >= v[2]} - if self._major_version >= 9.6 and opts['wal_level'] == 'hot_standby': - opts['wal_level'] = 'replica' + opts = {p: self._server_parameters[p] for p in self.CMDLINE_OPTIONS if p in self._server_parameters} options = ['--{0}={1}'.format(p, v) for p, v in opts.items()] start_initiated = time.time() @@ -1209,6 +1208,7 @@ $$""".format(name, ' '.join(options)), name, password, password) ret = self.create_replica(clone_member) == 0 if ret: self._major_version = self.get_major_version() + self._server_parameters = self.get_server_parameters(self.config) self.delete_trigger_file() self.restore_configuration_files() return ret diff --git a/tests/test_postgresql.py b/tests/test_postgresql.py index b044acef..7f83b909 100644 --- a/tests/test_postgresql.py +++ b/tests/test_postgresql.py @@ -41,8 +41,7 @@ class MockCursor(object): ('search_path', 'public', None, 'string', 'user'), ('port', '5433', None, 'integer', 'postmaster'), ('listen_addresses', '*', None, 'string', 'postmaster'), - ('autovacuum', 'on', None, 'bool', 'sighup'), - ('wal_level', 'replica', None, 'enum', 'postmaster')] + ('autovacuum', 'on', None, 'bool', 'sighup')] else: self.results = [(None, None, None, None, None, None, None, None, None, None)] @@ -766,7 +765,7 @@ class TestPostgresql(unittest.TestCase): self.assertEquals(value_in_conf(), None) def test_get_server_parameters(self): - config = {'synchronous_mode': True, 'parameters': {}, 'listen': '0'} + config = {'synchronous_mode': True, 'parameters': {'wal_level': 'hot_standby'}, 'listen': '0'} self.p.get_server_parameters(config) self.p.set_synchronous_standby('foo') self.p.get_server_parameters(config)