From 6e82de8751773b7effb041723ba08d8527618f2f Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Fri, 15 Sep 2023 11:32:49 +0200 Subject: [PATCH] Don't rely on pg_stat_wal_receiver when deciding on pg_rewind (#2863) As was reported by @ants on Slack it could happen that `received_tli` is ahead of replayed timeline, therefore we should stop using it when deciding on pg_rewind if postgres is running and use only `IDENTIFY_SYSTEM` via replication connection. --- patroni/postgresql/rewind.py | 2 +- tests/test_rewind.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/patroni/postgresql/rewind.py b/patroni/postgresql/rewind.py index 270d629c..6d8590ee 100644 --- a/patroni/postgresql/rewind.py +++ b/patroni/postgresql/rewind.py @@ -158,7 +158,7 @@ class Rewind(object): def _get_local_timeline_lsn(self) -> Tuple[Optional[bool], Optional[int], Optional[int]]: if self._postgresql.is_running(): # if postgres is running - get timeline from replication connection in_recovery = True - timeline = self._postgresql.received_timeline() or self._postgresql.get_replica_timeline() + timeline = self._postgresql.get_replica_timeline() lsn = self._postgresql.replayed_location() else: # otherwise analyze pg_controldata output in_recovery, timeline, lsn = self._get_local_timeline_lsn_from_controldata() diff --git a/tests/test_rewind.py b/tests/test_rewind.py index f40c46af..108713f3 100644 --- a/tests/test_rewind.py +++ b/tests/test_rewind.py @@ -93,7 +93,7 @@ class TestRewind(BaseTestPostgresql): with patch.object(Postgresql, 'is_running', Mock(return_value=True)), \ patch.object(MockCursor, 'fetchone', - Mock(side_effect=[(0, 0, 1, 1, 0, 0, 0, 0, 0, None, None, None), Exception])): + Mock(side_effect=[Exception, (0, 0, 1, 1, 0, 0, 0, 0, 0, None, None, None)])): self.r.rewind_or_reinitialize_needed_and_possible(self.leader) @patch.object(CancellableSubprocess, 'call', mock_cancellable_call)