patroni/debian/patches/v12_fix_recovery.conf_parameters.patch
Michael Banck 9d00847de6 * debian/patches/v12_fix_recovery.conf_parameters.patch: New patch, fixes a
regression in Patroni 1.6.{1-3} where setting restore_command in
    postgresql.conf no longer worked.
2019-12-18 14:56:08 +01:00

81 lines
5.1 KiB
Diff

From ce56ca4d2924407fd4a11a6aea5c77d3c61e18af Mon Sep 17 00:00:00 2001
From: Alexander Kukushkin <alexander.kukushkin@zalando.de>
Date: Fri, 13 Dec 2019 16:50:14 +0100
Subject: [PATCH] Allow certain recovery parameters be defined in the
custom_conf
Fixes https://github.com/zalando/patroni/issues/1333
---
patroni/postgresql/config.py | 10 ++++++++--
tests/test_postgresql.py | 9 ++++++---
2 files changed, 14 insertions(+), 5 deletions(-)
Index: patroni/patroni/postgresql/config.py
===================================================================
--- patroni.orig/patroni/postgresql/config.py
+++ patroni/patroni/postgresql/config.py
@@ -564,7 +564,7 @@ class ConfigHandler(object):
try:
values = self._get_pg_settings(self._recovery_parameters_to_compare).values()
- values = {p[0]: [p[1], p[4] == 'postmaster'] for p in values}
+ values = {p[0]: [p[1], p[4] == 'postmaster', p[5]] for p in values}
self._postgresql_conf_mtime = pg_conf_mtime
self._auto_conf_mtime = auto_conf_mtime
self._postmaster_ctime = postmaster_ctime
@@ -673,6 +673,12 @@ class ConfigHandler(object):
wanted_recovery_params = self.build_recovery_params(member)
for param, value in self._current_recovery_params.items():
+ # Skip certain parameters defined in the included postgres config files
+ # if we know that they are not specified in the patroni configuration.
+ if len(value) > 2 and value[2] not in (self._postgresql_conf, self._auto_conf) and \
+ param in ('archive_cleanup_command', 'promote_trigger_file', 'recovery_end_command',
+ 'recovery_min_apply_delay', 'restore_command') and param not in wanted_recovery_params:
+ continue
if param == 'recovery_min_apply_delay':
if not compare_values('integer', 'ms', value[0], wanted_recovery_params.get(param, 0)):
record_missmatch(value[1])
@@ -842,7 +848,7 @@ class ConfigHandler(object):
self._postgresql.set_connection_kwargs(self.local_connect_kwargs)
def _get_pg_settings(self, names):
- return {r[0]: r for r in self._postgresql.query(('SELECT name, setting, unit, vartype, context '
+ return {r[0]: r for r in self._postgresql.query(('SELECT name, setting, unit, vartype, context, sourcefile'
+ ' FROM pg_catalog.pg_settings ' +
' WHERE pg_catalog.lower(name) = ANY(%s)'),
[n.lower() for n in names])}
Index: patroni/tests/test_postgresql.py
===================================================================
--- patroni.orig/tests/test_postgresql.py
+++ patroni/tests/test_postgresql.py
@@ -206,14 +206,16 @@ class TestPostgresql(BaseTestPostgresql)
@patch('patroni.postgresql.config.ConfigHandler._get_pg_settings')
def test_check_recovery_conf(self, mock_get_pg_settings):
mock_get_pg_settings.return_value = {
- 'primary_conninfo': ['primary_conninfo', 'foo=', None, 'string', 'postmaster'],
- 'recovery_min_apply_delay': ['recovery_min_apply_delay', '0', 'ms', 'integer', 'sighup']
+ 'primary_conninfo': ['primary_conninfo', 'foo=', None, 'string', 'postmaster', self.p.config._auto_conf],
+ 'recovery_min_apply_delay': ['recovery_min_apply_delay', '0', 'ms', 'integer', 'sighup', 'foo']
}
self.assertEqual(self.p.config.check_recovery_conf(None), (True, True))
self.p.config.write_recovery_conf({'standby_mode': 'on'})
self.assertEqual(self.p.config.check_recovery_conf(None), (True, True))
mock_get_pg_settings.return_value['primary_conninfo'][1] = ''
mock_get_pg_settings.return_value['recovery_min_apply_delay'][1] = '1'
+ self.assertEqual(self.p.config.check_recovery_conf(None), (False, False))
+ mock_get_pg_settings.return_value['recovery_min_apply_delay'][5] = self.p.config._auto_conf
self.assertEqual(self.p.config.check_recovery_conf(None), (True, False))
mock_get_pg_settings.return_value['recovery_min_apply_delay'][1] = '0'
self.assertEqual(self.p.config.check_recovery_conf(None), (False, False))
@@ -234,7 +236,8 @@ class TestPostgresql(BaseTestPostgresql)
@patch.object(MockPostmaster, 'create_time', Mock(return_value=1234567), create=True)
@patch('patroni.postgresql.config.ConfigHandler._get_pg_settings')
def test__read_recovery_params(self, mock_get_pg_settings):
- mock_get_pg_settings.return_value = {'primary_conninfo': ['primary_conninfo', '', None, 'string', 'postmaster']}
+ mock_get_pg_settings.return_value = {'primary_conninfo': ['primary_conninfo', '', None, 'string',
+ 'postmaster', self.p.config._postgresql_conf]}
self.p.config.write_recovery_conf({'standby_mode': 'on', 'primary_conninfo': {'password': 'foo'}})
self.p.config.write_postgresql_conf()
self.assertEqual(self.p.config.check_recovery_conf(None), (False, False))