regression in Patroni 1.6.{1-3} where setting restore_command in postgresql.conf no longer worked.
81 lines
5.1 KiB
Diff
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))
|