Fix pg_rewind on typical Debian/Ubuntu systems (#2225)

On Debian/Ubuntu systems it is common to keep Postgres config files outside of the data directory.
It created a couple of problems for pg_rewind support in Patroni.
1. The `--config_file` argument must be supplied while figuring out the `restore_command` GUC value on Postgres v12+
2. With Postgres v13+ pg_rewind by itself can't find postgresql.conf in order to figure out `restore_command` and therefore we have to use Patroni as a fallback for fetching missing WAL's that are required for rewind.

This commit addresses both problems.
This commit is contained in:
Gunnar "Nick" Bluth
2022-03-24 13:56:16 +01:00
committed by GitHub
parent 81912c9cae
commit 7626b5fef8
2 changed files with 10 additions and 3 deletions
+2 -1
View File
@@ -798,7 +798,8 @@ class Postgresql(object):
return True
def get_guc_value(self, name):
cmd = [self.pgcommand('postgres'), '-D', self._data_dir, '-C', name]
cmd = [self.pgcommand('postgres'), '-D', self._data_dir, '-C', name,
'--config-file={}'.format(self.config.postgresql_conf)]
try:
data = subprocess.check_output(cmd)
if data:
+8 -2
View File
@@ -311,8 +311,14 @@ class Rewind(object):
restore_command = self._postgresql.config.get('recovery_conf', {}).get('restore_command') \
if self._postgresql.major_version < 120000 else self._postgresql.get_guc_value('restore_command')
# currently, pg_rewind expects postgresql.conf to be inside $PGDATA, which is not the case on e.g. Debian
# Fix this logic if e.g. PG15 receives an update for pg_rewind:
pg_rewind_can_restore = self._postgresql.major_version >= 130000 \
and restore_command \
and self._postgresql.config._config_dir == self._postgresql.data_dir
cmd = [self._postgresql.pgcommand('pg_rewind')]
if self._postgresql.major_version >= 130000 and restore_command:
if pg_rewind_can_restore:
cmd.append('--restore-target-wal')
cmd.extend(['-D', self._postgresql.data_dir, '--source-server', dsn])
@@ -329,7 +335,7 @@ class Rewind(object):
if ret == 0:
return True
if not restore_command or self._postgresql.major_version >= 130000:
if not restore_command or pg_rewind_can_restore:
return False
missing_wal = self._find_missing_wal(results['stderr']) or self._find_missing_wal(results['stdout'])